<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en" style='--code-editor-font: var(--default-mono-font, "GitLab Mono"), JetBrains Mono, Menlo, DejaVu Sans Mono, Liberation Mono, Consolas, Ubuntu Mono, Courier New, andale mono, lucida console, monospace;'>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>
GitLab
</title>

<style data-premailer="ignore" type="text/css">
a { color: #1068bf; }
</style>


<style>img {
max-width: 100%; height: auto;
}
body {
font-size: .875rem;
}
body {
-webkit-text-shadow: hsla(0,0%,100%,.01) 0 0 1px;
}
body {
font-family: "GitLab Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans",Ubuntu,Cantarell,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; font-size: inherit;
}
</style>
</head>
<body style='font-size: inherit; -webkit-text-shadow: hsla(0,0%,100%,.01) 0 0 1px; font-family: "GitLab Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans",Ubuntu,Cantarell,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";'>
<div class="content">

<h3 style="margin-top: 20px; margin-bottom: 10px;">
Masayuki Hatta pushed to branch master at <a href="https://salsa.debian.org/java-team/orchid">Debian Java Maintainers / orchid</a>
</h3>
<h4 style="margin-top: 10px; margin-bottom: 10px;">
Commits:
</h4>
<ul>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/2a32da7efaf7e2a6b0c1d329118413f8b42d87fe">2a32da7e</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>circuits, connections: close on cells nobody asked for

A relay could make Orchid queue cells that nobody would ever take out
of the queue, until the heap was full:

- Link handshake cells (VERSIONS, CERTS, AUTH_CHALLENGE, NETINFO) were
  queued without limit, also after the handshake.  CERTS cells can be
  64 KiB long, and any relay we connect to could send them.  The queue
  now holds 8 cells, and any of these cells after the handshake closes
  the connection.
- Replies on a circuit (EXTENDED2, RENDEZVOUS_ESTABLISHED, INTRODUCE_ACK,
  RENDEZVOUS2, and CREATED2 / CREATED_FAST) were queued whether or not a
  request was waiting for them.  A reply is now accepted only for a
  request we sent; any other closes the circuit as a protocol violation,
  as in Tor.  EXTENDED and RESOLVED, which Orchid never asks for, always
  do.  The reply queues are bounded as well.
- TRUNCATED was queued as well.  It is still the answer to a pending
  request (a failed EXTEND2); otherwise the circuit is closed.
- A DATA cell beyond a stream's delivery window was buffered first and
  counted afterwards; the exception that followed did not close the
  circuit.  An exit relay could thus keep sending DATA cells to an
  application that does not read them.  The window is now checked
  first, and a DATA cell beyond it closes the circuit.  So does a stream
  SENDME that would open the package window beyond its initial size.

Cells for circuits that are not open on the connection are still
dropped, as some arrive normally after we destroy a circuit, but they
are now reported at most once a minute instead of with one warning
each, so that a relay cannot fill the log with them.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/f504585eae85828ed86cfec7945b811600645fbc">f504585e</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>directory: refuse a consensus that is far outside its validity period

A consensus was used as long as its signatures were good and it was not
older than the current one, however long ago it had expired or however
far in the future it became valid.  An old consensus lists relays that
may be gone and keys and flags that have changed, and anyone who kept a
copy can replay it: whoever serves directory documents could pin a
client to the network of an earlier day.

Use a consensus only from a day before its valid-after time until a day
after its valid-until time, as Tor does (REASONABLY_LIVE_TIME), so that
a client whose consensus has just expired, or whose clock is a little
off, keeps working while it fetches a new one.  The warning mentions the
system clock, the usual reason on a phone.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/eb6927c8b6e35b986a730e4a7fd036631940630b">eb6927c8</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>directory: require dir-key-crosscert in key certificates

dir-spec requires the dir-key-crosscert of a key certificate exactly
once: the signing key signs the digest of the identity key with it, to
show that its holder agreed to be certified by that authority.  Orchid
verified the cross certificate when there was one but accepted a
certificate without it.  Such a certificate is now invalid.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/dd90f163311ac4339155917b172418a975e22960">dd90f163</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>path: keep relays that share a family ID off the same circuit

Tor 0.4.9 relays prove that they belong to a family with a family key
(Happy Families, proposal 321), and their microdescriptors list the
family IDs in a "family-ids" line.  Orchid ignored that line and kept
relays apart only by their "family" lines, which list the members by
fingerprint and must be mutual.  The "family" lines are to be dropped
once enough clients understand family IDs, and then Orchid would put
two relays of one operator on the same circuit.

Parse "family-ids", and treat relays that share a family ID as one
family when choosing a path.  Router and Descriptor have a new method,
getFamilyIds(), with a default that returns an empty set, so other
implementations still compile.  Full router descriptors carry a family
certificate instead, which Orchid does not verify; with microdescriptors
turned off, only the "family" lines are used, as before.

CircuitPathChooser#areRelated() now says whether two relays may not
share a circuit: the same relay, the same /16, mutual "family" lines or
a shared family ID, as Tor's nodes_in_same_family() does.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/4a461cd699fc415ae9320f3b40f9aa2c83eeaccb">4a461cd6</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>hs: do not extend a circuit to a relay related to one already on it

An introduction point or an HSDir is chosen by the onion service, or
by the hash ring, not by us.  Orchid took any clean internal circuit and
extended it to that relay, even when the relay was already on the
circuit, or in the family or the /16 of a relay on it.  Tor does not
cannibalize such a circuit (circuit_find_to_cannibalize()).

Check the target against every hop with CircuitPathChooser#areRelated()
before extending.  If it is related, the extension fails, the circuit is
closed, and the next introduction point or HSDir is tried, as after any
other failure to extend.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/a9e6ede6b087bc821403a2829e65a362ee94ad4c">a9e6ede6</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>sockets: make the DNS placeholder an address that goes nowhere

OrchidSocketFactory.unresolvedAddress() returned 0.0.0.0 carrying the
host name.  An application that set its HTTP client's DNS hook but
forgot the socket factory then connected with ordinary sockets to
0.0.0.0, which Linux and Android treat as the local machine: the
request reached whatever listens on the device, instead of failing.

Return 240.0.0.1 instead.  240.0.0.0/4 is reserved and not routed, so
such a connection fails.  Orchid's sockets treat it as the host name, as
before, and still accept the old 0.0.0.0 placeholder.

OrchidSocketFactory#createSocket(InetAddress, int) now also passes a
placeholder's host name to the exit relay, instead of its address.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/6dbb3f5fc7388778965bc610a6ec6957fadd0305">6dbb3f5f</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>circuits: check host names, and never send an onion address to an exit

Host names from applications and SOCKS clients were passed on as they
were:

- ".onion" was matched case sensitively, and with no trailing dot, so
  "x.ONION" or "x.onion." went to an exit relay, which then learned the
  onion address.  Onion addresses are now recognized in any case and
  with a trailing dot, and passed to the onion service code in lower
  case.
- A NUL, a colon, white space or a control character in the name
  changed the "host:port" string of the BEGIN cell.  Such names, empty
  names and names longer than 255 characters are refused.
- ClientRejectInternalAddress refused only the RFC 1918 ranges.  It now
  refuses every address that is not public, as Tor does: 0/8, loopback,
  link local, 100.64/10, multicast and the reserved range, as well as
  "localhost" and names under it.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/da7a02cbef44768128e3fc3bee56314f60afaae6">da7a02cb</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>directory: restrict an existing data directory to its owner as well

The data directory holds the entry guards and any onion service client
authorization keys.  Orchid made it accessible to its owner only when it
created it, and left an existing one as it was, such as one created by
an earlier version or by hand.  Restrict it on every start, as Tor does
with its own data directory.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/e7190b5179fa35f86f3164926f680ffd5ebaacae">e7190b51</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>connections: send neither the time nor an address of our own in NETINFO

Orchid's NETINFO cell carried the current time and 0.0.0.0 as its own
address.  The offset of the time tells a relay how far the device's
clock is off, which can recognize a client across connections.  Send 0
as the time and no addresses of our own, as Tor clients do (tor-spec,
section 4.5).
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/651939d97c0d6ab665bc7b90408d0d7e01d3f66d">651939d9</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>circuits, hs: limit the number of isolation groups

Streams with different isolation keys (SOCKS credentials, or the key
given to TorClient#openExitStreamTo()) never share a circuit.  There was
no limit on the number of keys, so a program that changed its SOCKS user
name on every connection made Orchid build circuits without end: a load
on the guards, and a pattern of traffic unlike that of other clients.
The table of rendezvous circuits of an onion service also kept one
entry for every key ever used.

At most 64 isolation keys may now have exit circuits or waiting streams
at the same time, and as many may have rendezvous circuits to one onion
service.  A stream with a new key beyond that fails to open; streams
without a key are not affected.  Closed rendezvous circuits are removed
from the table.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/62288c2f4342542e8369d4197326daa95bf9a172">62288c2f</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>crypto: check the certified key type of onion service certificates

Ed25519Certificate#isValid(), which checks the certificates of v3 onion
service descriptors, ignored CERT_KEY_TYPE.  These certificates all
certify Ed25519 keys; one that names another key type (the digest of an
RSA key or of an X.509 certificate, cert-spec section 2.1) is the wrong
certificate, even if its signature is good.  It is now refused.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/6be544184fdb650b601ce3a33fd6467579babcae">6be54418</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>circuits: skip stream ids in use, and make the hop list safe to read

Stream ids are 16 bits and wrap around.  After wrapping, a new stream
could get the id of a stream that was still open, which was then
replaced in the stream table and could no longer be read or closed.
Skip ids in use, as Tor does.

The list of hops of a circuit was an ArrayList, read by the cell reading
thread for every cell it decrypts while the building thread appends
hops to it.  It is now a CopyOnWriteArrayList; it changes only a few
times per circuit.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/ed400181eeae7ba574908238032e9fe27bc7f121">ed400181</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>sockets: deprecate OrchidSocketImplFactory

Installing it with Socket#setSocketImplFactory sends every socket of the
process through Tor, including those of libraries that do not expect
it, and Socket#setSocketImplFactory itself is deprecated since Java 17.
TorClient#getSocketFactory() affects only the clients that are given
the factory.  OrchidSocketImplFactory is to be removed in Orchid 3.0.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/24817e8f587fd545678dd4b9a0536437c2feb75e">24817e8f</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>dashboard: do not start on Android

The dashboard has no authentication and shows the entry guards, the
circuits and the streams.  On a desktop only the local user's programs
can usually reach 127.0.0.1, but on Android every app on the device can,
so another app could watch how the user's traffic is routed.  It is a
debugging tool; on Android it is now started only when the system
property com.subgraph.orchid.dashboard.allowOnAndroid is "true".
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/3b08cc251fc893410ceaff005b12bdeb2b670800">3b08cc25</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>ci: pin the actions to commit SHAs, and check that the jars are reproducible

The actions were referred to by tags, which their owners can move to
other code.  They are now pinned to the commit SHAs of their current
v4 releases, which the comments name.

A new job builds the jars twice, in two directories, and compares them
byte for byte, as doc/RELEASING.md describes for releases.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/0fc42a2175609b3058a8825e30f7b83d40514101">0fc42a21</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>samples/android: test the app on emulators

The sample had never been run.  An instrumented test now starts Orchid
on the device, waits for it to bootstrap and checks that a request
through it reaches check.torproject.org from Tor.  It runs with
"gradlew connectedDebugAndroidTest" on a device or a running emulator,
and in a new workflow on emulators with API levels 24 and 35, on pushes
to master and by hand (it needs the Tor network).

The request is moved to a class of its own, TorCheck, which the activity
and the test share; the activity also logs the answer (tag OrchidSample).
A listener added after Orchid failed to start is now told so.
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/259dd5c71b5a6d84191ea1efb4dc72f8f11f5fe0">259dd5c7</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>README: 2.5.0, the dashboard on Android, testing on an emulator
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/fb48ddd3f5cfc90253446476e3c153ecd5feebb3">fb48ddd3</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:03:07+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>samples/android: tell Android Studio which Gradle version to use

The sample has no Gradle wrapper of its own; from the command line it is
built with Orchid's.  Android Studio, which opens samples/android as a
project of its own, then fell back to a Gradle version of its choosing.
Give the sample the wrapper properties of Orchid (the jar and scripts are
not needed for that).
</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/496882930df4bd7e80e89091084931247e21131d">49688293</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:49:25+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>New upstream version 2.5.0+ds</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/199423183d643bb8b8f3cc587b51e6121fb1a5af">19942318</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-05T11:49:25+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>Update upstream source from tag 'upstream/2.5.0+ds'

Update to upstream version '2.5.0+ds'
with Debian dir a4571c974090bc9743cfd466ac2d2c87c6432c0a</pre>
</li>
<li>
<strong style="font-weight: 600;"><a href="https://salsa.debian.org/java-team/orchid/-/commit/7b6eb26f11590b3a1e4b37fb544088d6892812bb">7b6eb26f</a></strong>
<div>
<span> by Masayuki Hatta </span> <i> at 2026-11-06T14:18:19+09:00 </i>
</div>
<pre class="commit-message" style='white-space: pre-wrap; display: block; font-size: 14px; color: #3a383f; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; border-radius: 2px; margin: 0; padding: 8px 12px; border: 1px solid #dcdcde;'>Convert debian/watch to version 5
</pre>
</li>
</ul>
<h4 style="margin-top: 10px; margin-bottom: 10px;">
59 changed files:
</h4>
<ul>
<li class="file-stats">
<a href="#3b3103c4b18438934c955e81091122a8bb46fdd1">
.git-archival.txt
</a>
</li>
<li class="file-stats">
<a href="#3f3614b660c98ad2ec2ec3066dba56ad2e3556ca">
<span class="new-file">
+
.github/workflows/android.yml
</span>
</a>
</li>
<li class="file-stats">
<a href="#899ce9c202bf7bb5480e72836c3edc773c9c4244">
.github/workflows/ci.yml
</a>
</li>
<li class="file-stats">
<a href="#8ec9a00bfd09b3190ac6b22251dbb1aa95a0579d">
README.md
</a>
</li>
<li class="file-stats">
<a href="#68ef9f98c01c7eecd4c605cc26048a06f3304b79">
debian/watch
</a>
</li>
<li class="file-stats">
<a href="#b54005c0041387a8540b84ae1f1b87f9da12537b">
samples/android/README.md
</a>
</li>
<li class="file-stats">
<a href="#e36e828390c8a7aec19575453e2c415303091cfb">
samples/android/app/build.gradle
</a>
</li>
<li class="file-stats">
<a href="#8048b403212b29dbe978c076838d8c8f00025124">
<span class="new-file">
+
samples/android/app/src/androidTest/java/org/mhatta/orchid/sample/TorConnectionTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#b5469f1b6ac0e8618940c3c92a3604566fab64fe">
samples/android/app/src/main/java/org/mhatta/orchid/sample/MainActivity.java
</a>
</li>
<li class="file-stats">
<a href="#d7d54e0e9b96693a1d019bbb61044be295c0dad2">
samples/android/app/src/main/java/org/mhatta/orchid/sample/OrchidHolder.java
</a>
</li>
<li class="file-stats">
<a href="#9c0ca5d2e011e3e9b437b4fa392b4db6870a0505">
<span class="new-file">
+
samples/android/app/src/main/java/org/mhatta/orchid/sample/TorCheck.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#497f9c0da56dd33de83d202a8bf93d8a4733e476">
samples/android/gradle.properties
</a>
</li>
<li class="file-stats">
<a href="#935c163a94cc0a26a00dda5b2e4a0c32848e1e7f">
<span class="new-file">
+
samples/android/gradle/wrapper/gradle-wrapper.properties
</span>
</a>
</li>
<li class="file-stats">
<a href="#b886069d910d1a67d5b46d9be13f11feabd24725">
src/main/java/com/subgraph/orchid/Descriptor.java
</a>
</li>
<li class="file-stats">
<a href="#d04924aafca616b681c8da30b4562954708cb822">
src/main/java/com/subgraph/orchid/Router.java
</a>
</li>
<li class="file-stats">
<a href="#a7ce1aba4e39ef9add640ee1deca5607ef1554e5">
src/main/java/com/subgraph/orchid/circuits/CircuitIO.java
</a>
</li>
<li class="file-stats">
<a href="#f393d7867cd494f1c016420834dd64bafc0f360e">
src/main/java/com/subgraph/orchid/circuits/CircuitImpl.java
</a>
</li>
<li class="file-stats">
<a href="#61b2b3779c27b564af1287609489aac94065deae">
src/main/java/com/subgraph/orchid/circuits/CircuitManagerImpl.java
</a>
</li>
<li class="file-stats">
<a href="#7a15b187fc56de51ec3e87a3c412e99d0c058540">
src/main/java/com/subgraph/orchid/circuits/ExitCircuitImpl.java
</a>
</li>
<li class="file-stats">
<a href="#f7280098e1a9e13a9d79338ac2b14394d9bb6023">
src/main/java/com/subgraph/orchid/circuits/InternalCircuitImpl.java
</a>
</li>
<li class="file-stats">
<a href="#f06502cb2f29af740556411b60e5333fb916aac9">
src/main/java/com/subgraph/orchid/circuits/StreamImpl.java
</a>
</li>
<li class="file-stats">
<a href="#ac22cb1e056d99fbc179343b5de87c87edf66b3e">
src/main/java/com/subgraph/orchid/circuits/guards/BridgeRouterImpl.java
</a>
</li>
<li class="file-stats">
<a href="#8eb7cdc1d60648cf47147f3398cc35bab08cfb2c">
src/main/java/com/subgraph/orchid/circuits/hs/HiddenService.java
</a>
</li>
<li class="file-stats">
<a href="#a68aaeff427d18b25388ee847fb885618ef20451">
src/main/java/com/subgraph/orchid/circuits/hs/HiddenServiceManager.java
</a>
</li>
<li class="file-stats">
<a href="#10e9a9b83860821c25a1cf034a881dc0309d28a6">
src/main/java/com/subgraph/orchid/circuits/hs/RendezvousCircuitBuilder.java
</a>
</li>
<li class="file-stats">
<a href="#a92daf3aea72956b1d297fb908f6ebed3973cede">
src/main/java/com/subgraph/orchid/circuits/path/CircuitPathChooser.java
</a>
</li>
<li class="file-stats">
<a href="#d3f2bc428e92c959a362e98ee861cde96c1dd75b">
src/main/java/com/subgraph/orchid/connections/ConnectionHandshake.java
</a>
</li>
<li class="file-stats">
<a href="#a74c9a4491e4cf4ca07c4f7eb9e401ec513ee133">
src/main/java/com/subgraph/orchid/connections/ConnectionImpl.java
</a>
</li>
<li class="file-stats">
<a href="#1acf85b7bdc383361deeafc7c0350a7c9557082d">
src/main/java/com/subgraph/orchid/crypto/Ed25519Certificate.java
</a>
</li>
<li class="file-stats">
<a href="#8a5714d8d65e5876b92816d3a92b966c0a0a64f3">
src/main/java/com/subgraph/orchid/dashboard/Dashboard.java
</a>
</li>
<li class="file-stats">
<a href="#075677a56510dbd999e6351f693f0bde27f89de0">
src/main/java/com/subgraph/orchid/directory/DataDirectory.java
</a>
</li>
<li class="file-stats">
<a href="#4fc044681a692b88f59700591309671a6d174dc8">
src/main/java/com/subgraph/orchid/directory/DirectoryImpl.java
</a>
</li>
<li class="file-stats">
<a href="#347b6520c962d07408fc49391203cc244851248f">
src/main/java/com/subgraph/orchid/directory/RouterImpl.java
</a>
</li>
<li class="file-stats">
<a href="#bd1e46ef588c0f89e01360d7b803c4842df2fcf3">
src/main/java/com/subgraph/orchid/directory/certificate/KeyCertificateParser.java
</a>
</li>
<li class="file-stats">
<a href="#e8d6fe15c9ee34226e502722a5e3832989db08e3">
src/main/java/com/subgraph/orchid/directory/router/RouterMicrodescriptorImpl.java
</a>
</li>
<li class="file-stats">
<a href="#4914b18989ccb9bc98ad004b5447a7b32a1b9631">
src/main/java/com/subgraph/orchid/directory/router/RouterMicrodescriptorKeyword.java
</a>
</li>
<li class="file-stats">
<a href="#6892b664faa095f9ae03a276c8bdd943bf35e177">
src/main/java/com/subgraph/orchid/directory/router/RouterMicrodescriptorParser.java
</a>
</li>
<li class="file-stats">
<a href="#6e618f249063667ccb4be1a05cc40f75edfed6d1">
src/main/java/com/subgraph/orchid/sockets/OrchidSocketFactory.java
</a>
</li>
<li class="file-stats">
<a href="#36b4ed2a03dbf28ebf414013e5405dda5d961fc2">
src/main/java/com/subgraph/orchid/sockets/OrchidSocketImpl.java
</a>
</li>
<li class="file-stats">
<a href="#3fb5000a099a2c6ef424ceceefb70fa468e32934">
src/main/java/com/subgraph/orchid/sockets/OrchidSocketImplFactory.java
</a>
</li>
<li class="file-stats">
<a href="#f142501f595c6df6aab0a2535451e7d2163cc337">
test/com/subgraph/orchid/circuits/CircuitExtenderTest.java
</a>
</li>
<li class="file-stats">
<a href="#07497c5fd2b9e12f224fdbee18f4808d204c1e8f">
<span class="new-file">
+
test/com/subgraph/orchid/circuits/HostnameTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#a5f54f8b9d23739b22089676706f78d92023cf16">
test/com/subgraph/orchid/circuits/RelayCellSourceTest.java
</a>
</li>
<li class="file-stats">
<a href="#24f3a27b45920cf07514ef88dffcd2695c15e6c0">
<span class="new-file">
+
test/com/subgraph/orchid/circuits/StreamIdTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#f81b40cb7cec8ea2a138df2c7d20d0305fbdccdc">
test/com/subgraph/orchid/circuits/StreamIsolationTest.java
</a>
</li>
<li class="file-stats">
<a href="#b08bd6ed25eedd6e51593921aec7b1dbd344a57f">
<span class="new-file">
+
test/com/subgraph/orchid/circuits/UnsolicitedCellTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#6f086729ff723c0f08f54687946ff2bbf6f6c8b1">
<span class="new-file">
+
test/com/subgraph/orchid/circuits/hs/Ed25519CertificateKeyTypeTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#119663e07a85416694c83136678cdd7a19fd0c37">
test/com/subgraph/orchid/circuits/hs/HSV3TestServiceEncoder.java
</a>
</li>
<li class="file-stats">
<a href="#3cb110036f5d99883cdc5c2d6173ff23f27e6101">
test/com/subgraph/orchid/circuits/hs/HiddenServiceIsolationTest.java
</a>
</li>
<li class="file-stats">
<a href="#391d2cbb6d4667e9c78bf655d4c5ef31c2f24c2f">
<span class="new-file">
+
test/com/subgraph/orchid/circuits/path/FamilyTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#5fde8df0a662aad8c9d2e101d18aa6e3764e8bd6">
<span class="new-file">
+
test/com/subgraph/orchid/connections/LinkControlCellTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#bd9859116d53a5bc233131ef95ef703b571fc62b">
test/com/subgraph/orchid/connections/LinkProtocolTest.java
</a>
</li>
<li class="file-stats">
<a href="#1f3a8ad16b17c9fa2eb3f7c9db796468c8f6198f">
<span class="new-file">
+
test/com/subgraph/orchid/dashboard/DashboardTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#63458aafa0381966a77c270c8fdde47667ba4ade">
<span class="new-file">
+
test/com/subgraph/orchid/directory/ConsensusFreshnessTest.java
</span>
</a>
</li>
<li class="file-stats">
<a href="#e63aee5427908cb3ba6019cc17484f7a7504c2cc">
test/com/subgraph/orchid/directory/DataDirectoryTest.java
</a>
</li>
<li class="file-stats">
<a href="#b3661200864aa4ea3b9f874df907dbebb1f777c5">
test/com/subgraph/orchid/directory/TestAuthority.java
</a>
</li>
<li class="file-stats">
<a href="#728b49cdc0087ed2b4276860af2033c96bc8f296">
test/com/subgraph/orchid/directory/certificate/KeyCertificateParserTest.java
</a>
</li>
<li class="file-stats">
<a href="#141fb5943c754b897fc2a904c052069c910219fa">
test/com/subgraph/orchid/directory/router/RouterMicrodescriptorParserTest.java
</a>
</li>
<li class="file-stats">
<a href="#e958209e41ba05c67fef597a24091660cc0d8eab">
test/com/subgraph/orchid/sockets/UnresolvedAddressTest.java
</a>
</li>
</ul>
<h5 style="margin-top: 10px; margin-bottom: 10px; font-size: .875rem;">
The diff was not included because it is too large.
</h5>

</div>
<div class="footer" style="margin-top: 10px;">
<p style="font-size: small; color: #626168;">
—
<br>
<a href="https://salsa.debian.org/java-team/orchid/-/compare/9c7edfb05f0bbb92a8570d0437190fb395e09fdb...7b6eb26f11590b3a1e4b37fb544088d6892812bb">View it on GitLab</a>.
<br>
You're receiving this email because of your account on <a target="_blank" rel="noopener noreferrer" href="https://salsa.debian.org">salsa.debian.org</a>. <a href="https://salsa.debian.org/-/profile/notifications" target="_blank" rel="noopener noreferrer" class="mng-notif-link">Manage all notifications</a> · <a href="https://salsa.debian.org/help" target="_blank" rel="noopener noreferrer" class="help-link">Help</a>
<span style="color: transparent; font-size: 0; display: none; overflow: hidden; opacity: 0; width: 0; height: 0; max-width: 0; max-height: 0;">
Notification message regarding https://salsa.debian.org/java-team/orchid/-/compare/9c7edfb05f0bbb92a8570d0437190fb395e09fdb...7b6eb26f11590b3a1e4b37fb544088d6892812bb at 1793942351
</span>



</p>
</div>
</body>
</html>