[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [metrics-lib/master] Document all public parts using Javadoc.
commit 6d05ae95e968806351892b09f7b9653ff82879ed
Author: Karsten Loesing <karsten.loesing@xxxxxxx>
Date: Fri May 20 11:40:35 2016 +0200
Document all public parts using Javadoc.
Based in parts on very helpful suggestions and feedback by iwakeh.
Implements #16873.
---
CHANGELOG.md | 2 +
build.xml | 18 +
resources/overview.html | 69 +++
.../torproject/descriptor/BandwidthHistory.java | 46 +-
.../descriptor/BridgeExtraInfoDescriptor.java | 20 +-
.../torproject/descriptor/BridgeNetworkStatus.java | 114 +++-
.../descriptor/BridgePoolAssignment.java | 40 +-
.../descriptor/BridgeServerDescriptor.java | 19 +-
src/org/torproject/descriptor/Descriptor.java | 32 +-
.../torproject/descriptor/DescriptorCollector.java | 52 +-
.../descriptor/DescriptorDownloader.java | 205 +++++--
src/org/torproject/descriptor/DescriptorFile.java | 70 ++-
.../descriptor/DescriptorParseException.java | 9 +-
.../torproject/descriptor/DescriptorParser.java | 46 +-
.../torproject/descriptor/DescriptorReader.java | 146 ++++-
.../torproject/descriptor/DescriptorRequest.java | 91 ++-
.../descriptor/DescriptorSourceFactory.java | 128 +++-
src/org/torproject/descriptor/DirSourceEntry.java | 81 ++-
.../descriptor/DirectoryKeyCertificate.java | 98 ++-
.../torproject/descriptor/DirectorySignature.java | 43 +-
src/org/torproject/descriptor/ExitList.java | 76 ++-
src/org/torproject/descriptor/ExitListEntry.java | 48 +-
.../torproject/descriptor/ExtraInfoDescriptor.java | 670 +++++++++++++++------
.../ImplementationNotAccessibleException.java | 10 +-
src/org/torproject/descriptor/Microdescriptor.java | 130 +++-
.../torproject/descriptor/NetworkStatusEntry.java | 169 ++++--
src/org/torproject/descriptor/RelayDirectory.java | 93 ++-
.../descriptor/RelayExtraInfoDescriptor.java | 16 +-
.../torproject/descriptor/RelayNetworkStatus.java | 156 ++++-
.../descriptor/RelayNetworkStatusConsensus.java | 181 +++++-
.../descriptor/RelayNetworkStatusVote.java | 342 +++++++++--
.../descriptor/RelayServerDescriptor.java | 15 +-
.../torproject/descriptor/RouterStatusEntry.java | 43 +-
.../torproject/descriptor/ServerDescriptor.java | 436 ++++++++++----
src/org/torproject/descriptor/TorperfResult.java | 194 ++++--
src/org/torproject/descriptor/package-info.java | 80 +++
36 files changed, 3208 insertions(+), 780 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a1b9a75..bfd4755 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,8 @@
implementation classes.
- Actually return the signing key digest in network status votes.
- Parse crypto parts in network status votes.
+ - Document all public parts in org.torproject.descriptor and add
+ an Ant target to generate Javadocs.
* Minor changes
- Include a Torperf results line with more than one unrecognized
diff --git a/build.xml b/build.xml
index f7ef7ca..129c4ed 100644
--- a/build.xml
+++ b/build.xml
@@ -1,7 +1,9 @@
<project default="jar" name="descriptor" basedir=".">
<property name="release.version" value="1.1.0-dev" />
<property name="sources" value="src"/>
+ <property name="resources" value="resources"/>
<property name="classes" value="classes"/>
+ <property name="docs" value="javadoc"/>
<property name="tests" value="test"/>
<property name="libs" value="lib"/>
<property name="jarfile" value="descriptor-${release.version}.jar" />
@@ -25,6 +27,7 @@
<target name="clean" >
<delete includeEmptyDirs="true">
<fileset dir="${classes}" defaultexcludes="false" includes="**" />
+ <fileset dir="${docs}" defaultexcludes="false" includes="**" />
</delete>
<delete file="${jarfile}"/>
<delete file="${jarsourcesfile}"/>
@@ -33,6 +36,7 @@
<target name="init">
<mkdir dir="${classes}"/>
+ <mkdir dir="${docs}"/>
</target>
<target name="compile"
@@ -50,6 +54,20 @@
</javac>
</target>
+ <target name="docs">
+ <javadoc destdir="${docs}"
+ footer="&copy; 2016 The Tor Project"
+ doctitle="DescripTor API Documentation"
+ overview="${basedir}/${resources}/overview.html"
+ use="true"
+ windowtitle="DescripTor API Documentation">
+ <classpath refid="classpath"/>
+ <fileset dir="${sources}">
+ <exclude name="**/impl/**"/>
+ </fileset>
+ </javadoc>
+ </target>
+
<target name="test" depends="compile">
<javac destdir="${classes}"
srcdir="${tests}"
diff --git a/resources/overview.html b/resources/overview.html
new file mode 100644
index 0000000..f5c6b51
--- /dev/null
+++ b/resources/overview.html
@@ -0,0 +1,69 @@
+<html>
+<body>
+<p>DescripTor API, which is provided and supported by Tor's Metrics
+Team, is a library to obtain and process descriptors containing Tor
+network data. It is the main Java tool for processing Tor descriptors
+and provides a standard API consisting of interfaces and a reference
+implementation for all of them.</p>
+
+<p>Most Tor descriptors understood by this library are specified in the
+<a href="https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt">Tor
+directory protocol, version 3</a> or in the earlier
+<a href="https://gitweb.torproject.org/torspec.git/tree/attic/dir-spec-v2.txt">version 2</a> or
+<a href="https://gitweb.torproject.org/torspec.git/tree/attic/dir-spec-v1.txt">version 1</a>
+of that document.
+Other descriptors are specified on the
+<a href="https://collector.torproject.org/">CollecTor website</a>.</p>
+
+<p>The interfaces in
+<a href="./org/torproject/descriptor/package-summary.html">{@code org.torproject.descriptor}</a>
+as well as their implementations in the
+{@code org.torproject.descriptor.impl} package were driven by two main
+goals originating from the primary use case to make Tor network data
+accessible for statistical analysis:</p>
+
+<ul>
+<li><em>Complete coverage:</em> This library is supposed to cover the
+complete range of Tor descriptors made available by the
+<a href="https://collector.torproject.org">CollecTor</a> service.</li>
+<li><em>Runtime and memory efficiency:</em> Processing large amounts of
+descriptors in bulk is supposed to be efficient in terms of runtime and
+required memory.</li>
+</ul>
+
+<p>At the same time the current design and implementation were done with a
+number of non-goals in mind, even though some of these might turn into
+goals in the future:</p>
+
+<p><ul>
+<li><em>Verification:</em> The descriptor parser performs some basic
+verifications of descriptor formats, but no cryptographic verifications.
+It may not even be possible to write a cryptographic verification tool
+using parsed descriptor contents, though this has not been attempted
+yet.</li>
+<li><em>Potentially lossy conversion:</em> Descriptor contents may be
+converted to a format that is easier to process, even if that conversion
+makes it harder or impossible to re-create the original descriptor
+contents from a parsed descriptor.</li>
+<li><em>Generating descriptors:</em> This library does not contain any
+functionality to generate new descriptors for testing or related purposes,
+neither from previously set data nor randomly.</li>
+<li><em>Writing descriptors:</em> This library does not support writing
+descriptors to the file system or a database, both of which are left to
+the application. Stated differently, there are no descriptor sinks that
+would correspond to the provided descriptor sources.</li>
+</ul></p>
+
+<p>Hints about using DescripTor can be found in the
+<a href="./org/torproject/descriptor/package-summary.html#package.description">{@code org.torproject.descriptor} package description</a>.
+</p>
+
+<p>Contact and further information:
+<ul>
+<li><a href="https://trac.torproject.org/projects/tor/query?status=!closed&component=Metrics%2Fmetrics-lib">DescripTor Bug Tracker</a></li>
+<li><a href="https://lists.torproject.org/cgi-bin/mailman/listinfo/metrics-team">Metrics Team Mailing List</a></li>
+<li><a href="https://trac.torproject.org/projects/tor/wiki/org/teams/MetricsTeam">Metrics Team Website</a></li>
+</ul>
+</body>
+</html>
+
diff --git a/src/org/torproject/descriptor/BandwidthHistory.java b/src/org/torproject/descriptor/BandwidthHistory.java
index 4431ee2..0be1a53 100644
--- a/src/org/torproject/descriptor/BandwidthHistory.java
+++ b/src/org/torproject/descriptor/BandwidthHistory.java
@@ -1,26 +1,52 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.SortedMap;
-/* Contains the bandwidth history of a relay or bridge. */
+/**
+ * Contains the bandwidth history of a relay or bridge.
+ *
+ * <p>A bandwidth history is not a descriptor type of its own but usually
+ * part of extra-info descriptors ({@link ExtraInfoDescriptor}) or server
+ * descriptors ({@link ServerDescriptor}).</p>
+ *
+ * @since 1.0.0
+ */
public interface BandwidthHistory {
- /* Return the original bandwidth history line as contained in the
- * descriptor, possibly prefixed with "opt ". */
+ /**
+ * Return the original bandwidth history line as contained in the
+ * descriptor, possibly prefixed with {@code "opt "}.
+ *
+ * @since 1.0.0
+ */
public String getLine();
- /* Return the end of the most recent interval in millis. */
+ /**
+ * Return the time in milliseconds since the epoch when the most recent
+ * interval ends.
+ *
+ * @since 1.0.0
+ */
public long getHistoryEndMillis();
- /* Return the interval length in seconds, which is typically 900 seconds
- * or 15 minutes. */
+ /**
+ * Return the interval length in seconds.
+ *
+ * @since 1.0.0
+ */
public long getIntervalLength();
- /* Return the (possibly empty) bandwidth history with map keys being
- * interval ends in millis and map values being number of bytes used in
- * the interval, ordered from oldest to newest interval. */
+ /**
+ * Return the (possibly empty) bandwidth history with map keys being
+ * times in milliseconds since the epoch when intervals end and map
+ * values being number of bytes used in the interval, ordered from
+ * oldest to newest interval.
+ *
+ * @since 1.0.0
+ */
public SortedMap<Long, Long> getBandwidthValues();
}
diff --git a/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java b/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java
index b566283..a3c168d 100644
--- a/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java
+++ b/src/org/torproject/descriptor/BridgeExtraInfoDescriptor.java
@@ -1,8 +1,24 @@
-/* Copyright 2015 The Tor Project
+/* Copyright 2015--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
-/* Contains a bridge extra-info descriptor. */
+/**
+ * Contains a sanitized bridge extra-info descriptor.
+ *
+ * <p>Sanitized bridge extra-info descriptors share many contents with
+ * relay extra-info descriptors ({@link RelayExtraInfoDescriptor}), which
+ * is why they share a common
+ * superinterface ({@link ExtraInfoDescriptor}). The main purpose of
+ * having two subinterfaces is being able to distinguish descriptor types
+ * more easily.</p>
+ *
+ * <p>Details about sanitizing bridge extra-info descriptors can be found
+ * <a href="https://collector.torproject.org/#type-bridge-extra-info">here</a>.
+ * </p>
+ *
+ * @since 1.1.0
+ */
public interface BridgeExtraInfoDescriptor extends ExtraInfoDescriptor {
}
diff --git a/src/org/torproject/descriptor/BridgeNetworkStatus.java b/src/org/torproject/descriptor/BridgeNetworkStatus.java
index 1a28ebf..c7458fd 100644
--- a/src/org/torproject/descriptor/BridgeNetworkStatus.java
+++ b/src/org/torproject/descriptor/BridgeNetworkStatus.java
@@ -1,62 +1,128 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.SortedMap;
+/**
+ * Contains a sanitized bridge network status document.
+ *
+ * <p>The bridge directory authority periodically publishes a network
+ * status document with one entry per known bridge in the network
+ * ({@link NetworkStatusEntry}) containing: a hash of its identity key, a
+ * hash of its most recent server descriptor, and a summary of what the
+ * bridge authority believed about its status.</p>
+ *
+ * <p>The main purpose of this document is to get an authoritative list of
+ * running bridges to the bridge distribution service BridgeDB.</p>
+ *
+ * <p>Details about sanitizing bridge network statuses can be found
+ * <a href="https://collector.torproject.org/#type-bridge-network-status">here</a>.
+ * </p>
+ *
+ * @since 1.0.0
+ */
public interface BridgeNetworkStatus extends Descriptor {
- /* Return the published time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * was published.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the minimum uptime in seconds that this authority requires for
- * assigning the Stable flag, or -1 if the authority doesn't report this
- * value. */
+ /**
+ * Return the minimum uptime in seconds that this authority requires
+ * for assigning the Stable flag, or -1 if the authority doesn't report
+ * this value.
+ *
+ * @since 1.1.0
+ */
public long getStableUptime();
- /* Return the minimum MTBF (mean time between failure) that this
+ /**
+ * Return the minimum MTBF (mean time between failure) that this
* authority requires for assigning the Stable flag, or -1 if the
- * authority doesn't report this value. */
+ * authority doesn't report this value.
+ *
+ * @since 1.1.0
+ */
public long getStableMtbf();
- /* Return the minimum bandwidth that this authority requires for
+ /**
+ * Return the minimum bandwidth that this authority requires for
* assigning the Fast flag, or -1 if the authority doesn't report this
- * value. */
+ * value.
+ *
+ * @since 1.1.0
+ */
public long getFastBandwidth();
- /* Return the minimum WFU (weighted fractional uptime) in percent that
- * this authority requires for assigning the Guard flag, or -1.0 if the
- * authority doesn't report this value. */
+ /**
+ * Return the minimum WFU (weighted fractional uptime) in percent that
+ * this authority requires for assigning the Guard flag, or -1 if the
+ * authority doesn't report this value.
+ *
+ * @since 1.1.0
+ */
public double getGuardWfu();
- /* Return the minimum weighted time in seconds that this authority needs
- * to know about a relay before assigning the Guard flag, or -1 if the
- * authority doesn't report this information. */
+ /**
+ * Return the minimum weighted time in seconds that this authority
+ * needs to know about a relay before assigning the Guard flag, or -1 if
+ * the authority doesn't report this information.
+ *
+ * @since 1.1.0
+ */
public long getGuardTk();
- /* Return the minimum bandwidth that this authority requires for
+ /**
+ * Return the minimum bandwidth that this authority requires for
* assigning the Guard flag if exits can be guards, or -1 if the
- * authority doesn't report this value. */
+ * authority doesn't report this value.
+ *
+ * @since 1.1.0
+ */
public long getGuardBandwidthIncludingExits();
- /* Return the minimum bandwidth that this authority requires for
+ /**
+ * Return the minimum bandwidth that this authority requires for
* assigning the Guard flag if exits can not be guards, or -1 if the
- * authority doesn't report this value. */
+ * authority doesn't report this value.
+ *
+ * @since 1.1.0
+ */
public long getGuardBandwidthExcludingExits();
- /* Return 1 if the authority has measured enough MTBF info to use the
+ /**
+ * Return 1 if the authority has measured enough MTBF info to use the
* MTBF requirement instead of the uptime requirement for assigning the
* Stable flag, 0 if not, or -1 if the authority doesn't report this
- * information. */
+ * information.
+ *
+ * @since 1.1.0
+ */
public int getEnoughMtbfInfo();
- /* Return 1 if the authority has enough measured bandwidths that it'll
+ /**
+ * Return 1 if the authority has enough measured bandwidths that it'll
* ignore the advertised bandwidth claims of routers without measured
* bandwidth, 0 if not, or -1 if the authority doesn't report this
- * information. */
+ * information.
+ *
+ * @since 1.1.0
+ */
public int getIgnoringAdvertisedBws();
- /* Return status entries, one for each contained bridge. */
+ /**
+ * Return status entries for each contained bridge, with map keys being
+ * SHA-1 digests of SHA-1 digest of the bridges' public identity keys,
+ * encoded as 40 upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, NetworkStatusEntry> getStatusEntries();
}
diff --git a/src/org/torproject/descriptor/BridgePoolAssignment.java b/src/org/torproject/descriptor/BridgePoolAssignment.java
index 5186b2b..2de4ee9 100644
--- a/src/org/torproject/descriptor/BridgePoolAssignment.java
+++ b/src/org/torproject/descriptor/BridgePoolAssignment.java
@@ -1,17 +1,47 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.SortedMap;
+/**
+ * Contains a sanitized list of bridges together with the distribution
+ * pools they have been assigned to by the bridge distribution service
+ * BridgeDB.
+ *
+ * <p>BridgeDB receives bridge network statuses
+ * ({@link BridgeNetworkStatus}) from the bridge authority, assigns these
+ * bridges to persistent distribution rings, and hands them out to bridge
+ * users. BridgeDB periodically dumps the list of running bridges with
+ * information about the rings, subrings, and file buckets to which they
+ * are assigned to a local file.</p>
+ *
+ * <p>Details about sanitizing bridge pool assignments can be found
+ * <a href="https://collector.torproject.org/#type-bridge-pool-assignment">here</a>.
+ * </p>
+ *
+ * @since 1.0.0
+ */
public interface BridgePoolAssignment extends Descriptor {
- /* Return the publication time of this bridge pool assignment list. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * was published.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the entries contained in this bridge pool assignment list with
- * map keys being bridge fingerprints and map values being assignment
- * strings, e.g. "https ring=3 flag=stable". */
+ /**
+ * Return the entries contained in this bridge pool assignment list
+ * with map keys being SHA-1 digests of SHA-1 digest of the bridges'
+ * public identity keys, encoded as 40 upper-case hexadecimal
+ * characters, and map values being assignment strings, e.g.
+ * {@code "https ring=3 flag=stable"}.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, String> getEntries();
}
diff --git a/src/org/torproject/descriptor/BridgeServerDescriptor.java b/src/org/torproject/descriptor/BridgeServerDescriptor.java
index 15b618a..7d4503f 100644
--- a/src/org/torproject/descriptor/BridgeServerDescriptor.java
+++ b/src/org/torproject/descriptor/BridgeServerDescriptor.java
@@ -1,8 +1,23 @@
-/* Copyright 2015 The Tor Project
+/* Copyright 2015--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
-/* Contains a bridge server descriptor. */
+/**
+ * Contains a sanitized bridge server descriptor.
+ *
+ * <p>Sanitized bridge server descriptors share many contents with relay
+ * server descriptors ({@link RelayServerDescriptor}), which is why they
+ * share a common superinterface ({@link ServerDescriptor}). The main
+ * purpose of having two subinterfaces is being able to distinguish
+ * descriptor types more easily.</p>
+ *
+ * <p>Details about sanitizing bridge server descriptors can be found
+ * <a href="https://collector.torproject.org/#type-bridge-server-descriptor">here</a>.
+ * </p>
+ *
+ * @since 1.1.0
+ */
public interface BridgeServerDescriptor extends ServerDescriptor {
}
diff --git a/src/org/torproject/descriptor/Descriptor.java b/src/org/torproject/descriptor/Descriptor.java
index 267caf1..7cad109 100644
--- a/src/org/torproject/descriptor/Descriptor.java
+++ b/src/org/torproject/descriptor/Descriptor.java
@@ -1,21 +1,39 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
-/* Store meta-data about how a descriptor was downloaded or read from
- * disk. */
+/**
+ * Superinterface for any descriptor with access to generic information
+ * about the descriptor.
+ *
+ * @since 1.0.0
+ */
public interface Descriptor {
- /* Return the raw descriptor bytes. */
+ /**
+ * Return the raw descriptor bytes.
+ *
+ * @since 1.0.0
+ */
public byte[] getRawDescriptorBytes();
- /* Return the (possibly empty) list of annotations. */
+ /**
+ * Return the (possibly empty) list of annotations in the format
+ * {@code "@key( value)*"}.
+ *
+ * @since 1.0.0
+ */
public List<String> getAnnotations();
- /* Return any unrecognized lines when parsing this descriptor, or an
- * empty list if there were no unrecognized lines. */
+ /**
+ * Return any unrecognized lines when parsing this descriptor, or an
+ * empty list if there were no unrecognized lines.
+ *
+ * @since 1.0.0
+ */
public List<String> getUnrecognizedLines();
}
diff --git a/src/org/torproject/descriptor/DescriptorCollector.java b/src/org/torproject/descriptor/DescriptorCollector.java
index 18e594d..b1027dc 100644
--- a/src/org/torproject/descriptor/DescriptorCollector.java
+++ b/src/org/torproject/descriptor/DescriptorCollector.java
@@ -1,12 +1,39 @@
-/* Copyright 2015 The Tor Project
+/* Copyright 2015--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.io.File;
-/** Fetch descriptors from the CollecTor service available at
- * https://collector.torproject.org/ and store them to a local
- * directory. */
+/**
+ * Descriptor source that synchronizes descriptors from the CollecTor
+ * service to a given local directory.
+ *
+ * <p>This type is not a descriptor source in the proper sense, because it
+ * does not produce descriptors by itself. But it often creates the
+ * prerequisites for reading descriptors from disk using
+ * {@link DescriptorReader}.</p>
+ *
+ * <p>Code sample:</p>
+ * <pre>{@code
+ * DescriptorCollector descriptorCollector =
+ * DescriptorSourceFactory.createDescriptorCollector();
+ * descriptorCollector.collectDescriptors(
+ * // Download from Tor's main CollecTor instance,
+ * "https://collector.torproject.org",
+ * // include network status consensuses and relay server descriptors
+ * new String[] { "/recent/relay-descriptors/consensuses/",
+ * "/recent/relay-descriptors/server-descriptors/" },
+ * // regardless of last-modified time,
+ * 0L,
+ * // write to the local directory called in/,
+ * new File("in"),
+ * // and delete extraneous files that do not exist remotely anymore.
+ * true);
+ * }</pre>
+ *
+ * @since 1.0.0
+ */
public interface DescriptorCollector {
/**
@@ -15,17 +42,18 @@ public interface DescriptorCollector {
* anymore.
*
* @param collecTorBaseUrl CollecTor base URL without trailing slash,
- * e.g., "https://collector.torproject.org".
+ * e.g., {@code "https://collector.torproject.org"}
* @param remoteDirectories Remote directories to collect descriptors
- * from, e.g., "/recent/relay-descriptors/server-descriptors/". Only
- * files in this directory will be collected, no files in its sub
- * directories.
+ * from, e.g.,
+ * {@code "/recent/relay-descriptors/server-descriptors/"}, without
+ * processing subdirectories unless they are explicitly listed
* @param minLastModified Minimum last-modified time in milliseconds of
- * files to be collected. Set to 0 for collecting all files.
- * @param localDirectory Directory where collected files will be
- * written.
+ * files to be collected, or 0 for collecting all files
+ * @param localDirectory Directory where collected files will be written
* @param deleteExtraneousLocalFiles Whether to delete all local files
- * that do not exist remotely anymore.
+ * that do not exist remotely anymore
+ *
+ * @since 1.0.0
*/
public void collectDescriptors(String collecTorBaseUrl,
String[] remoteDirectories, long minLastModified,
diff --git a/src/org/torproject/descriptor/DescriptorDownloader.java b/src/org/torproject/descriptor/DescriptorDownloader.java
index 1fc68a0..f0b1101 100644
--- a/src/org/torproject/descriptor/DescriptorDownloader.java
+++ b/src/org/torproject/descriptor/DescriptorDownloader.java
@@ -1,109 +1,198 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.Iterator;
import java.util.Set;
-/* Download relay descriptors from directory mirrors or authorities. */
+/**
+ * Descriptor source that downloads relay descriptors from directory
+ * authorities or mirrors.
+ *
+ * <p>Downloading descriptors is done in a batch which starts after
+ * setting any configuration options and initiating the download
+ * process.</p>
+ *
+ * @since 1.0.0
+ */
public interface DescriptorDownloader {
- /* Add a directory authority to download descriptors from. A directory
- * authority is only required for downloading network status vote and
- * will be used when no directory mirrors are available. */
+ /**
+ * Add a directory authority to download descriptors from, which is
+ * only required for downloading network status votes and will be used
+ * when no directory mirrors are available.
+ *
+ * @since 1.0.0
+ */
public void addDirectoryAuthority(String nickname, String ip,
int dirPort);
- /* Add a directory mirror to download descriptors from. Directory
- * mirrors are preferred when downloading descriptors, except for
- * network status votes which are only available on directory
- * authorities. */
+ /**
+ * Add a directory mirror to download descriptors from, which is
+ * preferred for downloading descriptors, except for network status
+ * votes which are only available on directory authorities.
+ *
+ * @since 1.0.0
+ */
public void addDirectoryMirror(String nickname, String ip, int dirPort);
- /* Include the current network status consensus in the downloads. */
+ /**
+ * Include the current network status consensus in the downloads.
+ *
+ * @since 1.0.0
+ */
public void setIncludeCurrentConsensus();
- /* Include the current network status consensus in the downloads, and
- * attempt to download it from all directory authorities. The primary
- * purpose of doing this is to compare different consensuses and
- * download characteristics to each other. Typically, downloading from
- * a single directory mirror or authority is sufficient. */
+ /**
+ * Include the current network status consensus in the downloads, and
+ * attempt to download it from all directory authorities.
+ *
+ * <p>The primary purpose of doing this is to compare different
+ * consensuses and download characteristics to each other. Typically,
+ * downloading from a single directory mirror or authority is
+ * sufficient.</p>
+ *
+ * @since 1.0.0
+ */
public void setIncludeCurrentConsensusFromAllDirectoryAuthorities();
- /* Include the current network status votes referenced from a previously
- * downloaded consensus in the downloads. This requires downloading the
- * current consensus from at least one directory mirror or authority. */
+ /**
+ * Include the current network status votes referenced from a
+ * previously downloaded consensus in the downloads, which requires
+ * downloading the current consensus from at least one directory mirror
+ * or authority.
+ *
+ * @since 1.0.0
+ */
public void setIncludeCurrentReferencedVotes();
- /* Include the current network status vote published by the given
- * directory authority in the downloads. This requires downloading from
- * at least one directory authority. */
+ /**
+ * Include the current network status vote published by the given
+ * directory authority in the downloads, which requires downloading from
+ * at least one directory authority.
+ *
+ * @since 1.0.0
+ */
public void setIncludeCurrentVote(String fingerprint);
- /* Include the current network status votes published by the given
- * directory authorities in the downloads. This requires downloading
- * from at least one directory authority. */
+ /**
+ * Include the current network status votes published by the given
+ * directory authorities in the downloads, which requires downloading
+ * from at least one directory authority.
+ *
+ * @since 1.0.0
+ */
public void setIncludeCurrentVotes(Set<String> fingerprints);
- /* Include all server descriptors referenced from a previously
- * downloaded network status consensus in the downloads. */
+ /**
+ * Include all server descriptors referenced from a previously
+ * downloaded network status consensus in the downloads.
+ *
+ * @since 1.0.0
+ */
public void setIncludeReferencedServerDescriptors();
- /* Exclude the server descriptor with the given identifier from the
+ /**
+ * Exclude the server descriptor with the given identifier from the
* downloads even if it's referenced from a consensus and we're supposed
- * to download all referenced server descriptors. */
+ * to download all referenced server descriptors.
+ *
+ * @since 1.0.0
+ */
public void setExcludeServerDescriptor(String identifier);
- /* Exclude the server descriptors with the given identifiers from the
+ /**
+ * Exclude the server descriptors with the given identifiers from the
* downloads even if they are referenced from a consensus and we're
- * supposed to download all referenced server descriptors. */
+ * supposed to download all referenced server descriptors.
+ *
+ * @since 1.0.0
+ */
public void setExcludeServerDescriptors(Set<String> identifier);
- /* Include all extra-info descriptors referenced from previously
- * downloaded server descriptors in the downloads. */
+ /**
+ * Include all extra-info descriptors referenced from previously
+ * downloaded server descriptors in the downloads.
+ *
+ * @since 1.0.0
+ */
public void setIncludeReferencedExtraInfoDescriptors();
- /* Exclude the extra-info descriptor with the given identifier from the
+ /**
+ * Exclude the extra-info descriptor with the given identifier from the
* downloads even if it's referenced from a server descriptor and we're
- * supposed to download all referenced extra-info descriptors. */
+ * supposed to download all referenced extra-info descriptors.
+ *
+ * @since 1.0.0
+ */
public void setExcludeExtraInfoDescriptor(String identifier);
- /* Exclude the extra-info descriptors with the given identifiers from
+ /**
+ * Exclude the extra-info descriptors with the given identifiers from
* the downloads even if they are referenced from server descriptors
* and we're supposed to download all referenced extra-info
- * descriptors. */
+ * descriptors.
+ *
+ * @since 1.0.0
+ */
public void setExcludeExtraInfoDescriptors(Set<String> identifiers);
- /* Define a connect timeout for a single request. If a timeout expires,
- * no further requests will be sent to the directory authority or
- * mirror. Setting this value to 0 disables the connect timeout.
- * Default value is 1 minute (60 * 1000). */
+ /**
+ * Define a connect timeout for a single request.
+ *
+ * <p>If a timeout expires, no further requests will be sent to the
+ * directory authority or mirror. Setting this value to 0 disables the
+ * connect timeout. Default value is 1 minute (60 * 1000).</p>
+ *
+ * @since 1.0.0
+ */
public void setConnectTimeout(long connectTimeoutMillis);
- /* Define a read timeout for a single request. If a timeout expires,
- * no further requests will be sent to the directory authority or
- * mirror. Setting this value to 0 disables the read timeout.
- * Default value is 1 minute (60 * 1000). */
+ /**
+ * Define a read timeout for a single request.
+ *
+ * <p>If a timeout expires, no further requests will be sent to the
+ * directory authority or mirror. Setting this value to 0 disables the
+ * read timeout. Default value is 1 minute (60 * 1000).</p>
+ *
+ * @since 1.0.0
+ */
public void setReadTimeout(long readTimeoutMillis);
- /* Define a global timeout for all requests. Once this timeout expires,
- * all running requests are aborted and no further requests are made.
- * Setting this value to 0 disables the global timeout. Default is 1
- * hour (60 * 60 * 1000). */
+ /**
+ * Define a global timeout for all requests.
+ *
+ * <p>Once this timeout expires, all running requests are aborted and no
+ * further requests are made. Setting this value to 0 disables the
+ * global timeout. Default is 1 hour (60 * 60 * 1000).</p>
+ *
+ * @since 1.0.0
+ */
public void setGlobalTimeout(long globalTimeoutMillis);
- /* Fail descriptor parsing when encountering an unrecognized line. This
- * is not set by default, because the Tor specifications allow for new
- * lines to be added that shall be ignored by older Tor versions. But
- * some applications may want to handle unrecognized descriptor lines
- * explicitly. */
+ /**
+ * Fail descriptor parsing when encountering an unrecognized line.
+ *
+ * <p>This option is not set by default, because the Tor specifications
+ * allow for new lines to be added that shall be ignored by older Tor
+ * versions. But some applications may want to handle unrecognized
+ * descriptor lines explicitly.</p>
+ *
+ * @since 1.0.0
+ */
public void setFailUnrecognizedDescriptorLines();
- /* Download the previously configured relay descriptors and make them
- * available via the returned blocking iterator. Whenever the
- * downloader runs out of descriptors and expects to provide more
- * shortly after, it blocks the caller. This method can only be run
- * once. */
+ /**
+ * Download the previously configured relay descriptors and make them
+ * available via the returned blocking iterator.
+ *
+ * <p>Whenever the downloader runs out of descriptors and expects to
+ * provide more shortly after, it blocks the caller. This method can
+ * only be run once.</p>
+ *
+ * @since 1.0.0
+ */
public Iterator<DescriptorRequest> downloadDescriptors();
}
diff --git a/src/org/torproject/descriptor/DescriptorFile.java b/src/org/torproject/descriptor/DescriptorFile.java
index ec012ca..417d7f9 100644
--- a/src/org/torproject/descriptor/DescriptorFile.java
+++ b/src/org/torproject/descriptor/DescriptorFile.java
@@ -1,39 +1,77 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.io.File;
import java.util.List;
-/* Store meta-data about a descriptor file and a list of the contained
- * descriptors. */
+/**
+ * Container for descriptors read from a file.
+ *
+ * <p>When the {@link DescriptorReader} reads descriptors from local files
+ * it provides an iterator over these containers which in turn contain
+ * references to classes implementing the {@link Descriptor} interface.
+ * This container also stores potentially useful meta-data about the
+ * descriptor file.</p>
+ *
+ * @since 1.0.0
+ */
public interface DescriptorFile {
- /* Return the directory where this descriptor file was contained, or
- * null if the file was contained in a tarball. */
+ /**
+ * Return the directory where this descriptor file was contained, or
+ * null if the file was contained in a tarball.
+ *
+ * @since 1.0.0
+ */
public File getDirectory();
- /* Return the tarball where this descriptor file was contained, or null
- * if the file was not contained in a tarball. */
+ /**
+ * Return the tarball where this descriptor file was contained, or null
+ * if the file was not contained in a tarball.
+ *
+ * @since 1.0.0
+ */
public File getTarball();
- /* Return the descriptor file itself, or null if the descriptor file was
- * contained in a tarball. */
+ /**
+ * Return the descriptor file itself, or null if the descriptor file
+ * was contained in a tarball.
+ *
+ * @since 1.0.0
+ */
public File getFile();
- /* Return the descriptor file name, which is either the absolute path of
- * the file on disk, or the tar file entry name. */
+ /**
+ * Return the descriptor file name, which is either the absolute path
+ * of the file on disk, or the tar file entry name.
+ *
+ * @since 1.0.0
+ */
public String getFileName();
- /* Return the time in millis when the descriptor file on disk was last
- * modified. */
+ /**
+ * Return the time in milliseconds since the epoch when the descriptor
+ * file on disk was last modified.
+ *
+ * @since 1.0.0
+ */
public long getLastModified();
- /* Return the descriptors contained in the descriptor file. */
+ /**
+ * Return the descriptors contained in the descriptor file.
+ *
+ * @since 1.0.0
+ */
public List<Descriptor> getDescriptors();
- /* Return the first exception that was thrown when reading this file or
- * parsing its content, or null if no exception was thrown. */
+ /**
+ * Return the first exception that was thrown when reading this file or
+ * parsing its content, or null if no exception was thrown.
+ *
+ * @since 1.0.0
+ */
public Exception getException();
}
diff --git a/src/org/torproject/descriptor/DescriptorParseException.java b/src/org/torproject/descriptor/DescriptorParseException.java
index ff5707d..309d3f7 100644
--- a/src/org/torproject/descriptor/DescriptorParseException.java
+++ b/src/org/torproject/descriptor/DescriptorParseException.java
@@ -1,7 +1,14 @@
-/* Copyright 2014--2015 The Tor Project
+/* Copyright 2014--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
+/**
+ * Thrown if raw descriptor contents cannot be parsed to one or more
+ * {@link Descriptor} instances, according to descriptor specifications.
+ *
+ * @since 1.0.0
+ */
@SuppressWarnings("deprecation")
public class DescriptorParseException
extends org.torproject.descriptor.impl.DescriptorParseException {
diff --git a/src/org/torproject/descriptor/DescriptorParser.java b/src/org/torproject/descriptor/DescriptorParser.java
index 7c59cea..680b8b2 100644
--- a/src/org/torproject/descriptor/DescriptorParser.java
+++ b/src/org/torproject/descriptor/DescriptorParser.java
@@ -1,25 +1,47 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
-
-/* Parse descriptors that are already in memory instead of using the
- * descriptor reader or downloader. */
+/**
+ * Descriptor source that parses descriptors from raw descriptor contents.
+ *
+ * <p>Unlike most of the other descriptor sources this descriptor source
+ * does not operate in a batch-processing mode. It takes the raw
+ * descriptor contents of one or more descriptors, parses them, and
+ * returns a list of descriptors.</p>
+ *
+ * <p>This descriptor source is internally used by other descriptor
+ * sources but can also be used directly by applications that obtain
+ * raw descriptor contents via other means than one of the existing
+ * descriptor sources.</p>
+ *
+ * @since 1.0.0
+ */
public interface DescriptorParser {
- /* Fail descriptor parsing when encountering an unrecognized line. This
- * is not set by default, because the Tor specifications allow for new
- * lines to be added that shall be ignored by older Tor versions. But
- * some applications may want to handle unrecognized descriptor lines
- * explicitly. */
+ /**
+ * Fail descriptor parsing when encountering an unrecognized line.
+ *
+ * <p>This option is not set by default, because the Tor specifications
+ * allow for new lines to be added that shall be ignored by older Tor
+ * versions. But some applications may want to handle unrecognized
+ * descriptor lines explicitly.</p>
+ *
+ * @since 1.0.0
+ */
public void setFailUnrecognizedDescriptorLines(
boolean failUnrecognizedDescriptorLines);
- /* Parse descriptors in the given byte array, possibly parsing the
- * publication time from the file name (depending on the descriptor
- * type). */
+ /**
+ * Parse descriptors in the given byte array, possibly parsing the
+ * publication time from the file name, depending on the descriptor
+ * type.
+ *
+ * @since 1.0.0
+ */
public List<Descriptor> parseDescriptors(byte[] rawDescriptorBytes,
String fileName) throws DescriptorParseException;
}
diff --git a/src/org/torproject/descriptor/DescriptorReader.java b/src/org/torproject/descriptor/DescriptorReader.java
index 0e2fe27..771755e 100644
--- a/src/org/torproject/descriptor/DescriptorReader.java
+++ b/src/org/torproject/descriptor/DescriptorReader.java
@@ -1,63 +1,143 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.io.File;
import java.util.Iterator;
import java.util.SortedMap;
-/* Read descriptors from one or more local directories. */
+/**
+ * Descriptor source that reads descriptors from local files and provides
+ * an iterator over parsed descriptors.
+ *
+ * <p>This descriptor source is likely the most widely used one, possibly
+ * in combination with {@link DescriptorCollector} to synchronize
+ * descriptors from the CollecTor service.</p>
+ *
+ * <p>Reading descriptors is done in a batch which starts after setting
+ * any configuration options and initiating the read process.</p>
+ *
+ * <p>Code sample:</p>
+ * <pre>{@code
+ * DescriptorReader descriptorReader =
+ * DescriptorSourceFactory.createDescriptorReader();
+ * // Read descriptors from local directory called in/.
+ * descriptorReader.addDirectory(new File("in"));
+ * Iterator<DescriptorFile> descriptorFiles =
+ * descriptorReader.readDescriptors();
+ * while (descriptorFiles.hasNext()) {
+ * DescriptorFile descriptorFile = descriptorFiles.next();
+ * for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ * if ((descriptor instanceof RelayNetworkStatusConsensus)) {
+ * // Only process network status consensuses, ignore the rest.
+ * RelayNetworkStatusConsensus consensus =
+ * (RelayNetworkStatusConsensus) descriptor;
+ * processConsensus(consensus);
+ * }
+ * }
+ * }}</pre>
+ *
+ * @since 1.0.0
+ */
public interface DescriptorReader {
- /* Add a local directory to read descriptor files or tarballs containing
- * descriptor files from. */
+ /**
+ * Add a local directory to read descriptors from, which may contain
+ * descriptor files or tarballs containing descriptor files.
+ *
+ * @since 1.0.0
+ */
public void addDirectory(File directory);
- /* Add an uncompressed or bz2-compressed tarball to read descriptors
- * from. */
+ /**
+ * Add a tarball to read descriptors from, which may be uncompressed,
+ * bz2-compressed, or xz-compressed.
+ *
+ * @since 1.0.0
+ */
public void addTarball(File tarball);
- /* Exclude files that are contained in the given history file and that
- * haven't changed since they were last read. Add reads from the
- * current run to the history file. Remove files that don't exist
- * anymore from the history file. Lines in the history file contain the
- * last modified timestamp and the absolute path of a file. */
+ /**
+ * Exclude files that are listed in the given history file and that
+ * haven't changed since they have last been read.
+ *
+ * <p>Add a new line for each descriptor that is read in this execution
+ * and remove lines for files that don't exist anymore.</p>
+ *
+ * <p>Lines in the history file contain the last modified time in
+ * milliseconds since the epoch and the absolute path of a file.</p>
+ *
+ * @since 1.0.0
+ */
public void setExcludeFiles(File historyFile);
- /* Exclude files if they haven't changed since the corresponding last
- * modified timestamps. Can be used instead of (or in addition to) a
- * history file. */
+ /**
+ * Exclude files if they haven't changed since the corresponding last
+ * modified timestamps.
+ *
+ * <p>Can be used instead of (or in addition to) a history file.</p>
+ *
+ * @since 1.0.0
+ */
public void setExcludedFiles(SortedMap<String, Long> excludedFiles);
- /* Return files and lost modified timestamps of files that exist in the
+ /**
+ * Return files and last modified timestamps of files that exist in the
* input directory or directories, but that have been excluded from
* parsing, because they haven't changed since they were last read.
- * Can be used instead of (or in addition to) a history file when
- * combined with the set of parsed files. */
+ *
+ * <p>Can be used instead of (or in addition to) a history file when
+ * combined with the set of parsed files.</p>
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Long> getExcludedFiles();
- /* Return files and last modified timestamps of files that exist in the
- * input directory or directories and that have been parsed. Can be
- * used instead of (or in addition to) a history file when combined with
- * the set of excluded files. */
+ /**
+ * Return files and last modified timestamps of files that exist in the
+ * input directory or directories and that have been parsed.
+ *
+ * <p>Can be used instead of (or in addition to) a history file when
+ * combined with the set of excluded files.</p>
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Long> getParsedFiles();
- /* Fail descriptor parsing when encountering an unrecognized line. This
- * is not set by default, because the Tor specifications allow for new
- * lines to be added that shall be ignored by older Tor versions. But
- * some applications may want to handle unrecognized descriptor lines
- * explicitly. */
+ /**
+ * Fail descriptor parsing when encountering an unrecognized line.
+ *
+ * <p>This option is not set by default, because the Tor specifications
+ * allow for new lines to be added that shall be ignored by older Tor
+ * versions. But some applications may want to handle unrecognized
+ * descriptor lines explicitly.</p>
+ *
+ * @since 1.0.0
+ */
public void setFailUnrecognizedDescriptorLines();
- /* Don't keep more than this number of parsed descriptor files in the
- * queue. The default is 100, but if descriptor files contain hundreds
- * or even thousands of descriptors, that default may be too high. */
+ /**
+ * Don't keep more than this number of parsed descriptor files in the
+ * queue.
+ *
+ * <p>The default is 100, but if descriptor files contain hundreds or
+ * even thousands of descriptors, that default may be too high.</p>
+ *
+ * @since 1.0.0
+ */
public void setMaxDescriptorFilesInQueue(int max);
- /* Read the previously configured descriptors and make them available
- * via the returned blocking iterator. Whenever the reader runs out of
- * descriptors and expects to provide more shortly after, it blocks the
- * caller. This method can only be run once. */
+ /**
+ * Read the previously configured descriptors and make them available
+ * via the returned blocking iterator.
+ *
+ * <p>Whenever the reader runs out of descriptors and expects to provide
+ * more shortly after, it blocks the caller. This method can only be
+ * run once.</p>
+ *
+ * @since 1.0.0
+ */
public Iterator<DescriptorFile> readDescriptors();
}
diff --git a/src/org/torproject/descriptor/DescriptorRequest.java b/src/org/torproject/descriptor/DescriptorRequest.java
index 067cd1b..c36c0c0 100644
--- a/src/org/torproject/descriptor/DescriptorRequest.java
+++ b/src/org/torproject/descriptor/DescriptorRequest.java
@@ -1,47 +1,100 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
-/* Store meta-data about a descriptor request and a list of the returned
- * descriptors. */
+/**
+ * Container for descriptors downloaded from a directory authority or
+ * mirror.
+ *
+ * <p>When the {@link DescriptorDownloader} downloads descriptors from
+ * directory authorities or mirrors it provides an iterator over these
+ * containers which in turn contain references to classes implementing the
+ * {@link Descriptor} interface. This container also stores potentially
+ * useful meta-data about the descriptor request.</p>
+ *
+ * @since 1.0.0
+ */
public interface DescriptorRequest {
- /* Return the request URL that was used in this request. */
+ /**
+ * Return the request URL that was used in this request.
+ *
+ * @since 1.0.0
+ */
public String getRequestUrl();
- /* Return the nickname of the directory mirror or authority as
- * previously configured. */
+ /**
+ * Return the nickname of the directory mirror or authority as
+ * previously configured.
+ *
+ * @since 1.0.0
+ */
public String getDirectoryNickname();
- /* Return the first exception that was thrown when making this request
- * or parsing the response, or null if no exception was thrown. */
+ /**
+ * Return the first exception that was thrown when making this request
+ * or parsing the response, or null if no exception was thrown.
+ *
+ * @since 1.0.0
+ */
public Exception getException();
- /* Return the response code that the directory mirror or authority
- * returned. */
+ /**
+ * Return the response code that the directory mirror or authority
+ * returned.
+ *
+ * @since 1.0.0
+ */
public int getResponseCode();
- /* Return the time in millis when this request was started. */
+ /**
+ * Return the time in milliseconds since the epoch when this request
+ * was started.
+ *
+ * @since 1.0.0
+ */
public long getRequestStart();
- /* Return the time in millis when this request ended. */
+ /**
+ * Return the time in milliseconds since the epoch when this request
+ * ended.
+ *
+ * @since 1.0.0
+ */
public long getRequestEnd();
- /* Return whether this request ended, because the connect timeout has
- * expired. */
+ /**
+ * Return whether this request ended, because the connect timeout has
+ * expired.
+ *
+ * @since 1.0.0
+ */
public boolean connectTimeoutHasExpired();
- /* Return whether this request ended, because the read timeout has
- * expired. */
+ /**
+ * Return whether this request ended, because the read timeout has
+ * expired.
+ *
+ * @since 1.0.0
+ */
public boolean readTimeoutHasExpired();
- /* Return whether this request ended, because the global timeout for all
- * requests has expired. */
+ /**
+ * Return whether this request ended, because the global timeout for
+ * all requests has expired.
+ *
+ * @since 1.0.0
+ */
public boolean globalTimeoutHasExpired();
- /* Return the descriptors contained in the reply. */
+ /**
+ * Return the descriptors contained in the reply.
+ *
+ * @since 1.0.0
+ */
public List<Descriptor> getDescriptors();
}
diff --git a/src/org/torproject/descriptor/DescriptorSourceFactory.java b/src/org/torproject/descriptor/DescriptorSourceFactory.java
index 728c3eb..af13f39 100644
--- a/src/org/torproject/descriptor/DescriptorSourceFactory.java
+++ b/src/org/torproject/descriptor/DescriptorSourceFactory.java
@@ -1,49 +1,151 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
-/* Create descriptor source instances. */
+/**
+ * Factory for descriptor sources which in turn produce descriptors.
+ *
+ * <p>Descriptor sources are the only producers of classes implementing
+ * the {@link Descriptor} superinterface. There exist descriptor sources
+ * for obtaining remote descriptor data ({@link DescriptorDownloader} and
+ * {@link DescriptorCollector}) and descriptor sources for processing
+ * local descriptor data ({@link DescriptorReader} and
+ * {@link DescriptorParser}).</p>
+ *
+ * <p>By default, this factory returns implementations from the library's
+ * own impl package. This may be overridden by setting Java properties,
+ * though most users will simply use the default implementations.</p>
+ *
+ * <p>These properties can be used for setting the implementation:</p>
+ * <ul>
+ * <li>{@code descriptor.collector}</li>
+ * <li>{@code descriptor.downloader}</li>
+ * <li>{@code descriptor.parser}</li>
+ * <li>{@code descriptor.reader}</li>
+ * </ul>
+ *
+ * <p>Assuming the classpath contains the special implementation
+ * referenced, your application classes as well as a descriptor API jar
+ * the following is an example for using a different implementation of the
+ * descriptor downloader:</p>
+ *
+ * <p><code>
+ * java -Ddescriptor.downloader=my.special.descriptorimpl.Downloader my.app.Mainclass
+ * </code></p>
+ *
+ * @since 1.0.0
+ */
public final class DescriptorSourceFactory {
- /* default implementations */
- public final static String LOADER_DEFAULT =
+ /**
+ * Default implementation of the {@link DescriptorDownloader}
+ * descriptor source.
+ *
+ * @since 1.0.0
+ */
+ public final static String DOWNLOADER_DEFAULT =
"org.torproject.descriptor.impl.DescriptorDownloaderImpl";
+
+ /**
+ * Default implementation of the {@link DescriptorParser} descriptor
+ * source.
+ *
+ * @since 1.0.0
+ */
public final static String PARSER_DEFAULT =
"org.torproject.descriptor.impl.DescriptorParserImpl";
+
+ /**
+ * Default implementation of the {@link DescriptorReader} descriptor
+ * source.
+ *
+ * @since 1.0.0
+ */
public final static String READER_DEFAULT =
"org.torproject.descriptor.impl.DescriptorReaderImpl";
+
+ /**
+ * Default implementation of the {@link DescriptorCollector} descriptor
+ * source.
+ *
+ * @since 1.0.0
+ */
public final static String COLLECTOR_DEFAULT =
"org.torproject.descriptor.impl.DescriptorCollectorImpl";
- /* property names */
+ /**
+ * Property name for overriding the implementation of the
+ * {@link DescriptorParser} descriptor source, which is by default set
+ * to the class in {@link #PARSER_DEFAULT}.
+ *
+ * @since 1.0.0
+ */
public final static String PARSER_PROPERTY = "descriptor.parser";
+
+ /**
+ * Property name for overriding the implementation of the
+ * {@link DescriptorReader} descriptor source, which is by default set
+ * to the class in {@link #READER_DEFAULT}.
+ *
+ * @since 1.0.0
+ */
public final static String READER_PROPERTY = "descriptor.reader";
- public final static String LOADER_PROPERTY = "descriptor.downloader";
+
+ /**
+ * Property name for overriding the implementation of the
+ * {@link DescriptorDownloader} descriptor source, which is by default
+ * set to the class in {@link #DOWNLOADER_DEFAULT}.
+ *
+ * @since 1.0.0
+ */
+ public final static String DOWNLOADER_PROPERTY =
+ "descriptor.downloader";
+
+ /**
+ * Property name for overriding the implementation of the
+ * {@link DescriptorCollector} descriptor source, which is by default
+ * set to the class in {@link #COLLECTOR_DEFAULT}.
+ *
+ * @since 1.0.0
+ */
public final static String COLLECTOR_PROPERTY = "descriptor.collector";
/**
- * Create a descriptor parser.
+ * Create a new {@link DescriptorParser} by instantiating the class in
+ * {@link #PARSER_PROPERTY}.
+ *
+ * @since 1.0.0
*/
public final static DescriptorParser createDescriptorParser() {
return (DescriptorParser) retrieve(PARSER_PROPERTY);
}
/**
- * Create a descriptor reader.
+ * Create a new {@link DescriptorReader} by instantiating the class in
+ * {@link #READER_PROPERTY}.
+ *
+ * @since 1.0.0
*/
public final static DescriptorReader createDescriptorReader() {
return (DescriptorReader) retrieve(READER_PROPERTY);
}
/**
- * Create a descriptor downloader.
+ * Create a new {@link DescriptorDownloader} by instantiating the class
+ * in {@link #DOWNLOADER_PROPERTY}.
+ *
+ * @since 1.0.0
*/
public final static DescriptorDownloader createDescriptorDownloader() {
- return (DescriptorDownloader) retrieve(LOADER_PROPERTY);
+ return (DescriptorDownloader) retrieve(DOWNLOADER_PROPERTY);
}
/**
- * Create a descriptor collector.
+ * Create a new {@link DescriptorCollector} by instantiating the class
+ * in {@link #COLLECTOR_PROPERTY}.
+ *
+ * @since 1.0.0
*/
public final static DescriptorCollector createDescriptorCollector() {
return (DescriptorCollector) retrieve(COLLECTOR_PROPERTY);
@@ -57,8 +159,8 @@ public final class DescriptorSourceFactory {
case PARSER_PROPERTY:
clazzName = System.getProperty(type, PARSER_DEFAULT);
break;
- case LOADER_PROPERTY:
- clazzName = System.getProperty(type, LOADER_DEFAULT);
+ case DOWNLOADER_PROPERTY:
+ clazzName = System.getProperty(type, DOWNLOADER_DEFAULT);
break;
case READER_PROPERTY:
clazzName = System.getProperty(type, READER_DEFAULT);
diff --git a/src/org/torproject/descriptor/DirSourceEntry.java b/src/org/torproject/descriptor/DirSourceEntry.java
index da898d0..96d81ee 100644
--- a/src/org/torproject/descriptor/DirSourceEntry.java
+++ b/src/org/torproject/descriptor/DirSourceEntry.java
@@ -1,37 +1,96 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
+/**
+ * Contains details about an authority and its vote that contributed to a
+ * consensus.
+ *
+ * <p>A directory source entry is not a descriptor type of its own but is
+ * part of a network status consensus
+ * ({@link RelayNetworkStatusConsensus}).</p>
+ *
+ * @since 1.0.0
+ */
public interface DirSourceEntry {
- /* Return the raw dir-source bytes. */
+ /**
+ * Return the raw directory source entry bytes.
+ *
+ * @since 1.0.0
+ */
public byte[] getDirSourceEntryBytes();
- /* Return the directory nickname. */
+ /**
+ * Return the authority's nickname consisting of 1 to 19 alphanumeric
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the identity fingerprint. */
+ /**
+ * Return a SHA-1 digest of the authority's long-term authority
+ * identity key used for the version 3 directory protocol, encoded as
+ * 40 upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getIdentity();
- /* Return the hostname. */
+ /**
+ * Return the authority's hostname.
+ *
+ * @since 1.2.0
+ */
public String getHostname();
- /* Return the IP address. */
+ /**
+ * Return the authority's primary IPv4 address in dotted-quad format.
+ *
+ * @since 1.0.0
+ */
public String getIp();
- /* Return the DirPort. */
+ /**
+ * Return the TCP port where this authority accepts directory-related
+ * HTTP connections.
+ *
+ * @since 1.0.0
+ */
public int getDirPort();
- /* Return the ORPort. */
+ /**
+ * Return the TCP port where this authority accepts TLS connections for
+ * the main OR protocol.
+ *
+ * @since 1.0.0
+ */
public int getOrPort();
- /* Return whether the dir-source was created using a legacy key. */
+ /**
+ * Return whether this directory source entry was created using a
+ * legacy key.
+ *
+ * @since 1.0.0
+ */
public boolean isLegacy();
- /* Return the contact line. */
+ /**
+ * Return the contact information for this authority, which may contain
+ * non-ASCII characters.
+ *
+ * @since 1.0.0
+ */
public String getContactLine();
- /* Return the vote digest. */
+ /**
+ * Return the SHA-1 vote digest, encoded as 40 lower-case hexadecimal
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getVoteDigest();
}
diff --git a/src/org/torproject/descriptor/DirectoryKeyCertificate.java b/src/org/torproject/descriptor/DirectoryKeyCertificate.java
index 61986cf..07211ef 100644
--- a/src/org/torproject/descriptor/DirectoryKeyCertificate.java
+++ b/src/org/torproject/descriptor/DirectoryKeyCertificate.java
@@ -1,45 +1,109 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
+/**
+ * Contains a key certificate in the version 3 directory protocol.
+ *
+ * <p>Every directory authority in the version 3 directory protocol uses
+ * two keys: a medium-term signing key, and a long-term authority identity
+ * key. (Authorities also have a relay identity key used in their role as
+ * a relay and by earlier versions of the directory protocol.) The
+ * identity key is used from time to time to sign new key certificates
+ * containing signing keys. The contained signing key is used to sign key
+ * certificates and status documents.</p>
+ *
+ * @since 1.0.0
+ */
public interface DirectoryKeyCertificate extends Descriptor {
- /* Return the directory key certificate version. */
+ /**
+ * Return the version of this descriptor, which must be 3 or higher.
+ *
+ * @since 1.0.0
+ */
public int getDirKeyCertificateVersion();
- /* Return the IP address, or null if the certificate does not contain an
- * address. */
+ /**
+ * Return the authority's primary IPv4 address in dotted-quad format,
+ * or null if the certificate does not contain an address.
+ *
+ * @since 1.0.0
+ */
public String getAddress();
- /* Return the directory port, or -1 if the certificate does not contain
- * one. */
+ /**
+ * Return the TCP port where this authority accepts directory-related
+ * HTTP connections, or -1 if the certificate does not contain a port.
+ *
+ * @since 1.0.0
+ */
public int getPort();
- /* Return the directory identity fingerprint. */
+ /**
+ * Return a SHA-1 digest of the authority's long-term authority
+ * identity key used for the version 3 directory protocol, encoded as
+ * 40 upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getFingerprint();
- /* Return the directory identity key. */
+ /**
+ * Return the authority's identity key in PEM format.
+ *
+ * @since 1.0.0
+ */
public String getDirIdentityKey();
- /* Return the directory key certificate publication timestamp. */
+ /**
+ * Return the time in milliseconds since the epoch when the authority's
+ * signing key and this key certificate were generated.
+ *
+ * @since 1.0.0
+ */
public long getDirKeyPublishedMillis();
- /* Return the directory key certificate expiration timestamp. */
+ /**
+ * Return the time in milliseconds since the epoch after which the
+ * authority's signing key is no longer valid.
+ *
+ * @since 1.0.0
+ */
public long getDirKeyExpiresMillis();
- /* Return the directory signing key digest. */
+ /**
+ * Return the authority's signing key in PEM format.
+ *
+ * @since 1.0.0
+ */
public String getDirSigningKey();
- /* Return the signature of the directory identity key made using the
- * directory signing key, or null if the certificate does not contain
- * this signature. */
+ /**
+ * Return the signature of the authority's identity key made using the
+ * authority's signing key, or null if the certificate does not contain
+ * such a signature.
+ *
+ * @since 1.0.0
+ */
public String getDirKeyCrosscert();
- /* Return the certificate signature made using the directory identity
- * key. */
+ /**
+ * Return the certificate signature from the initial item
+ * "dir-key-certificate-version" until the final item
+ * "dir-key-certification", signed with the authority identity key.
+ *
+ * @since 1.0.0
+ */
public String getDirKeyCertification();
- /* Return the calculated certificate digest. */
+ /**
+ * Return the SHA-1 certificate digest, encoded as 40 lower-case
+ * hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getCertificateDigest();
}
diff --git a/src/org/torproject/descriptor/DirectorySignature.java b/src/org/torproject/descriptor/DirectorySignature.java
index ff706ea..8877a4e 100644
--- a/src/org/torproject/descriptor/DirectorySignature.java
+++ b/src/org/torproject/descriptor/DirectorySignature.java
@@ -1,19 +1,52 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
+/**
+ * Contains the signature of a network status consensus or vote.
+ *
+ * <p>A directory signature is not a descriptor type of its own but is
+ * part of a network status consensus
+ * ({@link RelayNetworkStatusConsensus}) or vote
+ * ({@link RelayNetworkStatusVote}).</p>
+ *
+ * @since 1.0.0
+ */
public interface DirectorySignature {
- /* Return the digest algorithm, which is "sha1" by default. */
+ /**
+ * Return the digest algorithm, which is "sha1" by default and which
+ * can be "sha256" or another digest algorithm.
+ *
+ * @since 1.0.0
+ */
public String getAlgorithm();
- /* Return the directory identity fingerprint. */
+ /**
+ * Return the SHA-1 digest of the authority's long-term identity key in
+ * the version 3 directory protocol, encoded as 40 upper-case
+ * hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getIdentity();
- /* Return the directory signing key digest. */
+ /**
+ * Return the SHA-1 digest of the authority's medium-term signing key
+ * in the version 3 directory protocol, encoded as 40 upper-case
+ * hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getSigningKeyDigest();
- /* Return the directory signature made using the signing key. */
+ /**
+ * Return the directory signature string made with the authority's
+ * identity key in the version 3 directory protocol.
+ *
+ * @since 1.0.0
+ */
public String getSignature();
}
diff --git a/src/org/torproject/descriptor/ExitList.java b/src/org/torproject/descriptor/ExitList.java
index c813a6b..2a5cb2e 100644
--- a/src/org/torproject/descriptor/ExitList.java
+++ b/src/org/torproject/descriptor/ExitList.java
@@ -1,42 +1,92 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.Map;
import java.util.Set;
-/* Exit list containing all known exit scan results at a given time. */
+/**
+ * Contains an exit list containing the IP addresses of relays that the
+ * exit list service TorDNSEL found when exiting through them.
+ *
+ * @since 1.0.0
+ */
public interface ExitList extends Descriptor {
+ /**
+ * End-of-line character expected in exit lists.
+ *
+ * @since 1.0.0
+ */
public final static String EOL = "\n";
- /* Exit list entry containing results from a single exit scan. */
+ /**
+ * Exit list entry containing results from a single exit scan.
+ *
+ * @since 1.1.0
+ */
public interface Entry {
- /* Return the scanned relay's fingerprint. */
+ /**
+ * Return the scanned relay's fingerprint, which is a SHA-1 digest of
+ * the relays's public identity key, encoded as 40 upper-case
+ * hexadecimal characters.
+ *
+ * @since 1.1.0
+ */
public String getFingerprint();
- /* Return the publication time of the scanned relay's last known
- * descriptor. */
+ /**
+ * Return the time in milliseconds since the epoch when the scanned
+ * relay's last known descriptor was published.
+ *
+ * @since 1.1.0
+ */
public long getPublishedMillis();
- /* Return the publication time of the network status that this scan
- * was based on. */
+ /**
+ * Return the time in milliseconds since the epoch when the network
+ * status that this scan was based on was published.
+ *
+ * @since 1.1.0
+ */
public long getLastStatusMillis();
- /* Return the IP addresses that were determined in the scan. */
+ /**
+ * Return the IP addresses that were determined in the scan with map
+ * keys being IPv4 addresses in dotted-quad format and map values
+ * being scan times in milliseconds since the epoch.
+ *
+ * @since 1.1.0
+ */
public Map<String, Long> getExitAddresses();
}
- /* Return the download time of the exit list. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * was downloaded.
+ *
+ * @since 1.0.0
+ */
public long getDownloadedMillis();
- /* Return the unordered set of exit scan results. */
- /* Use getEntries instead. */
+ /**
+ * Return the unordered set of exit scan results.
+ *
+ * @since 1.0.0
+ * @deprecated The {@link ExitListEntry} type has been deprecated and
+ * superseded by {@link ExitList.Entry} which is returned by
+ * {@link #getEntries()}.
+ */
@Deprecated
public Set<ExitListEntry> getExitListEntries();
- /* Return the unordered set of exit scan results. */
+ /**
+ * Return the unordered set of exit scan results.
+ *
+ * @since 1.1.0
+ */
public Set<ExitList.Entry> getEntries();
}
diff --git a/src/org/torproject/descriptor/ExitListEntry.java b/src/org/torproject/descriptor/ExitListEntry.java
index 7b69483..2a3d79f 100644
--- a/src/org/torproject/descriptor/ExitListEntry.java
+++ b/src/org/torproject/descriptor/ExitListEntry.java
@@ -1,27 +1,55 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
-/* Exit list entry containing results from a single exit scan. */
-/* Use org.torproject.descriptor.ExitList.Entry instead. */
+/**
+ * Exit list entry containing results from a single exit scan.
+ *
+ * @since 1.0.0
+ * @deprecated Superseded by {@link ExitList.Entry}.
+ */
@Deprecated
public interface ExitListEntry extends ExitList.Entry {
- /* Return the scanned relay's fingerprint. */
+ /**
+ * Return the scanned relay's fingerprint, which is a SHA-1 digest of
+ * the relays's public identity key, encoded as 40 upper-case
+ * hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getFingerprint();
- /* Return the publication time of the scanned relay's last known
- * descriptor. */
+ /**
+ * Return the time in milliseconds since the epoch when the scanned
+ * relay's last known descriptor was published.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the publication time of the network status that this scan was
- * based on. */
+ /**
+ * Return the time in milliseconds since the epoch when the network
+ * status that this scan was based on was published.
+ *
+ * @since 1.0.0
+ */
public long getLastStatusMillis();
- /* Return the IP address that was determined in the scan. */
+ /**
+ * Return the IPv4 address in dotted-quad format that was determined in
+ * the scan.
+ *
+ * @since 1.0.0
+ */
public String getExitAddress();
- /* Return the scan time. */
+ /**
+ * Return the scan time in milliseconds since the epoch.
+ *
+ * @since 1.0.0
+ */
public long getScanMillis();
}
diff --git a/src/org/torproject/descriptor/ExtraInfoDescriptor.java b/src/org/torproject/descriptor/ExtraInfoDescriptor.java
index ed0141d..49efbf3 100644
--- a/src/org/torproject/descriptor/ExtraInfoDescriptor.java
+++ b/src/org/torproject/descriptor/ExtraInfoDescriptor.java
@@ -1,322 +1,646 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
-/* Contains a relay or bridge extra-info descriptor. */
+/**
+ * Contains a relay or sanitized bridge extra-info descriptor.
+ *
+ * <p>Relays publish extra-info descriptors as an addendum to server
+ * descriptors ({@link ServerDescriptor}) to report extraneous information
+ * to the directory authorities that clients do not need to download in
+ * order to function. This information primarily consists of statistics
+ * gathered by the relay about its usage and can take up a lot of
+ * descriptor space. The separation of server descriptors and extra-info
+ * descriptors has become less relevant with the introduction of
+ * microdescriptors ({@link Microdescriptor}) that are derived from server
+ * descriptors by the directory authority and which clients download
+ * instead of server descriptors, but it persists.</p>
+ *
+ * <p>Bridges publish extra-info descriptors to the bridge authority for
+ * the same reason, to include statistics about their usage without
+ * increasing the directory protocol overhead for bridge clients. In this
+ * case, the separation of server descriptors and extra-info descriptors
+ * is slightly more relevant, because there are no microdescriptors for
+ * bridges, so that bridge clients still download server descriptors of
+ * bridges they're using. Another reason is that bridges need to include
+ * information like details of all the transports they support in their
+ * descriptors, and bridge clients using one such transport are not
+ * supposed to learn the details of the other transports.</p>
+ *
+ * <p>It's worth noting that all contents of extra-info descriptors are
+ * written and signed by relays and bridges without a third party
+ * verifying their correctness. The (bridge) directory authorities may
+ * decide to exclude dishonest servers from the network statuses they
+ * produce, but that wouldn't be reflected in extra-info descriptors.</p>
+ *
+ * @since 1.0.0
+ */
public interface ExtraInfoDescriptor extends Descriptor {
- /* Return the descriptor digest that is used to reference this
- * extra-info descriptor in a server descriptor. */
+ /**
+ * Return the SHA-1 descriptor digest, encoded as 40 lower-case (relay
+ * descriptors) or upper-case (bridge descriptors) hexadecimal
+ * characters, that is used to reference this descriptor from a server
+ * descriptor.
+ *
+ * @since 1.0.0
+ */
public String getExtraInfoDigest();
- /* Return the base64-encoded SHA-256 descriptor digest that may be used
- * to reference this extra-info descriptor in a server descriptor. */
+ /**
+ * Return the SHA-256 descriptor digest, encoded as 43 base64
+ * characters without padding characters, that may be used to reference
+ * this descriptor from a server descriptor.
+ *
+ * @since 1.1.0
+ */
public String getExtraInfoDigestSha256();
- /* Return the relay's nickname. */
+ /**
+ * Return the server's nickname consisting of 1 to 19 alphanumeric
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the relay's fingerprint. */
+ /**
+ * Return a SHA-1 digest of the server's public identity key, encoded
+ * as 40 upper-case hexadecimal characters, that is typically used to
+ * uniquely identify the server.
+ *
+ * @since 1.0.0
+ */
public String getFingerprint();
- /* Return the publication time of this descriptor. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * and the corresponding server descriptor were generated.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the read history contained in this descriptor, or null if no
- * read history is contained. */
+ /**
+ * Return the server's history of read bytes, or null if the descriptor
+ * does not contain a bandwidth history; older Tor versions included
+ * bandwidth histories in their server descriptors
+ * ({@link ServerDescriptor#getReadHistory()}).
+ *
+ * @since 1.0.0
+ */
public BandwidthHistory getReadHistory();
- /* Return the write history contained in this descriptor, or null if no
- * read history is contained. */
+ /**
+ * Return the server's history of written bytes, or null if the
+ * descriptor does not contain a bandwidth history; older Tor versions
+ * included bandwidth histories in their server descriptors
+ * ({@link ServerDescriptor#getWriteHistory()}).
+ *
+ * @since 1.0.0
+ */
public BandwidthHistory getWriteHistory();
- /* Return the SHA1 digest of the GeoIP database used by this relay, or
- * null if no GeoIP database digest is included. */
+ /**
+ * Return a SHA-1 digest of the GeoIP database file used by this server
+ * to resolve client IP addresses to country codes, encoded as 40
+ * upper-case hexadecimal characters, or null if no GeoIP database
+ * digest is included.
+ *
+ * @since 1.0.0
+ */
public String getGeoipDbDigest();
- /* Return the SHA1 digest of the GeoIPv6 database used by this relay, or
- * null if no GeoIPv6 database digest is included. */
+ /**
+ * Return a SHA-1 digest of the GeoIPv6 database file used by this
+ * server to resolve client IP addresses to country codes, encoded as 40
+ * upper-case hexadecimal characters, or null if no GeoIPv6 database
+ * digest is included.
+ *
+ * @since 1.0.0
+ */
public String getGeoip6DbDigest();
- /* Return the end of the included directory request statistics interval,
- * or -1 if no directory request statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * directory request statistics interval ended, or -1 if no such
+ * statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getDirreqStatsEndMillis();
- /* Return the interval length of the included directory request
- * statistics in seconds, or -1 if no directory request statistics are
- * included. */
+ /**
+ * Return the interval length of the included directory request
+ * statistics in seconds, or -1 if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getDirreqStatsIntervalLength();
- /* Return statistics on unique IP addresses requesting v2 network
+ /**
+ * Return statistics on unique IP addresses requesting v2 network
* statuses with map keys being country codes and map values being
* numbers of unique IP addresses rounded up to the nearest multiple of
- * 8, or null if no such statistics are included. */
+ * 8, or null if no such statistics are included (which is the case with
+ * recent Tor versions).
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV2Ips();
- /* Return statistics on unique IP addresses requesting v3 network status
- * consensuses with map keys being country codes and map values being
- * numbers of unique IP addresses rounded up to the nearest multiple of
- * 8, or null if no such statistics are included. */
+ /**
+ * Return statistics on unique IP addresses requesting v3 network
+ * status consensuses of any flavor with map keys being country codes
+ * and map values being numbers of unique IP addresses rounded up to the
+ * nearest multiple of 8, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV3Ips();
- /* Return statistics on directory requests for v2 network statuses with
+ /**
+ * Return statistics on directory requests for v2 network statuses with
* map keys being country codes and map values being request numbers
* rounded up to the nearest multiple of 8, or null if no such
- * statistics are included. */
+ * statistics are included (which is the case with recent Tor
+ * versions).
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV2Reqs();
- /* Return statistics on directory requests for v3 network status
- * consensuses with map keys being country codes and map values being
- * request numbers rounded up to the nearest multiple of 8, or null if
- * no such statistics are included. */
+ /**
+ * Return statistics on directory requests for v3 network status
+ * consensuses of any flavor with map keys being country codes and map
+ * values being request numbers rounded up to the nearest multiple of 8,
+ * or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV3Reqs();
- /* Return the share of requests for v2 network statuses that the
- * directory expects to receive from clients, or -1.0 if no such
- * statistics are included. */
+ /**
+ * Return the share of requests for v2 network statuses that the server
+ * expects to receive from clients, or -1.0 if this share is not
+ * included (which is the case with recent Tor versions).
+ *
+ * @since 1.0.0
+ */
public double getDirreqV2Share();
- /* Return the share of requests for v3 network status consensuses that
- * the directory expects to receive from clients, or -1.0 if no such
- * statistics are included. */
+ /**
+ * Return the share of requests for v3 network status consensuses of
+ * any flavor that the server expects to receive from clients, or -1.0
+ * if this share is not included (which is the case with recent Tor
+ * versions).
+ *
+ * @since 1.0.0
+ */
public double getDirreqV3Share();
- /* Return statistics on directory request responses for v2 network
+ /**
+ * Return statistics on responses to directory requests for v2 network
* statuses with map keys being response strings and map values being
* response numbers rounded up to the nearest multiple of 4, or null if
- * no such statistics are included. */
+ * no such statistics are included (which is the case with recent Tor
+ * versions).
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV2Resp();
- /* Return statistics on directory request responses for v3 network
- * status consensuses with map keys being response strings and map
- * values being response numbers rounded up to the nearest multiple of
- * 4, or null if no such statistics are included. */
+ /**
+ * Return statistics on responses to directory requests for v3 network
+ * status consensuses of any flavor with map keys being response strings
+ * and map values being response numbers rounded up to the nearest
+ * multiple of 4, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV3Resp();
- /* Return statistics on direct directory requests asking for v2 network
- * statuses with map keys being statistic keys and map values being
- * statistic values, or null if no such statistics are included. */
+ /**
+ * Return statistics on directory requests for v2 network statuses to
+ * the server's directory port with map keys being statistic keys and
+ * map values being statistic values like counts or quantiles, or null
+ * if no such statistics are included (which is the case with recent Tor
+ * versions).
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV2DirectDl();
- /* Return statistics on direct directory requests asking for v3 network
- * status consensuses with map keys being statistic keys and map
- * values being statistic values, or null if no such statistics are
- * included. */
+ /**
+ * Return statistics on directory requests for v3 network status
+ * consensuses of any flavor to the server's directory port with map
+ * keys being statistic keys and map values being statistic values like
+ * counts or quantiles, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV3DirectDl();
- /* Return statistics on tunneled directory requests asking for v2
- * network statuses with map keys being statistic keys and map values
- * being statistic values, or null if no such statistics are
- * included. */
+ /**
+ * Return statistics on directory requests for v2 network statuses
+ * tunneled through a circuit with map keys being statistic keys and map
+ * values being statistic values, or null if no such statistics are
+ * included (which is the case with recent Tor versions).
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV2TunneledDl();
- /* Return statistics on tunneled directory requests asking for v3
- * network status consensuses with map keys being statistic keys and map
- * values being statistic values, or null if no such statistics are
- * included. */
+ /**
+ * Return statistics on directory requests for v3 network status
+ * consensuses of any flavor tunneled through a circuit with map keys
+ * being statistic keys and map values being statistic values, or null
+ * if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getDirreqV3TunneledDl();
- /* Return the directory request read history contained in this
- * descriptor, or null if no directory request read history is
- * contained. */
+ /**
+ * Return the directory request read history contained in this
+ * descriptor, or null if no such history is contained.
+ *
+ * @since 1.0.0
+ */
public BandwidthHistory getDirreqReadHistory();
- /* Return the directory request write history contained in this
- * descriptor, or null if no directory request write history is
- * contained. */
+ /**
+ * Return the directory request write history contained in this
+ * descriptor, or null if no such history is contained.
+ *
+ * @since 1.0.0
+ */
public BandwidthHistory getDirreqWriteHistory();
- /* Return the end of the included entry statistics interval, or -1 if no
- * entry statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * entry statistics interval ended, or -1 if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public long getEntryStatsEndMillis();
- /* Return the interval length of the included entry statistics in
- * seconds, or -1 if no entry statistics are included. */
+ /**
+ * Return the interval length of the included entry statistics in
+ * seconds, or -1 if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getEntryStatsIntervalLength();
- /* Return statistics on client IP addresses with map keys being country
+ /**
+ * Return statistics on client IP addresses with map keys being country
* codes and map values being the number of unique IP addresses that
* have connected from that country rounded up to the nearest multiple
- * of 8, or null if no entry statistics are included. */
+ * of 8, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getEntryIps();
- /* Return the end of the included cell statistics interval, or -1 if no
- * cell statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * cell statistics interval ended, or -1 if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public long getCellStatsEndMillis();
- /* Return the interval length of the included cell statistics in
- * seconds, or -1 if no cell statistics are included. */
+ /**
+ * Return the interval length of the included cell statistics in
+ * seconds, or -1 if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getCellStatsIntervalLength();
- /* Return the mean number of processed cells per circuit by circuit
- * deciles. */
+ /**
+ * Return the mean number of processed cells per circuit by circuit
+ * decile starting with the loudest decile at index 0 and the quietest
+ * decile at index 8, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public List<Integer> getCellProcessedCells();
- /* Return the mean number of cells contained in circuit queues by
- * circuit deciles. */
+ /**
+ * Return the mean number of cells contained in circuit queues by
+ * circuit decile starting with the loudest decile at index 0 and the
+ * quietest decile at index 8, or null if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public List<Double> getCellQueuedCells();
- /* Return the mean times in milliseconds that cells spend in circuit
- * queues by circuit deciles. */
+ /**
+ * Return the mean times in milliseconds that cells spend in circuit
+ * queues by circuit decile starting with the loudest decile at index 0
+ * and the quietest decile at index 8, or null if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public List<Integer> getCellTimeInQueue();
- /* Return the mean number of circuits included in any of the cell
- * statistics deciles, or -1 if no cell statistics are included. */
+ /**
+ * Return the mean number of circuits included in any of the cell
+ * statistics deciles, or -1 if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public int getCellCircuitsPerDecile();
- /* Return the end of the included statistics interval on bi-directional
- * connection usage, or -1 if no such statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * statistics on bi-directional connection usage ended, or -1 if no such
+ * statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getConnBiDirectStatsEndMillis();
- /* Return the interval length of the included statistics on
+ /**
+ * Return the interval length of the included statistics on
* bi-directional connection usage in seconds, or -1 if no such
- * statistics are included. */
+ * statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getConnBiDirectStatsIntervalLength();
- /* Return the number of connections on which this relay read and wrote
- * less than 2 KiB/s in a 10-second interval, or -1 if no statistics on
- * bi-directional connection usage are included. */
+ /**
+ * Return the number of connections on which this server read and wrote
+ * less than 2 KiB/s in a 10-second interval, or -1 if no such
+ * statistics are included.
+ *
+ * @since 1.0.0
+ */
public int getConnBiDirectBelow();
- /* Return the number of connections on which this relay read and wrote
+ /**
+ * Return the number of connections on which this server read and wrote
* at least 2 KiB/s in a 10-second interval and at least 10 times more
- * in read direction than in write direction, or -1 if no statistics on
- * bi-directional connection usage are included. */
+ * in read direction than in write direction, or -1 if no such
+ * statistics are included.
+ *
+ * @since 1.0.0
+ */
public int getConnBiDirectRead();
- /* Return the number of connections on which this relay read and wrote
+ /**
+ * Return the number of connections on which this server read and wrote
* at least 2 KiB/s in a 10-second interval and at least 10 times more
- * in write direction than in read direction, or -1 if no statistics on
- * bi-directional connection usage are included. */
+ * in write direction than in read direction, or -1 if no such
+ * statistics are included.
+ *
+ * @since 1.0.0
+ */
public int getConnBiDirectWrite();
- /* Return the number of connections on which this relay read and wrote
+ /**
+ * Return the number of connections on which this server read and wrote
* at least 2 KiB/s in a 10-second interval but not 10 times more in
- * either direction, or -1 if no statistics on bi-directional connection
- * usage are included. */
+ * either direction, or -1 if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public int getConnBiDirectBoth();
- /* Return the end of the included exit statistics interval, or -1 if no
- * exit statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * exit statistics interval ended, or -1 if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public long getExitStatsEndMillis();
- /* Return the interval length of the included exit statistics in
- * seconds, or -1 if no exit statistics are included. */
+ /**
+ * Return the interval length of the included exit statistics in
+ * seconds, or -1 if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getExitStatsIntervalLength();
- /* Return statistics on KiB written by port with map keys being ports
- * (or "other") and map values being KiB rounded up to the next full
- * KiB, or null if no exit statistics are included. */
+ /**
+ * Return statistics on KiB written to streams exiting the Tor network
+ * by target TCP port with map keys being string representations of
+ * ports (or {@code "other"}) and map values being KiB rounded up to the
+ * next full KiB, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Long> getExitKibibytesWritten();
- /* Return statistics on KiB read by port with map keys being ports (or
- * "other") and map values being KiB rounded up to the next full KiB, or
- * null if no exit statistics are included. */
+ /**
+ * Return statistics on KiB read from streams exiting the Tor network
+ * by target TCP port with map keys being string representations of
+ * ports (or {@code "other"}) and map values being KiB rounded up to the
+ * next full KiB, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Long> getExitKibibytesRead();
- /* Return statistics on opened exit streams with map keys being ports
- * (or "other") and map values being the number of opened streams,
- * rounded up to the nearest multiple of 4, or null if no exit
- * statistics are included. */
+ /**
+ * Return statistics on opened streams exiting the Tor network by
+ * target TCP port with map keys being string representations of ports
+ * (or {@code "other"}) and map values being the number of opened
+ * streams, rounded up to the nearest multiple of 4, or null if no such
+ * statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Long> getExitStreamsOpened();
- /* Return the start of the included geoip statistics, or -1 if no geoip
- * statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * "geoip" statistics interval started, or -1 if no such statistics are
+ * included (which is the case except for very old Tor versions).
+ *
+ * @since 1.0.0
+ */
public long getGeoipStartTimeMillis();
- /* Return statistics on client IP addresses with map keys being country
- * codes and map values being the number of unique IP addresses that
- * have connected from that country rounded up to the nearest multiple
- * of 8, or null if no geoip statistics are included. */
+ /**
+ * Return statistics on the origin of client IP addresses with map keys
+ * being country codes and map values being the number of unique IP
+ * addresses that have connected from that country between the start of
+ * the statistics interval and the descriptor publication time rounded
+ * up to the nearest multiple of 8, or null if no such statistics are
+ * included (which is the case except for very old Tor versions).
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getGeoipClientOrigins();
- /* Return the end of the included bridge statistics, or -1 if no bridge
- * statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * bridge statistics interval ended, or -1 if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public long getBridgeStatsEndMillis();
- /* Return the interval length of the included bridge statistics in
- * seconds, or -1 if no bridge statistics are included. */
+ /**
+ * Return the interval length of the included bridge statistics in
+ * seconds, or -1 if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public long getBridgeStatsIntervalLength();
- /* Return statistics on client IP addresses with map keys being country
- * codes and map values being the number of unique IP addresses that
- * have connected from that country rounded up to the nearest multiple
- * of 8, or null if no bridge statistics are included. */
+ /**
+ * Return statistics on bridge client IP addresses by country with map
+ * keys being country codes and map values being the number of unique IP
+ * addresses that have connected from that country rounded up to the
+ * nearest multiple of 8, or null if no such statistics are included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getBridgeIps();
- /* Return statistics on client IP addresses with map keys being protocol
- * family, e.g., "v4" or "v6", and map values being the number of unique
- * IP addresses rounded up to the nearest multiple of 8, or null if no
- * bridge IP version statistics are included. */
+ /**
+ * Return statistics on bridge client IP addresses by IP version with
+ * map keys being protocol families, e.g., {@code "v4"} or {@code "v6"},
+ * and map values being the number of unique IP addresses rounded up to
+ * the nearest multiple of 8, or null if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getBridgeIpVersions();
- /* Return statistics on client IP addresses with map keys being
- * pluggable transport names, e.g., "obfs2" or "obfs3" for known
- * transports, "<OR>" for no transport, or "<??>" for an unknown
- * transport, and map values being the number of unique IP addresses
- * rounded up to the nearest multiple of 8, or null if no bridge IP
- * transport statistics are included. */
+ /**
+ * Return statistics on bridge client IP addresses by transport with
+ * map keys being pluggable transport names, e.g., {@code "obfs2"} or
+ * {@code "obfs3"} for known transports, {@code "<OR>"} for the default
+ * onion routing protocol, or {@code "<??>"} for an unknown transport,
+ * and map values being the number of unique IP addresses rounded up to
+ * the nearest multiple of 8, or null if no such statistics are
+ * included.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getBridgeIpTransports();
- /* Return the (possibly empty) list of transports supported by this
- * bridge. */
+ /**
+ * Return the (possibly empty) list of pluggable transports supported
+ * by this server.
+ *
+ * @since 1.0.0
+ */
public List<String> getTransports();
- /* Return the end of the included hidden-service statistics, or -1 if no
- * hidden-service statistics are included. */
+ /**
+ * Return the time in milliseconds since the epoch when the included
+ * hidden-service statistics interval ended, or -1 if no such statistics
+ * are included.
+ *
+ * @since 1.1.0
+ */
public long getHidservStatsEndMillis();
- /* Return the interval length of the included hidden-service statistics
- * in seconds, or -1 if no hidden-service statistics are included. */
+ /**
+ * Return the interval length of the included hidden-service statistics
+ * in seconds, or -1 if no such statistics are included.
+ *
+ * @since 1.1.0
+ */
public long getHidservStatsIntervalLength();
- /* Return the approximate number of RELAY cells seen in either direction
- * on a circuit after receiving and successfully processing a
- * RENDEZVOUS1 cell, or null if no hidden-service statistics are
- * included. */
+ /**
+ * Return the approximate number of RELAY cells seen in either
+ * direction on a circuit after receiving and successfully processing a
+ * RENDEZVOUS1 cell, or null if no such statistics are included.
+ *
+ * @since 1.1.0
+ */
public Double getHidservRendRelayedCells();
- /* Return the obfuscation parameters applied to the original measurement
- * value of RELAY cells seen in either direction on a circuit after
- * receiving and successfully processing a RENDEZVOUS1 cell, or null if
- * no hidden-service statistics are included.. */
+ /**
+ * Return the obfuscation parameters applied to the original
+ * measurement value of RELAY cells seen in either direction on a
+ * circuit after receiving and successfully processing a RENDEZVOUS1
+ * cell, or null if no such statistics are included.
+ *
+ * @since 1.1.0
+ */
public Map<String, Double> getHidservRendRelayedCellsParameters();
- /* Return the approximate number of unique hidden-service identities
+ /**
+ * Return the approximate number of unique hidden-service identities
* seen in descriptors published to and accepted by this hidden-service
- * directory, or null if no hidden-service statistics are included. */
+ * directory, or null if no such statistics are included.
+ *
+ * @since 1.1.0
+ */
public Double getHidservDirOnionsSeen();
- /* Return the obfuscation parameters applied to the original measurement
- * value of unique hidden-service identities seen in descriptors
- * published to and accepted by this hidden-service directory, or null
- * if no hidden-service statistics are included. */
+ /**
+ * Return the obfuscation parameters applied to the original
+ * measurement value of unique hidden-service identities seen in
+ * descriptors published to and accepted by this hidden-service
+ * directory, or null if no such statistics are included.
+ *
+ * @since 1.1.0
+ */
public Map<String, Double> getHidservDirOnionsSeenParameters();
- /* Return the signature of the PKCS1-padded extra-info descriptor
- * digest, or null if the descriptor doesn't contain a signature (which
- * is the case in sanitized bridge descriptors). */
+ /**
+ * Return the RSA-1024 signature of the PKCS1-padded descriptor digest,
+ * taken from the beginning of the router line through the newline after
+ * the router-signature line, or null if the descriptor doesn't contain
+ * a signature (which is the case in sanitized bridge descriptors).
+ *
+ * @since 1.1.0
+ */
public String getRouterSignature();
- /* Return the base64-encoded Ed25519 certificate, or null if the
- * descriptor doesn't contain one. */
+ /**
+ * Return the Ed25519 certificate in PEM format, or null if the
+ * descriptor doesn't contain one.
+ *
+ * @since 1.1.0
+ */
public String getIdentityEd25519();
- /* Return the base64-encoded Ed25519 master key, which may either be
- * parsed from the optional "master-key-ed25519" line or derived from
- * the (likewise optional) Ed25519 certificate following the
- * "identity-ed25519" line, or null if the descriptor contains neither
- * Ed25519 master key nor Ed25519 certificate. */
+ /**
+ * Return the Ed25519 master key, encoded as 43 base64 characters
+ * without padding characters, which was either parsed from the optional
+ * {@code "master-key-ed25519"} line or derived from the (likewise
+ * optional) Ed25519 certificate following the
+ * {@code "identity-ed25519"} line, or null if the descriptor contains
+ * neither Ed25519 master key nor Ed25519 certificate.
+ *
+ * @since 1.1.0
+ */
public String getMasterKeyEd25519();
- /* Return the base64-encoded Ed25519 signature of a SHA-256 digest of
- * the entire descriptor, from the first character up to and including
- * the first space after the "router-sig-ed25519" string, prefixed with
- * the string "Tor router descriptor signature v1". */
+ /**
+ * Return the Ed25519 signature of the SHA-256 digest of the entire
+ * descriptor, encoded as 86 base64 characters without padding
+ * characters, from the first character up to and including the first
+ * space after the {@code "router-sig-ed25519"} string, prefixed with
+ * the string {@code "Tor router descriptor signature v1"}.
+ *
+ * @since 1.1.0
+ */
public String getRouterSignatureEd25519();
}
diff --git a/src/org/torproject/descriptor/ImplementationNotAccessibleException.java b/src/org/torproject/descriptor/ImplementationNotAccessibleException.java
index fda3e24..c54e48f 100644
--- a/src/org/torproject/descriptor/ImplementationNotAccessibleException.java
+++ b/src/org/torproject/descriptor/ImplementationNotAccessibleException.java
@@ -1,7 +1,15 @@
-/* Copyright 2014--2015 The Tor Project
+/* Copyright 2014--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
+/**
+ * Thrown if a descriptor source implementation class cannot be found,
+ * instantiated, or accessed.
+ *
+ * @see DescriptorSourceFactory
+ * @since 1.0.0
+ */
@SuppressWarnings("serial")
public class ImplementationNotAccessibleException
extends RuntimeException {
diff --git a/src/org/torproject/descriptor/Microdescriptor.java b/src/org/torproject/descriptor/Microdescriptor.java
index 3cebeb6..f19b7df 100644
--- a/src/org/torproject/descriptor/Microdescriptor.java
+++ b/src/org/torproject/descriptor/Microdescriptor.java
@@ -1,57 +1,135 @@
-/* Copyright 2014--2015 The Tor Project
+/* Copyright 2014--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
-/* Contains a relay microdescriptor. */
+/**
+ * Contains a relay microdescriptor.
+ *
+ * <p>A microdescriptor is a stripped-down version of a relay server
+ * descriptor ({@link RelayServerDescriptor}) generated by the directory
+ * authorities by extracting and/or transforming relay server descriptor
+ * contents following strict rules without adding the authority's opinion
+ * about the relay. Microdescriptors are referenced from microdescriptor
+ * consensuses ({@link RelayNetworkStatusConsensus}) and downloaded by
+ * clients to make path-selection decisions and to build circuits.
+ * Microdescriptors contain only the most relevant parts that clients care
+ * about. Microdescriptors are expected to be relatively static and only
+ * change about once per week.</p>
+ *
+ * @since 1.0.0
+ */
public interface Microdescriptor extends Descriptor {
- /* Return the descriptor digest that is used to reference this
- * microdescriptor in a network status. */
+ /**
+ * Return the SHA-256 descriptor digest, encoded as 43 base64
+ * characters without padding characters, that is used to reference this
+ * descriptor from a vote or microdescriptor consensus.
+ *
+ * @since 1.0.0
+ */
public String getMicrodescriptorDigest();
- /* Return the onion key in PEM format. */
+ /**
+ * Return the RSA-1024 public key in PEM format used to encrypt CREATE
+ * cells for this server, or null if the descriptor doesn't contain an
+ * onion key.
+ *
+ * @since 1.0.0
+ */
public String getOnionKey();
- /* Return the ntor onion key base64 string with padding omitted, or null
- * if the microdescriptor didn't contain an ntor onion key line. */
+ /**
+ * Return the curve25519 public key, encoded as 43 base64 characters
+ * without padding characters, that is used for the ntor circuit
+ * extended handshake, or null if the descriptor didn't contain an
+ * ntor-onion-key line.
+ *
+ * @since 1.0.0
+ */
public String getNtorOnionKey();
- /* Return the relay's additional OR addresses and ports contained in
- * or-address lines, or an empty list if the microdescriptor doesn't
- * contain such lines. */
+ /**
+ * Return IP addresses and TCP ports where this server accepts TLS
+ * connections for the main OR protocol, or an empty list if the server
+ * does not support additional addresses or ports; entries are given in
+ * the order as they are listed in the descriptor; IPv4 addresses are
+ * given in dotted-quad format, IPv6 addresses use the colon-separated
+ * hexadecimal format surrounded by square brackets, and TCP ports are
+ * separated from the IP address using a colon.
+ *
+ * @since 1.0.0
+ */
public List<String> getOrAddresses();
- /* Return nicknames, ($-prefixed) fingerprints, $fingerprint=nickname,
- * or $fingerprint~nickname tuples contained in the family line of this
- * relay, or null if the descriptor does not contain a family line. */
+ /**
+ * Return nicknames, $-prefixed identity fingerprints, or tuples of the
+ * format {@code $fingerprint=nickname} or {@code $fingerprint~nickname}
+ * of servers contained in this server's family, or null if the
+ * descriptor does not contain a family line.
+ *
+ * @since 1.0.0
+ */
public List<String> getFamilyEntries();
- /* Return the default policy of the port summary or null if the
- * microdescriptor didn't contain a port summary line. */
+ /**
+ * Return the default policy, {@code "accept"} or {@code "reject"}, of
+ * the IPv4 port summary, or null if the descriptor didn't contain an
+ * IPv4 exit-policy summary line which is equivalent to rejecting all
+ * streams to IPv4 targets.
+ *
+ * @since 1.0.0
+ */
public String getDefaultPolicy();
- /* Return the port list of the port summary or null if the
- * microdescriptor didn't contain a port summary line. */
+ /**
+ * Return the port list of the IPv4 exit-policy summary, or null if the
+ * descriptor didn't contain an IPv4 exit-policy summary line which is
+ * equivalent to rejecting all streams to IPv4 targets.
+ *
+ * @since 1.0.0
+ */
public String getPortList();
- /* Return the default policy of the IPv6 port summary or null if the
- * microdescriptor didn't contain an IPv6 port summary line. */
+ /**
+ * Return the default policy, {@code "accept"} or {@code "reject"}, of
+ * the IPv6 port summary, or null if the descriptor didn't contain an
+ * IPv6 exit-policy summary line which is equivalent to rejecting all
+ * streams to IPv6 targets.
+ *
+ * @since 1.0.0
+ */
public String getIpv6DefaultPolicy();
- /* Return the port list of the IPv6 port summary or null if the
- * microdescriptor didn't contain an IPv6 port summary line. */
+ /**
+ * Return the port list of the IPv6 exit-policy summary, or null if the
+ * descriptor didn't contain an IPv6 exit-policy summary line which is
+ * equivalent to rejecting all streams to IPv6 targets.
+ *
+ * @since 1.0.0
+ */
public String getIpv6PortList();
- /* Return the optional, base64-encoded RSA-1024 identity that is only
+ /**
+ * Return a SHA-1 digest of the server's RSA-1024 identity key, encoded
+ * as 27 base64 characters without padding characters, that is only
* included to prevent collisions between microdescriptors, or null if
- * no such identity is included. */
+ * no such digest is included.
+ *
+ * @since 1.1.0
+ */
public String getRsa1024Identity();
- /* Return the optional, base64-encoded Ed25519 identity that is only
- * included to prevent collisions between microdescriptors, or null if
- * no such identity is included. */
+ /**
+ * Return a SHA-256 digest of the server's Ed25519 identity key,
+ * encoded as 43 base64 characters without padding characters, that is
+ * only included to prevent collisions between microdescriptors, or null
+ * if no such digest is included.
+ *
+ * @since 1.1.0
+ */
public String getEd25519Identity();
}
diff --git a/src/org/torproject/descriptor/NetworkStatusEntry.java b/src/org/torproject/descriptor/NetworkStatusEntry.java
index 584f07b..43b3175 100644
--- a/src/org/torproject/descriptor/NetworkStatusEntry.java
+++ b/src/org/torproject/descriptor/NetworkStatusEntry.java
@@ -1,84 +1,177 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
-/* Status entry contained in a network status with version 2 or higher or
- * in a bridge network status. */
+/**
+ * Contains an entry in a network status in the version 2 or 3 directory
+ * protocol or in a bridge network status.
+ *
+ * <p>A network status entry is not a descriptor type of its own but is
+ * part of a network status in the version 2 directory protocol
+ * ({@link RelayNetworkStatus}), a vote ({@link RelayNetworkStatusVote})
+ * or flavored/unflavored consensus (@link RelayNetworkStatusConsensus})
+ * in the version 3 directory protocol, or a bridge network status
+ * ({@link BridgeNetworkStatus}). Entries in signed directories in the
+ * version 1 directory protocol are represented by router status entries
+ * ({@link RouterStatusEntry}).</p>
+ *
+ * @since 1.0.0
+ */
public interface NetworkStatusEntry {
- /* Return the raw status entry bytes. */
+ /**
+ * Return the raw network status entry bytes.
+ *
+ * @since 1.0.0
+ */
public byte[] getStatusEntryBytes();
- /* Return the relay nickname. */
+ /**
+ * Return the server nickname consisting of 1 to 19 alphanumeric
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the relay fingerprint. */
+ /**
+ * Return a SHA-1 digest of the server's identity key, encoded as 40
+ * upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getFingerprint();
- /* Return the descriptor identity or null if the containing status is a
- * microdesc consensus. */
+ /**
+ * Return the SHA-1 digest of the server descriptor, or null if the
+ * containing network status does not contain server descriptor
+ * references, like a microdesc consensus.
+ *
+ * @since 1.0.0
+ */
public String getDescriptor();
- /* Return the publication timestamp. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * was published.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the IP address. */
+ /**
+ * Return the server's primary IPv4 address in dotted-quad format.
+ *
+ * @since 1.0.0
+ */
public String getAddress();
- /* Return the ORPort. */
+ /**
+ * Return the TCP port where this server accepts TLS connections for
+ * the main OR protocol.
+ *
+ * @since 1.0.0
+ */
public int getOrPort();
- /* Return the DirPort. */
+ /**
+ * Return the TCP port where this server accepts directory-related HTTP
+ * connections.
+ *
+ * @since 1.0.0
+ */
public int getDirPort();
- /* Return the (possibly empty) set of microdescriptor digest(s) if the
- * containing status is a vote or microdesc consensus, or null
- * otherwise. */
+ /**
+ * Return the (possibly empty) set of microdescriptor digests if the
+ * containing network status is a vote or microdesc consensus, or null
+ * otherwise.
+ *
+ * @since 1.0.0
+ */
public Set<String> getMicrodescriptorDigests();
- /* Return the relay's additional OR addresses and ports contained in
- * or-address lines, or an empty list if the network status doesn't
- * contain such lines. */
+ /**
+ * Return additional IP addresses and TCP ports where this server
+ * accepts TLS connections for the main OR protocol, or an empty list if
+ * the network status doesn't contain any such additional addresses and
+ * ports.
+ *
+ * @since 1.0.0
+ */
public List<String> getOrAddresses();
- /* Return the relay flags or null if the status entry didn't contain any
- * relay flags. */
+ /**
+ * Return the relay flags assigned to this server, or null if the
+ * status entry didn't contain any relay flags.
+ *
+ * @since 1.0.0
+ */
public SortedSet<String> getFlags();
- /* Return the Tor software version or null if the status entry didn't
- * contain a version line. */
+ /**
+ * Return the Tor software version, or null if the status entry didn't
+ * contain version information.
+ *
+ * @since 1.0.0
+ */
public String getVersion();
- /* Return the bandwidth weight or -1L if the status entry didn't
- * contain a bandwidth line. */
+ /**
+ * Return the bandwidth weight of this server or -1 if the status entry
+ * didn't contain a bandwidth line.
+ *
+ * @since 1.0.0
+ */
public long getBandwidth();
- /* Return the measured bandwidth or -1L if the status entry didn't
- * contain a bandwidth line or didn't contain a Measured= keyword in its
- * bandwidth line. */
+ /**
+ * Return the measured bandwidth or -1 if the status entry either
+ * didn't contain bandwidth information or didn't contain an indication
+ * that this information is based on measured bandwidth.
+ *
+ * @since 1.0.0
+ */
public long getMeasured();
- /* Return whether the status entry contained an Unmeasured=1 entry in
- * its bandwidth line, meaning that the bandwidth authorities didn't
- * measure this relay yet. Only included in consensuses using method
- * 17 or higher. */
+ /**
+ * Return whether the status entry is yet unmeasured by the bandwidth
+ * authorities; only included in consensuses using method 17 or higher.
+ *
+ * @since 1.0.0
+ */
public boolean getUnmeasured();
- /* Return the default policy of the port summary or null if the status
- * entry didn't contain a port summary line. */
+ /**
+ * Return the default policy of the port summary, which can be either
+ * {@code "accept"} or {@code "reject"}, or null if the status entry
+ * didn't contain an exit policy summary.
+ *
+ * @since 1.0.0
+ */
public String getDefaultPolicy();
- /* Return the port list of the port summary or null if the status entry
- * didn't contain a port summary line. */
+ /**
+ * Return the list of ports or port intervals of the exit port summary,
+ * or null if the status entry didn't contain an exit policy summary.
+ *
+ * @since 1.0.0
+ */
public String getPortList();
- /* Return the relay's base64-encoded Ed25519 master key, "none" if the
- * relay doesn't have an Ed25519 identity, or null if the status entry
- * didn't contain this information. Only included in votes. */
+ /**
+ * Return the server's Ed25519 master key, encoded as 43 base64
+ * characters without padding characters, "none" if the relay doesn't
+ * have an Ed25519 identity, or null if the status entry didn't contain
+ * this information or if the status is not a vote.
+ *
+ * @since 1.1.0
+ */
public String getMasterKeyEd25519();
}
diff --git a/src/org/torproject/descriptor/RelayDirectory.java b/src/org/torproject/descriptor/RelayDirectory.java
index 209c080..8f3e58b 100644
--- a/src/org/torproject/descriptor/RelayDirectory.java
+++ b/src/org/torproject/descriptor/RelayDirectory.java
@@ -1,41 +1,104 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
-/* Contains a v1 signed directory. */
+/**
+ * Contains a signed directory in the version 1 directory protocol.
+ *
+ * <p>Directory authorities in the (long outdated) version 1 of the
+ * directory protocol served signed directory documents containing a list
+ * of signed server descriptors ({@link ServerDescriptor}) along with
+ * short summaries of the status of each server
+ * ({@link RouterStatusEntry}).</p>
+ *
+ * <p>Clients in that version of the directory protocol would fetch this
+ * signed directory to get up-to-date information on the state of the
+ * network and be certain that the list was attested by a trusted
+ * directory authority.</p>
+ *
+ * <p>Signed directories in the version 1 directory protocol have first
+ * been superseded by network status documents in the version 2 directory
+ * protocol ({@link RelayNetworkStatus}) and later by network status
+ * consensuses ({@link RelayNetworkStatusConsensus}) in the version 3
+ * directory protocol.</p>
+ *
+ * @since 1.0.0
+ */
public interface RelayDirectory extends Descriptor {
- /* Return the published time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * was published.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the directory signing key digest. */
+ /**
+ * Return the RSA-1024 public key in PEM format used by this authority
+ * as long-term identity key and to sign network statuses, or null if
+ * this key is not included in the descriptor header.
+ *
+ * @since 1.0.0
+ */
public String getDirSigningKey();
- /* Return recommended software versions or null if the directory doesn't
- * list recommended software. */
+ /**
+ * Return recommended Tor versions.
+ *
+ * @since 1.0.0
+ */
public List<String> getRecommendedSoftware();
- /* Return the directory signature. */
+ /**
+ * Return the directory signature string made with the authority's
+ * identity key.
+ *
+ * @since 1.0.0
+ */
public String getDirectorySignature();
- /* Return router status entries, one for each contained relay. */
+ /**
+ * Return router status entries, one for each contained relay.
+ *
+ * @since 1.0.0
+ */
public List<RouterStatusEntry> getRouterStatusEntries();
- /* Return a list of server descriptors contained in the signed
- * directory. */
+ /**
+ * Return a list of server descriptors contained in the signed
+ * directory.
+ *
+ * @since 1.0.0
+ */
public List<ServerDescriptor> getServerDescriptors();
- /* Return a (very likely empty) list of exceptions from parsing the
- * contained server descriptors. */
+ /**
+ * Return a (very likely empty) list of exceptions from parsing the
+ * contained server descriptors.
+ *
+ * @since 1.0.0
+ */
public List<Exception> getServerDescriptorParseExceptions();
- /* Return the directory nickname. */
+ /**
+ * Return the directory nickname consisting of 1 to 19 alphanumeric
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the directory digest that the directory authority used to sign
- * the directory. */
+ /**
+ * Return the SHA-1 directory digest, encoded as 40 lower-case
+ * hexadecimal characters, that the directory authority used to sign the
+ * directory.
+ *
+ * @since 1.0.0
+ */
public String getDirectoryDigest();
}
diff --git a/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java b/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java
index 01e2716..73f8438 100644
--- a/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java
+++ b/src/org/torproject/descriptor/RelayExtraInfoDescriptor.java
@@ -1,8 +1,20 @@
-/* Copyright 2015 The Tor Project
+/* Copyright 2015--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
-/* Contains a relay extra-info descriptor. */
+/**
+ * Contains a relay extra-info descriptor.
+ *
+ * <p>Relay extra-info descriptors share many contents with sanitized
+ * bridge extra-info descriptors ({@link BridgeExtraInfoDescriptor}),
+ * which is why they share a common superinterface
+ * ({@link ExtraInfoDescriptor}). The main purpose of having two
+ * subinterfaces is being able to distinguish descriptor types more
+ * easily.</p>
+ *
+ * @since 1.1.0
+ */
public interface RelayExtraInfoDescriptor extends ExtraInfoDescriptor {
}
diff --git a/src/org/torproject/descriptor/RelayNetworkStatus.java b/src/org/torproject/descriptor/RelayNetworkStatus.java
index acbdb90..db3ddac 100644
--- a/src/org/torproject/descriptor/RelayNetworkStatus.java
+++ b/src/org/torproject/descriptor/RelayNetworkStatus.java
@@ -1,68 +1,176 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
import java.util.SortedMap;
import java.util.SortedSet;
-/* Contains a v2 network status. */
+/**
+ * Contains a network status document in the version 2 directory protocol.
+ *
+ * <p>Directory authorities in the (outdated) version 2 of the directory
+ * protocol published signed network status documents. Each network
+ * status listed, for every relay in the network
+ * ({@link NetworkStatusEntry}): a hash of its identity key, a hash of its
+ * most recent server descriptor, and a summary of what the authority
+ * believed about its status.</p>
+ *
+ * <p>Clients would download the authorities' network status documents in
+ * turn, and believe statements about routers iff they were attested to by
+ * more than half of the authorities.</p>
+ *
+ * <p>Network status documents in the version 2 directory protocol
+ * supersede signed directories in the version 1 directory protocol
+ * ({@link RelayDirectory}) and have been superseded by network status
+ * consensuses ({@link RelayNetworkStatusConsensus}) in the version 3
+ * directory protocol.</p>
+ *
+ * @since 1.0.0
+ */
public interface RelayNetworkStatus extends Descriptor {
- /* Return the network status version. */
+ /**
+ * Return the document format version of this descriptor which is 2.
+ *
+ * @since 1.0.0
+ */
public int getNetworkStatusVersion();
- /* Return the authority's hostname. */
+ /**
+ * Return the authority's hostname.
+ *
+ * @since 1.0.0
+ */
public String getHostname();
- /* Return the authority's IP address. */
+ /**
+ * Return the authority's primary IPv4 address in dotted-quad format,
+ * or null if the descriptor does not contain an address.
+ *
+ * @since 1.0.0
+ */
public String getAddress();
- /* Return the authority's directory port. */
+ /**
+ * Return the TCP port where this authority accepts directory-related
+ * HTTP connections, or 0 if the authority does not accept such
+ * connections.
+ *
+ * @since 1.0.0
+ */
public int getDirport();
- /* Return the directory's signing key's fingerprint. */
+ /**
+ * Return a SHA-1 digest of the authority's public identity key,
+ * encoded as 40 upper-case hexadecimal characters, which is also used
+ * to sign network statuses.
+ *
+ * @since 1.0.0
+ */
public String getFingerprint();
- /* Return the contact line. */
+ /**
+ * Return the contact information for this authority, which may contain
+ * non-ASCII characters.
+ *
+ * @since 1.0.0
+ */
public String getContactLine();
- /* Return the directory signing key digest. */
+ /**
+ * Return the RSA-1024 public key in PEM format used by this authority
+ * as long-term identity key and to sign network statuses.
+ *
+ * @since 1.0.0
+ */
public String getDirSigningKey();
- /* Return recommended server versions or null if the status doesn't
- * contain recommended server versions. */
+ /**
+ * Return recommended Tor versions for server usage, or null if the
+ * authority does not recommend server versions.
+ *
+ * @since 1.0.0
+ */
public List<String> getRecommendedServerVersions();
- /* Return recommended client versions or null if the status doesn't
- * contain recommended client versions. */
+ /**
+ * Return recommended Tor versions for client usage, or null if the
+ * authority does not recommend client versions.
+ *
+ * @since 1.0.0
+ */
public List<String> getRecommendedClientVersions();
- /* Return the published time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * was published.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the set of flags that this directory assigns to relays, or
- * null if the status does not contain a dir-options line. */
+ /**
+ * Return the set of flags that this directory assigns to relays, or
+ * null if the status does not assign such flags.
+ *
+ * @since 1.0.0
+ */
public SortedSet<String> getDirOptions();
- /* Return status entries, one for each contained relay. */
+ /**
+ * Return status entries for each contained server, with map keys being
+ * SHA-1 digests of the servers' public identity keys, encoded as 40
+ * upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, NetworkStatusEntry> getStatusEntries();
- /* Return whether a status entry with the given fingerprint exists. */
+ /**
+ * Return whether a status entry with the given relay fingerprint
+ * (SHA-1 digest of the server's public identity key, encoded as 40
+ * upper-case hexadecimal characters) exists; convenience method for
+ * {@code getStatusEntries().containsKey(fingerprint)}.
+ *
+ * @since 1.0.0
+ */
public boolean containsStatusEntry(String fingerprint);
- /* Return a status entry by fingerprint or null if no such status entry
- * exists. */
+ /**
+ * Return a status entry by relay fingerprint (SHA-1 digest of the
+ * server's public identity key, encoded as 40 upper-case hexadecimal
+ * characters), or null if no such status entry exists; convenience
+ * method for {@code getStatusEntries().get(fingerprint)}.
+ *
+ * @since 1.0.0
+ */
public NetworkStatusEntry getStatusEntry(String fingerprint);
- /* Return the directory nickname. */
+ /**
+ * Return the authority's nickname consisting of 1 to 19 alphanumeric
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the directory signature. */
+ /**
+ * Return the directory signature string made with the authority's
+ * identity key.
+ *
+ * @since 1.0.0
+ */
public String getDirectorySignature();
- /* Return the status digest that the directory authority used to sign
- * the network status. */
+ /**
+ * Return the SHA-1 status digest, encoded as 40 lower-case hexadecimal
+ * characters, that the directory authority used to sign the network
+ * status.
+ *
+ * @since 1.0.0
+ */
public String getStatusDigest();
}
diff --git a/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java b/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
index 0419acc..624f1cc 100644
--- a/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
+++ b/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
@@ -1,76 +1,201 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
import java.util.SortedMap;
import java.util.SortedSet;
-/* Contains a network status consensus. */
+/**
+ * Contains a network status consensus in the version 3 directory protocol.
+ *
+ * <p>Directory authorities in the version 3 of the directory protocol
+ * periodically generate a view of the current descriptors and status for
+ * known relays and send a signed summary of this view to the other
+ * authorities ({@link RelayNetworkStatusVote}). The authorities compute
+ * the result of this vote and sign a network status consensus containing
+ * the result of the vote, which is this document.</p>
+ *
+ * <p>Clients use consensus documents to find out when their list of
+ * relays is out-of-date by looking at the contained network status
+ * entries ({@link NetworkStatusEntry}). If it is, they download any
+ * missing server descriptors ({@link ServerDescriptor}).</p>
+ *
+ * @since 1.0.0
+ */
public interface RelayNetworkStatusConsensus extends Descriptor {
- /* Return the network status version. */
+ /**
+ * Return the document format version of this descriptor which is 3 or
+ * higher.
+ *
+ * @since 1.0.0
+ */
public int getNetworkStatusVersion();
- /* Return the flavor name, or null if this consensus is unflavored. */
+ /**
+ * Return the consensus flavor name, which denotes the variant of the
+ * original, unflavored consensus, encoded as a string of alphanumeric
+ * characters and dashes, or null if this descriptor is the unflavored
+ * consensus.
+ *
+ * @since 1.0.0
+ */
public String getConsensusFlavor();
- /* Return the consensus method. */
+ /**
+ * Return the consensus method number of this descriptor, which is the
+ * highest consensus method supported by more than 2/3 of voting
+ * authorities, or 0 if no consensus method is contained in the
+ * descriptor.
+ *
+ * @since 1.0.0
+ */
public int getConsensusMethod();
- /* Return the valid-after time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch at which this
+ * descriptor became valid.
+ *
+ * @since 1.0.0
+ */
public long getValidAfterMillis();
- /* Return the fresh-until time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch until which this
+ * descriptor is the freshest that is available.
+ *
+ * @since 1.0.0
+ */
public long getFreshUntilMillis();
- /* Return the valid-until time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch until which this
+ * descriptor was valid.
+ *
+ * @since 1.0.0
+ */
public long getValidUntilMillis();
- /* Return the VoteSeconds time in seconds. */
+ /**
+ * Return the number of seconds that the directory authorities will
+ * allow to collect votes from the other authorities when producing the
+ * next consensus.
+ *
+ * @since 1.0.0
+ */
public long getVoteSeconds();
- /* Return the DistSeconds time in seconds. */
+ /**
+ * Return the number of seconds that the directory authorities will
+ * allow to collect signatures from the other authorities when producing
+ * the next consensus.
+ *
+ * @since 1.0.0
+ */
public long getDistSeconds();
- /* Return recommended server versions or null if the consensus doesn't
- * contain recommended server versions. */
+ /**
+ * Return recommended Tor versions for server usage, or null if the
+ * consensus does not contain an opinion about server versions.
+ *
+ * @since 1.0.0
+ */
public List<String> getRecommendedServerVersions();
- /* Return recommended client versions or null if the consensus doesn't
- * contain recommended client versions. */
+ /**
+ * Return recommended Tor versions for client usage, or null if the
+ * consensus does not contain an opinion about client versions.
+ *
+ * @since 1.0.0
+ */
public List<String> getRecommendedClientVersions();
- /* Return known relay flags. */
+ /**
+ * Return known relay flags in this descriptor that were contained in
+ * enough votes for this consensus to be an authoritative opinion for
+ * these relay flags.
+ *
+ * @since 1.0.0
+ */
public SortedSet<String> getKnownFlags();
- /* Return consensus parameters or null if the consensus doesn't contain
- * consensus parameters. */
+ /**
+ * Return consensus parameters contained in this descriptor with map
+ * keys being case-sensitive parameter identifiers and map values being
+ * parameter values, or null if the consensus doesn't contain consensus
+ * parameters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getConsensusParams();
- /* Return dir-source entries representing the directories of which
- * votes are contained in this consensus. */
+ /**
+ * Return directory source entries for each directory authority that
+ * contributed to the consensus, with map keys being SHA-1 digests of
+ * the authorities' identity keys in the version 3 directory protocol,
+ * encoded as 40 upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, DirSourceEntry> getDirSourceEntries();
- /* Return status entries, one for each contained relay. */
+ /**
+ * Return status entries for each contained server, with map keys being
+ * SHA-1 digests of the servers' public identity keys, encoded as 40
+ * upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, NetworkStatusEntry> getStatusEntries();
- /* Return whether a status entry with the given fingerprint exists. */
+ /**
+ * Return whether a status entry with the given relay fingerprint
+ * (SHA-1 digest of the server's public identity key, encoded as 40
+ * upper-case hexadecimal characters) exists; convenience method for
+ * {@code getStatusEntries().containsKey(fingerprint)}.
+ *
+ * @since 1.0.0
+ */
public boolean containsStatusEntry(String fingerprint);
- /* Return a status entry by fingerprint or null if no such status entry
- * exists. */
+ /**
+ * Return a status entry by relay fingerprint (SHA-1 digest of the
+ * server's public identity key, encoded as 40 upper-case hexadecimal
+ * characters), or null if no such status entry exists; convenience
+ * method for {@code getStatusEntries().get(fingerprint)}.
+ *
+ * @since 1.0.0
+ */
public NetworkStatusEntry getStatusEntry(String fingerprint);
- /* Return directory signatures. */
+ /**
+ * Return directory signatures of this consensus, with map keys being
+ * SHA-1 digests of the authorities' identity keys in the version 3
+ * directory protocol, encoded as 40 upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, DirectorySignature> getDirectorySignatures();
- /* Return bandwidth weights or null if the consensus doesn't contain
- * bandwidth weights. */
+ /**
+ * Return optional weights to be applied to router bandwidths during
+ * path selection with map keys being case-sensitive weight identifiers
+ * and map values being weight values, or null if the consensus doesn't
+ * contain such weights.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getBandwidthWeights();
- /* Return the consensus digest that directory authorities use to sign
- * the consensus. */
+ /**
+ * Return the SHA-1 digest of this consensus, encoded as 40 upper-case
+ * hexadecimal characters that directory authorities use to sign the
+ * consensus.
+ *
+ * @since 1.0.0
+ */
public String getConsensusDigest();
}
diff --git a/src/org/torproject/descriptor/RelayNetworkStatusVote.java b/src/org/torproject/descriptor/RelayNetworkStatusVote.java
index f4fad2a..5e0c7cd 100644
--- a/src/org/torproject/descriptor/RelayNetworkStatusVote.java
+++ b/src/org/torproject/descriptor/RelayNetworkStatusVote.java
@@ -1,147 +1,379 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
import java.util.SortedMap;
import java.util.SortedSet;
-/* Contains a network status vote. */
+/**
+ * Contains a network status vote in the version 3 directory protocol.
+ *
+ * <p>Directory authorities in the version 3 of the directory protocol
+ * periodically generate a view of the current descriptors and status for
+ * known relays and send a signed summary of this view to the other
+ * authorities, which is this document. The authorities compute the
+ * result of this vote and sign a network status consensus containing the
+ * result of the vote ({@link RelayNetworkStatusConsensus}).</p>
+ *
+ * @since 1.0.0
+ */
public interface RelayNetworkStatusVote extends Descriptor {
- /* Return the network status version. */
+ /**
+ * Return the document format version of this descriptor which is 3 or
+ * higher.
+ *
+ * @since 1.0.0
+ */
public int getNetworkStatusVersion();
- /* Return the consensus method. */
+ /**
+ * Return the list of consensus method numbers supported by this
+ * authority, or null if the descriptor doesn't say so, which would mean
+ * that only method 1 is supported.
+ *
+ * @since 1.0.0
+ */
public List<Integer> getConsensusMethods();
- /* Return the publication time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * was published.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the valid-after time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch at which the
+ * consensus is supposed to become valid.
+ *
+ * @since 1.0.0
+ */
public long getValidAfterMillis();
- /* Return the fresh-until time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch until which the
+ * consensus is supposed to be the freshest that is available.
+ *
+ * @since 1.0.0
+ */
public long getFreshUntilMillis();
- /* Return the valid-until time in milliseconds. */
+ /**
+ * Return the time in milliseconds since the epoch until which the
+ * consensus is supposed to be valid.
+ *
+ * @since 1.0.0
+ */
public long getValidUntilMillis();
- /* Return the VoteSeconds time in seconds. */
+ /**
+ * Return the number of seconds that the directory authorities will
+ * allow to collect votes from the other authorities when producing the
+ * next consensus.
+ *
+ * @since 1.0.0
+ */
public long getVoteSeconds();
- /* Return the DistSeconds time in seconds. */
+ /**
+ * Return the number of seconds that the directory authorities will
+ * allow to collect signatures from the other authorities when producing
+ * the next consensus.
+ *
+ * @since 1.0.0
+ */
public long getDistSeconds();
- /* Return recommended server versions or null if the authority doesn't
- * recommend server versions. */
+ /**
+ * Return recommended Tor versions for server usage, or null if the
+ * authority does not recommend server versions.
+ *
+ * @since 1.0.0
+ */
public List<String> getRecommendedServerVersions();
- /* Return recommended client versions or null if the authority doesn't
- * recommend server versions. */
+ /**
+ * Return recommended Tor versions for client usage, or null if the
+ * authority does not recommend client versions.
+ *
+ * @since 1.0.0
+ */
public List<String> getRecommendedClientVersions();
- /* Return known relay flags. */
+ /**
+ * Return known relay flags by this authority.
+ *
+ * @since 1.0.0
+ */
public SortedSet<String> getKnownFlags();
- /* Return the minimum uptime in seconds that this authority requires for
- * assigning the Stable flag, or -1 if the authority doesn't report this
- * value. */
+ /**
+ * Return the minimum uptime in seconds that this authority requires
+ * for assigning the Stable flag, or -1 if the authority doesn't report
+ * this value.
+ *
+ * @since 1.0.0
+ */
public long getStableUptime();
- /* Return the minimum MTBF (mean time between failure) that this
+ /**
+ * Return the minimum MTBF (mean time between failure) that this
* authority requires for assigning the Stable flag, or -1 if the
- * authority doesn't report this value. */
+ * authority doesn't report this value.
+ *
+ * @since 1.0.0
+ */
public long getStableMtbf();
- /* Return the minimum bandwidth that this authority requires for
+ /**
+ * Return the minimum bandwidth that this authority requires for
* assigning the Fast flag, or -1 if the authority doesn't report this
- * value. */
+ * value.
+ *
+ * @since 1.0.0
+ */
public long getFastBandwidth();
- /* Return the minimum WFU (weighted fractional uptime) in percent that
- * this authority requires for assigning the Guard flag, or -1.0 if the
- * authority doesn't report this value. */
+ /**
+ * Return the minimum WFU (weighted fractional uptime) in percent that
+ * this authority requires for assigning the Guard flag, or -1 if the
+ * authority doesn't report this value.
+ *
+ * @since 1.0.0
+ */
public double getGuardWfu();
- /* Return the minimum weighted time in seconds that this authority needs
- * to know about a relay before assigning the Guard flag, or -1 if the
- * authority doesn't report this information. */
+ /**
+ * Return the minimum weighted time in seconds that this authority
+ * needs to know about a relay before assigning the Guard flag, or -1 if
+ * the authority doesn't report this information.
+ *
+ * @since 1.0.0
+ */
public long getGuardTk();
- /* Return the minimum bandwidth that this authority requires for
+ /**
+ * Return the minimum bandwidth that this authority requires for
* assigning the Guard flag if exits can be guards, or -1 if the
- * authority doesn't report this value. */
+ * authority doesn't report this value.
+ *
+ * @since 1.0.0
+ */
public long getGuardBandwidthIncludingExits();
- /* Return the minimum bandwidth that this authority requires for
+ /**
+ * Return the minimum bandwidth that this authority requires for
* assigning the Guard flag if exits can not be guards, or -1 if the
- * authority doesn't report this value. */
+ * authority doesn't report this value.
+ *
+ * @since 1.0.0
+ */
public long getGuardBandwidthExcludingExits();
- /* Return 1 if the authority has measured enough MTBF info to use the
+ /**
+ * Return 1 if the authority has measured enough MTBF info to use the
* MTBF requirement instead of the uptime requirement for assigning the
* Stable flag, 0 if not, or -1 if the authority doesn't report this
- * information. */
+ * information.
+ *
+ * @since 1.0.0
+ */
public int getEnoughMtbfInfo();
- /* Return 1 if the authority has enough measured bandwidths that it'll
+ /**
+ * Return 1 if the authority has enough measured bandwidths that it'll
* ignore the advertised bandwidth claims of routers without measured
* bandwidth, 0 if not, or -1 if the authority doesn't report this
- * information. */
+ * information.
+ *
+ * @since 1.1.0
+ */
public int getIgnoringAdvertisedBws();
- /* Return consensus parameters. */
+ /**
+ * Return consensus parameters contained in this descriptor with map
+ * keys being case-sensitive parameter identifiers and map values being
+ * parameter values, or null if the authority doesn't include consensus
+ * parameters in its vote.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, Integer> getConsensusParams();
- /* Return the directory nickname. */
+ /**
+ * Return the authority's nickname consisting of 1 to 19 alphanumeric
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the directory identity. */
+ /**
+ * Return a SHA-1 digest of the authority's long-term authority
+ * identity key used for the version 3 directory protocol, encoded as
+ * 40 upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getIdentity();
- /* Return the hostname. */
+ /**
+ * Return the authority's hostname.
+ *
+ * @since 1.2.0
+ */
public String getHostname();
- /* Return the IP address. */
+ /**
+ * Return the authority's primary IPv4 address in dotted-quad format,
+ * or null if the descriptor does not contain an address.
+ *
+ * @since 1.0.0
+ */
public String getAddress();
- /* Return the DiRPort. */
+ /**
+ * Return the TCP port where this authority accepts directory-related
+ * HTTP connections, or 0 if the authority does not accept such
+ * connections.
+ *
+ * @since 1.0.0
+ */
public int getDirport();
- /* Return the ORPort. */
+ /**
+ * Return the TCP port where this authority accepts TLS connections for
+ * the main OR protocol, or 0 if the authority does not accept such
+ * connections.
+ *
+ * @since 1.0.0
+ */
public int getOrport();
- /* Return the contact line. */
+ /**
+ * Return the contact information for this authority, which may contain
+ * non-ASCII characters, or null if no contact information is included
+ * in the descriptor.
+ *
+ * @since 1.0.0
+ */
public String getContactLine();
- /* Return the directory key certificate version. */
+ /**
+ * Return the version of the directory key certificate used by this
+ * authority, which must be 3 or higher.
+ *
+ * @since 1.0.0
+ */
public int getDirKeyCertificateVersion();
- /* Return the legacy dir key or null if the directory authority does not
- * use a legacy dir key. */
+ /**
+ * Return the SHA-1 digest for an obsolete authority identity key still
+ * used by this authority to keep older clients working, or null if this
+ * authority does not use such a key.
+ *
+ * @since 1.0.0
+ */
public String getLegacyDirKey();
- /* Return the directory key publication timestamp. */
+ /**
+ * Return the authority's identity key in PEM format.
+ *
+ * @since 1.2.0
+ */
+ public String getDirIdentityKey();
+
+ /**
+ * Return the time in milliseconds since the epoch when the authority's
+ * signing key and corresponding key certificate were generated.
+ *
+ * @since 1.0.0
+ */
public long getDirKeyPublishedMillis();
- /* Return the directory key expiration timestamp. */
+ /**
+ * Return the time in milliseconds since the epoch after which the
+ * authority's signing key is no longer valid.
+ *
+ * @since 1.0.0
+ */
public long getDirKeyExpiresMillis();
- /* Return the signing key digest. */
+ /**
+ * Return the authority's signing key in PEM format.
+ *
+ * @since 1.2.0
+ */
+ public String getDirSigningKey();
+
+ /**
+ * Return the SHA-1 digest of the authority's signing key, encoded as
+ * 40 upper-case hexadecimal characters, or null if this digest cannot
+ * be obtained from the directory signature.
+ *
+ * @since 1.0.0
+ */
public String getSigningKeyDigest();
- /* Return status entries, one for each contained relay. */
+ /**
+ * Return the signature of the authority's identity key made using the
+ * authority's signing key, or null if the vote does not contain such a
+ * signature.
+ *
+ * @since 1.2.0
+ */
+ public String getDirKeyCrosscert();
+
+ /**
+ * Return the certificate signature from the initial item
+ * "dir-key-certificate-version" until the final item
+ * "dir-key-certification", signed with the authority identity key.
+ *
+ * @since 1.2.0
+ */
+ public String getDirKeyCertification();
+
+ /**
+ * Return status entries for each contained server, with map keys being
+ * SHA-1 digests of the servers' public identity keys, encoded as 40
+ * upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, NetworkStatusEntry> getStatusEntries();
- /* Return whether a status entry with the given fingerprint exists. */
+ /**
+ * Return whether a status entry with the given relay fingerprint
+ * (SHA-1 digest of the server's public identity key, encoded as 40
+ * upper-case hexadecimal characters) exists; convenience method for
+ * {@code getStatusEntries().containsKey(fingerprint)}.
+ *
+ * @since 1.0.0
+ */
public boolean containsStatusEntry(String fingerprint);
- /* Return a status entry by fingerprint or null if no such status entry
- * exists. */
+ /**
+ * Return a status entry by relay fingerprint (SHA-1 digest of the
+ * server's public identity key, encoded as 40 upper-case hexadecimal
+ * characters), or null if no such status entry exists; convenience
+ * method for {@code getStatusEntries().get(fingerprint)}.
+ *
+ * @since 1.0.0
+ */
public NetworkStatusEntry getStatusEntry(String fingerprint);
- /* Return directory signatures. */
+ /**
+ * Return the directory signature of this vote, with the single map key
+ * being the SHA-1 digest of the authority's identity key in the version
+ * 3 directory protocol, encoded as 40 upper-case hexadecimal
+ * characters.
+ *
+ * @since 1.0.0
+ */
public SortedMap<String, DirectorySignature> getDirectorySignatures();
}
diff --git a/src/org/torproject/descriptor/RelayServerDescriptor.java b/src/org/torproject/descriptor/RelayServerDescriptor.java
index 402ddfc..6ef3140 100644
--- a/src/org/torproject/descriptor/RelayServerDescriptor.java
+++ b/src/org/torproject/descriptor/RelayServerDescriptor.java
@@ -1,8 +1,19 @@
-/* Copyright 2015 The Tor Project
+/* Copyright 2015--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
-/* Contains a relay server descriptor. */
+/**
+ * Contains a relay server descriptor.
+ *
+ * <p>Relay server descriptors share many contents with sanitized bridge
+ * server descriptors ({@link BridgeServerDescriptor}), which is why they
+ * share a common superinterface ({@link ServerDescriptor}). The main
+ * purpose of having two subinterfaces is being able to distinguish
+ * descriptor types more easily.</p>
+ *
+ * @since 1.1.0
+ */
public interface RelayServerDescriptor extends ServerDescriptor {
}
diff --git a/src/org/torproject/descriptor/RouterStatusEntry.java b/src/org/torproject/descriptor/RouterStatusEntry.java
index 978e6e1..f9a56db 100644
--- a/src/org/torproject/descriptor/RouterStatusEntry.java
+++ b/src/org/torproject/descriptor/RouterStatusEntry.java
@@ -1,20 +1,51 @@
-/* Copyright 2012--2015 The Tor Project
+/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
-/* Status entry contained in a v1 signed directory. */
+/**
+ * Contains a router status entry contained in a signed directory in the
+ * version 1 directory protocol.
+ *
+ * <p>Directory authorities in the (long outdated) version 1 of the
+ * directory protocol included router status entries with short summaries
+ * of the status of each server in the signed directories they produced
+ * ({@link RelayDirectory}). These entries contained references to server
+ * descriptors published by relays together with the authorities' opinion
+ * on whether relays were verified and live.</p>
+ *
+ * @since 1.0.0
+ */
public interface RouterStatusEntry {
- /* Return the relay nickname, or null if the relay is unverified. */
+ /**
+ * Return the relay nickname consisting of 1 to 19 alphanumeric
+ * characters, or null if the relay is unverified.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the relay fingerprint. */
+ /**
+ * Return a SHA-1 digest of the relay's identity key, encoded as 40
+ * upper-case hexadecimal characters.
+ *
+ * @since 1.0.0
+ */
public String getFingerprint();
- /* Return whether the relay is verified. */
+ /**
+ * Return whether the relay is verified.
+ *
+ * @since 1.0.0
+ */
public boolean isVerified();
- /* Return whether the relay is live. */
+ /**
+ * Return whether the relay is live.
+ *
+ * @since 1.0.0
+ */
public boolean isLive();
}
diff --git a/src/org/torproject/descriptor/ServerDescriptor.java b/src/org/torproject/descriptor/ServerDescriptor.java
index 49eaa92..17c7e82 100644
--- a/src/org/torproject/descriptor/ServerDescriptor.java
+++ b/src/org/torproject/descriptor/ServerDescriptor.java
@@ -1,195 +1,427 @@
-/* Copyright 2011--2015 The Tor Project
+/* Copyright 2011--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
-/* Contains a relay or bridge server descriptor. */
+/**
+ * Contains a relay or sanitized bridge server descriptor.
+ *
+ * <p>Relays publish server descriptors to the directory authorities to
+ * register in the network. Server descriptors contain information about
+ * the capabilities of a server, like their exit policy, that clients use
+ * to select servers for their circuits (along with information provided
+ * by directory authorities on reachability, stability, and capacity of
+ * servers). Server descriptors also contain network addresses and
+ * cryptographic material that clients use to build circuits.</p>
+ *
+ * <p>Prior to the introduction of microdescriptors
+ * ({@link Microdescriptor}), the directory authorities included
+ * cryptographic digests of server descriptors in network statuses
+ * ({@link RelayNetworkStatusConsensus}) and clients downloaded all
+ * referenced server descriptors. Nowadays, the directory authorities
+ * derive microdescriptors from server descriptors and reference those
+ * in network statuses, and clients only download microdescriptors instead
+ * of server descriptors.</p>
+ *
+ * <p>Bridges publish server descriptors to the bridge directory
+ * authority, also to announce themselves in the network. The bridge
+ * directory authority compiles a list of available bridges
+ * ({@link BridgeNetworkStatus}) for the bridge distribution service
+ * BridgeDB. There are no microdescriptors for bridges, so that bridge
+ * clients still rely on downloading bridge server descriptors directly
+ * from the bridge they're connecting to.</p>
+ *
+ * <p>It's worth noting that all contents of server descriptors are
+ * written and signed by relays and bridges without a third party
+ * verifying their correctness. The (bridge) directory authorities may
+ * decide to exclude dishonest servers from the network statuses they
+ * produce, but that wouldn't be reflected in server descriptors.</p>
+ *
+ * @since 1.0.0
+ */
public interface ServerDescriptor extends Descriptor {
- /* Return the descriptor digest that is used to reference this server
- * descriptor in a network status. */
+ /**
+ * Return the SHA-1 descriptor digest, encoded as 40 lower-case (relay
+ * descriptors) or upper-case (bridge descriptors) hexadecimal
+ * characters, that is used to reference this descriptor from a network
+ * status descriptor.
+ *
+ * @since 1.0.0
+ */
public String getServerDescriptorDigest();
- /* Return the base64-encoded SHA-256 descriptor digest that may be used
- * to reference this server descriptor in a network status. */
+ /**
+ * Return the SHA-256 descriptor digest, encoded as 43 base64
+ * characters without padding characters, that may be used to reference
+ * this server descriptor from a network status descriptor.
+ *
+ * @since 1.1.0
+ */
public String getServerDescriptorDigestSha256();
- /* Return the relay's nickname. */
+ /**
+ * Return the server's nickname consisting of 1 to 19 alphanumeric
+ * characters.
+ *
+ * @since 1.0.0
+ */
public String getNickname();
- /* Return the relay's IPv4 address in dotted-quad format. */
+ /**
+ * Return the server's primary IPv4 address in dotted-quad format.
+ *
+ * @since 1.0.0
+ */
public String getAddress();
- /* Return the relay's OR port. */
+ /**
+ * Return the TCP port where this server accepts TLS connections for
+ * the main OR protocol, or 0 if the server does not accept such
+ * connections.
+ *
+ * @since 1.0.0
+ */
public int getOrPort();
- /* Return the relay's SOCKS port which should always be 0. */
+ /**
+ * Return the TCP port where this server accepts SOCKS connections,
+ * which is deprecated and should always be 0.
+ *
+ * @since 1.0.0
+ */
public int getSocksPort();
- /* Return the relay's directory port. */
+ /**
+ * Return the TCP port where this server accepts directory-related HTTP
+ * connections, or 0 if the server does not accept such connections.
+ *
+ * @since 1.0.0
+ */
public int getDirPort();
- /* Return the relay's additional OR addresses and ports contained in
- * or-address lines, or an empty list if the descriptor doesn't contain
- * such lines. */
+ /**
+ * Return IP addresses and TCP ports where this server accepts TLS
+ * connections for the main OR protocol, or an empty list if the server
+ * does not support additional addresses or ports; entries are given in
+ * the order as they are listed in the descriptor; IPv4 addresses are
+ * given in dotted-quad format, IPv6 addresses use the colon-separated
+ * hexadecimal format surrounded by square brackets, and TCP ports are
+ * separated from the IP address using a colon.
+ *
+ * @since 1.0.0
+ */
public List<String> getOrAddresses();
- /* Return the average bandwidth in bytes per second that the relay is
- * willing to sustain over long periods. */
+ /**
+ * Return the average bandwidth in bytes per second that the server is
+ * willing to sustain over long periods.
+ *
+ * @since 1.0.0
+ */
public int getBandwidthRate();
- /* Return the burst bandwidth in bytes per second that the relay is
- * willing to sustain in very short intervals. */
+ /**
+ * Return the burst bandwidth in bytes per second that the server is
+ * willing to sustain in very short intervals.
+ *
+ * @since 1.0.0
+ */
public int getBandwidthBurst();
- /* Return the observed bandwidth in bytes per second as an estimate of
- * the capacity that the relay can handle, or -1 if the descriptor
+ /**
+ * Return the observed bandwidth in bytes per second as an estimate of
+ * the capacity that the server can handle, or -1 if the descriptor
* doesn't contain an observed bandwidth value (which is the case for
- * Tor versions 0.0.8 or older). */
+ * Tor 0.0.8 or older).
+ *
+ * @since 1.0.0
+ */
public int getBandwidthObserved();
- /* Return the platform string containing the Tor software version and
- * the operating system, or null if this descriptor does not contain a
- * platform line. */
+ /**
+ * Return a human-readable string describing the Tor software version
+ * and the operating system of this server, which may contain non-ASCII
+ * characters, typically written as {@code "Tor $version on $system"},
+ * or null if this descriptor does not contain a platform line.
+ *
+ * @since 1.0.0
+ */
public String getPlatform();
- /* Return the time when this descriptor and the corresponding extra-info
- * document was generated. */
+ /**
+ * Return the time in milliseconds since the epoch when this descriptor
+ * and the corresponding extra-info descriptor were generated.
+ *
+ * @since 1.0.0
+ */
public long getPublishedMillis();
- /* Return the relay fingerprint, or null if this descriptor does not
- * contain a fingerprint line. */
+ /**
+ * Return a SHA-1 digest of the server's public identity key, encoded
+ * as 40 upper-case hexadecimal characters (without spaces after every 4
+ * characters as opposed to the encoding in the descriptor), that is
+ * typically used to uniquely identify the server, or null if this
+ * descriptor does not contain a fingerprint line.
+ *
+ * @since 1.0.0
+ */
public String getFingerprint();
- /* Return whether the relay was hibernating when this descriptor was
- * published. */
+ /**
+ * Return whether the server was hibernating when this descriptor was
+ * published and should not be used to build circuits.
+ *
+ * @since 1.0.0
+ */
public boolean isHibernating();
- /* Return the number of seconds that this relay has been running (which
- * might even be negative in a few descriptors due to a bug that was
- * fixed in 0.1.2.7-alpha), or null if the descriptor does not contain
- * an uptime line. */
+ /**
+ * Return the number of seconds that the server process has been
+ * running (which might even be negative in a few descriptors due to a
+ * bug that was fixed in Tor 0.1.2.7-alpha), or null if the descriptor
+ * does not contain an uptime line.
+ *
+ * @since 1.0.0
+ */
public Long getUptime();
- /* Return the onion key in PEM format, or null if the descriptor
- * doesn't contain a signing key (which is the case in sanitized bridge
- * descriptors). */
+ /**
+ * Return the RSA-1024 public key in PEM format used to encrypt CREATE
+ * cells for this server, or null if the descriptor doesn't contain an
+ * onion key (which is the case in sanitized bridge descriptors).
+ *
+ * @since 1.0.0
+ */
public String getOnionKey();
- /* Return the signing key in PEM format, or null if the descriptor
- * doesn't contain a signing key (which is the case in sanitized bridge
- * descriptors). */
+ /**
+ * Return the RSA-1024 public key in PEM format used by this server as
+ * long-term identity key, or null if the descriptor doesn't contain a
+ * signing key (which is the case in sanitized bridge descriptors).
+ *
+ * @since 1.0.0
+ */
public String getSigningKey();
- /* Return the relay's exit policy consisting of one or more accept or
- * reject lines. */
+ /**
+ * Return the server's exit policy consisting of one or more accept or
+ * reject rules that the server follows when deciding whether to allow a
+ * new stream to a given IP address and TCP port.
+ *
+ * @since 1.0.0
+ */
public List<String> getExitPolicyLines();
- /* Return the signature of the PKCS1-padded server descriptor digest, or
- * null if the descriptor doesn't contain a signature (which is the case
- * in sanitized bridge descriptors). */
+ /**
+ * Return the RSA-1024 signature of the PKCS1-padded descriptor digest,
+ * taken from the beginning of the router line through the newline after
+ * the router-signature line, or null if the descriptor doesn't contain
+ * a signature (which is the case in sanitized bridge descriptors).
+ *
+ * @since 1.0.0
+ */
public String getRouterSignature();
- /* Return the contact information for this relay, or null if no contact
- * information is included in the descriptor. */
+ /**
+ * Return the contact information for this server, which may contain
+ * non-ASCII characters, or null if no contact information is included
+ * in the descriptor.
+ *
+ * @since 1.0.0
+ */
public String getContact();
- /* Return nicknames, ($-prefixed) fingerprints, $fingerprint=nickname,
- * or $fingerprint~nickname tuples contained in the family line of this
- * relay, or null if the descriptor does not contain a family line. */
+ /**
+ * Return nicknames, $-prefixed identity fingerprints, or tuples of the
+ * format {@code $fingerprint=nickname} or {@code $fingerprint~nickname}
+ * of servers contained in this server's family, or null if the
+ * descriptor does not contain a family line.
+ *
+ * @since 1.0.0
+ */
public List<String> getFamilyEntries();
- /* Return the relay's read history. (Current Tor versions include their
- * bandwidth histories in their extra-info descriptors, not in their
- * server descriptors.) */
+ /**
+ * Return the server's history of read bytes, or null if the descriptor
+ * does not contain a bandwidth history; current Tor versions include
+ * bandwidth histories in their extra-info descriptors
+ * ({@link ExtraInfoDescriptor#getReadHistory()}), not in their server
+ * descriptors.
+ *
+ * @since 1.0.0
+ */
public BandwidthHistory getReadHistory();
- /* Return the relay's write history. (Current Tor versions include
- * their bandwidth histories in their extra-info descriptors, not in
- * their server descriptors.) */
+ /**
+ * Return the server's history of written bytes, or null if the
+ * descriptor does not contain a bandwidth history; current Tor versions
+ * include bandwidth histories in their extra-info descriptors
+ * ({@link ExtraInfoDescriptor#getWriteHistory()}), not in their server
+ * descriptors.
+ *
+ * @since 1.0.0
+ */
public BandwidthHistory getWriteHistory();
- /* Return true if the relay uses the enhanced DNS logic, or false if
+ /**
+ * Return true if the server uses the enhanced DNS logic, or false if
* doesn't use it or doesn't include an eventdns line in its
- * descriptor. */
+ * descriptor; current Tor versions should be presumed to have the evdns
+ * backend.
+ *
+ * @since 1.0.0
+ */
public boolean getUsesEnhancedDnsLogic();
- /* Return whether this relay is a directory cache that provides
- * extra-info descriptors. */
+ /**
+ * Return whether this server is a directory cache that provides
+ * extra-info descriptors.
+ *
+ * @since 1.0.0
+ */
public boolean getCachesExtraInfo();
- /* Return the digest of the relay's extra-info descriptor, or null if
- * the relay did not upload a corresponding extra-info descriptor. */
+ /**
+ * Return the SHA-1 digest of the server's extra-info descriptor,
+ * encoded as 40 upper-case hexadecimal characters, or null if the
+ * server did not upload a corresponding extra-info descriptor.
+ *
+ * @since 1.0.0
+ */
public String getExtraInfoDigest();
- /* Return the base64-encoded SHA-256 digest of the extra-info descriptor
- * referenced from this server descriptor, or null if the relay either
- * did not upload a corresponding extra-info descriptor or did not refer
- * to it using a SHA-256 digest. */
+ /**
+ * Return the SHA-256 digest of the server's extra-info descriptor,
+ * encoded as 43 base64 characters without padding characters, or null
+ * if the server either did not upload a corresponding extra-info
+ * descriptor or did not refer to it using a SHA-256 digest.
+ *
+ * @since 1.1.0
+ */
public String getExtraInfoDigestSha256();
- /* Return the hidden service descriptor version(s) that this relay
- * stores and serves, or null if it doesn't store and serve any hidden
- * service descriptors. */
+ /**
+ * Return the list of hidden service descriptor version numbers that
+ * this server stores and serves, or null if it doesn't store and serve
+ * any hidden service descriptors.
+ *
+ * @since 1.0.0
+ */
public List<Integer> getHiddenServiceDirVersions();
- /* Return the list of link protocol versions that this relay
- * supports. */
+ /**
+ * Return the list of link protocol versions that this server
+ * supports.
+ *
+ * @since 1.0.0
+ */
public List<Integer> getLinkProtocolVersions();
- /* Return the list of circuit protocol versions that this relay
- * supports. */
+ /**
+ * Return the list of circuit protocol versions that this server
+ * supports.
+ *
+ * @since 1.0.0
+ */
public List<Integer> getCircuitProtocolVersions();
- /* Return whether this relay allows single-hop circuits to make exit
- * connections. */
+ /**
+ * Return whether this server allows single-hop circuits to make exit
+ * connections.
+ *
+ * @since 1.0.0
+ */
public boolean getAllowSingleHopExits();
- /* Return the default policy of the IPv6 port summary or null if the
- * server descriptor didn't contain an IPv6 port summary line. */
+ /**
+ * Return the default policy, {@code "accept"} or {@code "reject"}, of
+ * the IPv6 port summary, or null if the descriptor didn't contain an
+ * IPv6 exit-policy summary line which is equivalent to rejecting all
+ * streams to IPv6 targets.
+ *
+ * @since 1.0.0
+ */
public String getIpv6DefaultPolicy();
- /* Return the port list of the IPv6 port summary or null if the server
- * descriptor didn't contain an IPv6 port summary line. */
+ /**
+ * Return the port list of the IPv6 exit-policy summary, or null if the
+ * descriptor didn't contain an IPv6 exit-policy summary line which is
+ * equivalent to rejecting all streams to IPv6 targets.
+ *
+ * @since 1.0.0
+ */
public String getIpv6PortList();
- /* Return the ntor onion key base64 string with padding omitted, or null
- * if the server descriptors didn't contain an ntor onion key line. */
+ /**
+ * Return the curve25519 public key, encoded as 43 base64 characters
+ * without padding characters, that is used for the ntor circuit
+ * extended handshake, or null if the descriptor didn't contain an
+ * ntor-onion-key line. */
public String getNtorOnionKey();
- /* Return the base64-encoded Ed25519 certificate, or null if the
- * descriptor doesn't contain one. */
+ /**
+ * Return the Ed25519 certificate in PEM format, or null if the
+ * descriptor doesn't contain one.
+ *
+ * @since 1.1.0
+ */
public String getIdentityEd25519();
- /* Return the base64-encoded Ed25519 master key, which may either be
- * parsed from the optional "master-key-ed25519" line or derived from
- * the (likewise optional) Ed25519 certificate following the
- * "identity-ed25519" line, or null if the descriptor contains neither
- * Ed25519 master key nor Ed25519 certificate. */
+ /**
+ * Return the Ed25519 master key, encoded as 43 base64 characters
+ * without padding characters, which was either parsed from the optional
+ * {@code "master-key-ed25519"} line or derived from the (likewise
+ * optional) Ed25519 certificate following the
+ * {@code "identity-ed25519"} line, or null if the descriptor contains
+ * neither Ed25519 master key nor Ed25519 certificate.
+ *
+ * @since 1.1.0
+ */
public String getMasterKeyEd25519();
- /* Return the base64-encoded Ed25519 signature of a SHA-256 digest of
- * the entire descriptor, from the first character up to and including
- * the first space after the "router-sig-ed25519" string, prefixed with
- * the string "Tor router descriptor signature v1". */
+ /**
+ * Return the Ed25519 signature of the SHA-256 digest of the entire
+ * descriptor, encoded as 86 base64 characters without padding
+ * characters, from the first character up to and including the first
+ * space after the {@code "router-sig-ed25519"} string, prefixed with
+ * the string {@code "Tor router descriptor signature v1"}.
+ *
+ * @since 1.1.0
+ */
public String getRouterSignatureEd25519();
- /* Return an RSA signature, generated using the onion-key, that proves
- * that the party creating the descriptor had control over the secret
- * key corresponding to the onion-key, or null if the descriptor does
- * not contain such a signature. */
+ /**
+ * Return an RSA-1024 signature in PEM format, generated using the
+ * server's onion key, that proves that the party creating the
+ * descriptor had control over the private key corresponding to the
+ * onion key, or null if the descriptor does not contain such a
+ * signature.
+ *
+ * @since 1.1.0
+ */
public String getOnionKeyCrosscert();
- /* Return an Ed25519 signature, generated using the ntor-onion-key, that
- * proves that the party creating the descriptor had control over the
- * secret key corresponding to the ntor-onion-key, or null if the
- * descriptor does not contain such a signature. */
+ /**
+ * Return an Ed25519 signature in PEM format, generated using the
+ * server's ntor onion key, that proves that the party creating the
+ * descriptor had control over the private key corresponding to the ntor
+ * onion key, or null if the descriptor does not contain such a
+ * signature.
+ *
+ * @since 1.1.0
+ */
public String getNtorOnionKeyCrosscert();
- /* Return the sign of the Ed25519 public key corresponding to the ntor
+ /**
+ * Return the sign of the Ed25519 public key corresponding to the ntor
* onion key as 0 or 1, or -1 if the descriptor does not contain this
- * information. */
+ * information.
+ *
+ * @since 1.1.0
+ */
public int getNtorOnionKeyCrosscertSign();
}
diff --git a/src/org/torproject/descriptor/TorperfResult.java b/src/org/torproject/descriptor/TorperfResult.java
index 9c47a61..188200b 100644
--- a/src/org/torproject/descriptor/TorperfResult.java
+++ b/src/org/torproject/descriptor/TorperfResult.java
@@ -1,97 +1,215 @@
/* Copyright 2012--2016 The Tor Project
* See LICENSE for licensing information */
+
package org.torproject.descriptor;
import java.util.List;
import java.util.SortedMap;
+/**
+ * Contains performance measurement results from making simple HTTP
+ * requests over the Tor network.
+ *
+ * <p>The performance measurement service Torperf publishes performance
+ * data from making simple HTTP requests over the Tor network. Torperf
+ * uses a trivial SOCKS client to download files of various sizes over the
+ * Tor network and notes how long substeps take.</p>
+ *
+ * @since 1.0.0
+ */
public interface TorperfResult extends Descriptor {
- /* Return all unrecognized keys together with their values, or null if
- * all keys were recognized. */
+ /**
+ * Return all unrecognized keys together with their values, or null if
+ * all keys were recognized.
+ *
+ * @since 1.2.0
+ */
public SortedMap<String, String> getUnrecognizedKeys();
- /* Return the configured name of the data source. */
+ /**
+ * Return the configured name of the data source.
+ *
+ * @since 1.0.0
+ */
public String getSource();
- /* Return the configured file size in bytes. */
+ /**
+ * Return the configured file size in bytes.
+ *
+ * @since 1.0.0
+ */
public int getFileSize();
- /* Return the time when the connection process starts. */
+ /**
+ * Return the time in milliseconds since the epoch when the connection
+ * process started.
+ *
+ * @since 1.0.0
+ */
public long getStartMillis();
- /* Return the time when the socket was created. */
+ /**
+ * Return the time in milliseconds since the epoch when the socket was
+ * created.
+ *
+ * @since 1.0.0
+ */
public long getSocketMillis();
- /* Return the time when the socket was connected. */
+ /**
+ * Return the time in milliseconds since the epoch when the socket was
+ * connected.
+ *
+ * @since 1.0.0
+ */
public long getConnectMillis();
- /* Return the time when SOCKS 5 authentication methods have been
- * negotiated. */
+ /**
+ * Return the time in milliseconds since the epoch when SOCKS 5
+ * authentication methods have been negotiated.
+ *
+ * @since 1.0.0
+ */
public long getNegotiateMillis();
- /* Return the time when the SOCKS request was sent. */
+ /**
+ * Return the time in milliseconds since the epoch when the SOCKS
+ * request was sent.
+ *
+ * @since 1.0.0
+ */
public long getRequestMillis();
- /* Return the time when the SOCKS response was received. */
+ /**
+ * Return the time in milliseconds since the epoch when the SOCKS
+ * response was received.
+ *
+ * @since 1.0.0
+ */
public long getResponseMillis();
- /* Return the time when the HTTP request was written. */
+ /**
+ * Return the time in milliseconds since the epoch when the HTTP
+ * request was written.
+ *
+ * @since 1.0.0
+ */
public long getDataRequestMillis();
- /* Return the time when the first response was received. */
+ /**
+ * Return the time in milliseconds since the epoch when the first
+ * response was received.
+ *
+ * @since 1.0.0
+ */
public long getDataResponseMillis();
- /* Return the time when the payload was complete. */
+ /**
+ * Return the time in milliseconds since the epoch when the payload was
+ * complete.
+ *
+ * @since 1.0.0
+ */
public long getDataCompleteMillis();
- /* Return the total number of bytes written. */
+ /**
+ * Return the total number of bytes written.
+ *
+ * @since 1.0.0
+ */
public int getWriteBytes();
- /* Return the total number of bytes read. */
+ /**
+ * Return the total number of bytes read.
+ *
+ * @since 1.0.0
+ */
public int getReadBytes();
- /* Return whether the request timed out (as opposed to failing), or null
- * if the torperf line didn't contain that information. */
+ /**
+ * Return whether the request timed out (as opposed to failing), or
+ * null if the torperf line didn't contain that information.
+ *
+ * @since 1.0.0
+ */
public Boolean didTimeout();
- /* Return the times when x% of expected bytes were read for
- * 0 <= x <= 100, or null if the torperf line didn't contain that
- * information. */
+ /**
+ * Return the times in milliseconds since the epoch when {@code x%} of
+ * expected bytes were read for {@code 0 <= x <= 100}, or null if the
+ * torperf line didn't contain that information.
+ *
+ * @since 1.0.0
+ */
public SortedMap<Integer, Long> getDataPercentiles();
- /* Return the time when the circuit was launched, or -1 if the torperf
- * line didn't contain that information. */
+ /**
+ * Return the time in milliseconds since the epoch when the circuit was
+ * launched, or -1 if the torperf line didn't contain that
+ * information.
+ *
+ * @since 1.0.0
+ */
public long getLaunchMillis();
- /* Return the time when the circuit was used, or -1 if the torperf line
- * didn't contain that information. */
+ /**
+ * Return the time in milliseconds since the epoch when the circuit was
+ * used, or -1 if the torperf line didn't contain that information.
+ *
+ * @since 1.0.0
+ */
public long getUsedAtMillis();
- /* Return a list of fingerprints of the relays in the circuit, or null
- * if the torperf line didn't contain that information. */
+ /**
+ * Return a list of fingerprints of the relays in the circuit, or null
+ * if the torperf line didn't contain that information.
+ *
+ * @since 1.0.0
+ */
public List<String> getPath();
- /* Return a list of times in millis when circuit hops were built, or
- * null if the torperf line didn't contain that information. */
+ /**
+ * Return a list of times in milliseconds since the epoch when circuit
+ * hops were built, or null if the torperf line didn't contain that
+ * information.
+ *
+ * @since 1.0.0
+ */
public List<Long> getBuildTimes();
- /* Return the circuit build timeout that the Tor client used when
+ /**
+ * Return the circuit build timeout that the Tor client used when
* building this circuit, or -1 if the torperf line didn't contain that
- * information. */
+ * information.
+ *
+ * @since 1.0.0
+ */
public long getTimeout();
- /* Return the circuit build time quantile that the Tor client uses to
- * determine its circuit-build timeout, or -1.0 if the torperf line
- * didn't contain that information. */
+ /**
+ * Return the circuit build time quantile that the Tor client uses to
+ * determine its circuit-build timeout, or -1 if the torperf line
+ * didn't contain that information.
+ *
+ * @since 1.0.0
+ */
public double getQuantile();
- /* Return the identifier of the circuit used for this measurement, or -1
- * if the torperf line didn't contain that information. */
+ /**
+ * Return the identifier of the circuit used for this measurement, or
+ * -1 if the torperf line didn't contain that information.
+ *
+ * @since 1.0.0
+ */
public int getCircId();
- /* Return the identifier of the stream used for this measurement, or -1
- * if the torperf line didn't contain that information. */
+ /**
+ * Return the identifier of the stream used for this measurement, or -1
+ * if the torperf line didn't contain that information.
+ *
+ * @since 1.0.0
+ */
public int getUsedBy();
}
diff --git a/src/org/torproject/descriptor/package-info.java b/src/org/torproject/descriptor/package-info.java
new file mode 100644
index 0000000..5b34554
--- /dev/null
+++ b/src/org/torproject/descriptor/package-info.java
@@ -0,0 +1,80 @@
+/* Copyright 2016 The Tor Project
+ * See LICENSE for licensing information */
+
+/**
+ * Interfaces and essential classes for obtaining and processing Tor
+ * descriptors.
+ *
+ * <p>This package contains all relevant interfaces and
+ * classes that an application would need to use this library.
+ * Applications are strongly discouraged from accessing types from the
+ * implementation package ({@code org.torproject.descriptor.impl})
+ * directly, because those may change without prior notice.</p>
+ *
+ * <p>Interfaces and classes in this package can be grouped into
+ * general-purpose types to obtain and process any type of descriptor and
+ * descriptors produced by different components of the Tor network:</p>
+ *
+ * <ol>
+ * <li>General-purpose types comprise
+ * {@link org.torproject.descriptor.DescriptorSourceFactory} which is the
+ * main entry point into using this library. This factory is used to
+ * create the descriptor sources for obtaining remote descriptor data
+ * ({@link org.torproject.descriptor.DescriptorDownloader} and
+ * {@link org.torproject.descriptor.DescriptorCollector}) and descriptor
+ * sources for processing local descriptor data
+ * ({@link org.torproject.descriptor.DescriptorReader} and
+ * {@link org.torproject.descriptor.DescriptorParser}). General-purpose
+ * types also include descriptor containers
+ * ({@link org.torproject.descriptor.DescriptorRequest} and
+ * {@link org.torproject.descriptor.DescriptorFile}) and the
+ * superinterface for all provided descriptors
+ * ({@link org.torproject.descriptor.Descriptor}).</li>
+ *
+ * <li>The first group of descriptors is published by relays and servers
+ * in the Tor network. These interfaces include server descriptors
+ * ({@link org.torproject.descriptor.ServerDescriptor} with subinterfaces
+ * {@link org.torproject.descriptor.RelayServerDescriptor} and
+ * {@link org.torproject.descriptor.BridgeServerDescriptor}), extra-info
+ * descriptors ({@link org.torproject.descriptor.ExtraInfoDescriptor} with
+ * subinterfaces
+ * {@link org.torproject.descriptor.RelayExtraInfoDescriptor} and
+ * {@link org.torproject.descriptor.BridgeExtraInfoDescriptor}),
+ * microdescriptors which are derived from server descriptors by the
+ * directory authorities
+ * ({@link org.torproject.descriptor.Microdescriptor}), and helper types
+ * for parts of the aforementioned descriptors
+ * ({@link org.torproject.descriptor.BandwidthHistory}).</li>
+ *
+ * <li>The second group of descriptors is generated by authoritative
+ * directory servers that form an opinion about relays and bridges in the
+ * Tor network. These include descriptors specified in version 3 of the
+ * directory protocol
+ * ({@link org.torproject.descriptor.RelayNetworkStatusConsensus},
+ * {@link org.torproject.descriptor.RelayNetworkStatusVote},
+ * {@link org.torproject.descriptor.DirectoryKeyCertificate}, and helper
+ * types for descriptor parts
+ * {@link org.torproject.descriptor.DirSourceEntry},
+ * {@link org.torproject.descriptor.NetworkStatusEntry}, and
+ * {@link org.torproject.descriptor.DirectorySignature}), descriptors from
+ * earlier directory protocol version 2
+ * ({@link org.torproject.descriptor.RelayNetworkStatus}) and version 1
+ * ({@link org.torproject.descriptor.RelayDirectory} and
+ * {@link org.torproject.descriptor.RouterStatusEntry}), as well as
+ * descriptors published by the bridge authority and sanitized by the
+ * CollecTor service
+ * ({@link org.torproject.descriptor.BridgeNetworkStatus}).</li>
+ *
+ * <li>The third group of descriptors is created by auxiliary services
+ * connected to the Tor network rather than by the Tor software. This
+ * group comprises descriptors by the bridge distribution service BridgeDB
+ * ({@link org.torproject.descriptor.BridgePoolAssignment}), the exit list
+ * service TorDNSEL ({@link org.torproject.descriptor.ExitList}), and the
+ * performance measurement service Torperf
+ * ({@link org.torproject.descriptor.TorperfResult}).</li>
+ * </ol>
+ *
+ * @since 1.0.0
+ */
+package org.torproject.descriptor;
+
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits