public final class ClientID extends Object
Two things live here:
Spoofing is opt-in via the i2psnark.clientId property (empty to identify as I2PSnark, "random" to select a random profile per destination per run, or a profile name to always impersonate that client), optionally restricted to a subset via i2psnark.clientIds. Only clients recognizable by our own identification table are spoofable, so the console peers page keeps showing a real client name for our own IDs.
Version strings are pinned to upstream client releases verified as of 2026-08; bump them only when an upstream release changes the UA or "v" format, since point releases do not require updates. All three strings of a profile must carry the same version, as trackers may cross-check them.
| Modifier and Type | Class and Description |
|---|---|
static class | ClientID.ProfileOne impersonatable client: peer ID prefix plus the matching tracker
User-Agent and extension handshake "v" strings. |
| Modifier and Type | Field and Description |
|---|---|
static ClientID.Profile | BIGLYBT |
static ClientID.Profile | DELUGE |
static ClientID.Profile | KTORRENT |
static ClientID.Profile | LIBTORRENT |
static ClientID.Profile | QBITTORRENT |
static ClientID.Profile | TIXATI |
static ClientID.Profile | TRANSMISSION |
static ClientID.Profile | VUZE |
| Constructor and Description |
|---|
ClientID() |
| Modifier and Type | Method and Description |
|---|---|
static ClientID.Profile | getByName(String name)Look up a profile by name, case-insensitively. |
static String | getClientName(String ch)The client name for a peer ID prefix, from the same table used to
identify remote peers in the console. |
static ClientID.Profile | getRandomProfile(Random random,
List<ClientID.Profile> candidates)A random profile, optionally restricted to a candidate subset. |
static List<ClientID.Profile> | parseCandidateList(String raw)Parse a comma-separated i2psnark.clientIds value into profiles, dropping
whitespace, duplicates, and names that match no known client. |
static List<ClientID.Profile> | profiles()All spoofable client profiles, unmodifiable. |
public static final ClientID.Profile BIGLYBT
public static final ClientID.Profile DELUGE
public static final ClientID.Profile KTORRENT
public static final ClientID.Profile LIBTORRENT
public static final ClientID.Profile QBITTORRENT
public static final ClientID.Profile TIXATI
public static final ClientID.Profile TRANSMISSION
public static final ClientID.Profile VUZE
public static ClientID.Profile getByName(String name)
name - the profile name, e.g. "Vuze" or "qbittorrent"public static String getClientName(String ch)
ch - the first four Base64 characters of the peer ID, i.e. the
Base64 of its first three non-zero bytespublic static ClientID.Profile getRandomProfile(Random random, List<ClientID.Profile> candidates)
random - the randomness sourcecandidates - profiles to choose from; null or empty for allpublic static List<ClientID.Profile> parseCandidateList(String raw)
raw - the raw property value, may be null or emptypublic static List<ClientID.Profile> profiles()