Repository navigation
3.0.0
3.0.0
This is a major release for servers running 2.0.0. /aaf ips and its aaf.ips permission are gone. Player IP addresses are now stored encrypted, using a key file the plugin creates in its data folder. On first start, existing plaintext addresses in the database are converted to that format. Once they are converted, 2.0.0 can no longer read them, and losing the key file makes every stored address unrecoverable. This release also adds anonymous usage reporting, which is on by default and can be turned off. Several fixes make startup failures, alt lookups and join notifications more reliable.
Changes
Privacy and data storage
- Removed
/aaf ipsand theaaf.ipspermission, which showed a player's IP addresses in chat. The click-through links to it from/aaf accountsand/aaf altsare gone too (#57, #112). - IP addresses are now stored encrypted with AES using a key at
plugins/AlternateAccountFinder/ip-encryption.key. The key is generated on first start, and a warning about backing it up is logged on every start (#58). - On startup, existing plaintext addresses are encrypted in a single transaction, and the address column is widened to fit. When every row has converted, a marker file
ip-migration-v2.completeis written so later starts skip the check (#58). - The migration no longer re-encrypts values it cannot read, such as addresses encrypted with a key that has since been replaced. It leaves them unchanged, logs the affected account UUIDs, and tries again on the next start (#71).
/aaf accountsno longer suggests online players' IP addresses in tab-completion (#69).
Usage reporting
- The plugin now sends a small event to https://trace.danielstephenson.dev at startup and each time
/aafis used. The event contains only the plugin name, its version and the command name, and nothing about players or the server. Sending happens off the main thread and failures are dropped silently (#114). - On every startup, a console line says whether reporting is on and how to turn it off. A new
usage-reportingblock in config.yml controls it for this plugin. Existing config.yml files get the block added automatically. Settingenabled: falseinplugins/trace/config.ymlturns reporting off for every plugin that uses trace. The environment variablesTRACE_USAGE_REPORTING=offorDO_NOT_TRACK=1turn it off for the whole server process (#114, #116).
Startup and shutdown
- The plugin now disables itself with one clear error message if the connection pool, the database migrations or the encryption key fail at startup. Previously it could be left half-enabled on Spigot (#118).
database.dialectis checked before any connection is opened. It is now case-insensitive, and an invalid value produces an error that names the setting (#102).- The database connection pool is now closed when the plugin is disabled, so
/reloadno longer leaves connections open (#98).
Commands
/aaf accountsand/aaf altslist results newest first, in the same order every time./aaf altsnow looks up the player name off the main thread (#105).- An account that shares several addresses with a player is listed only once in alt results and join notifications (#81).
- Accounts with no cached name are shown by UUID instead of
null, and they no longer break tab-completion (#77, #81). - Tab-completion for
/aaf altsnow suggests only online players, which avoids lag on servers with many past players (#78). - Usage messages now show the required arguments as
<ip>and<player>(#85).
Join notifications
- If a player disconnects immediately after joining, the plugin now skips recording that login instead of throwing an error. An invalid
notify-usersentry is skipped with a warning and no longer blocks the other recipients (#69). - With RPKit, a recipient that RPKit cannot resolve, or RPKit services that are unavailable, are now skipped with a warning instead of throwing an error (#109).
Upgrade notes
- Back up your database before upgrading. The startup migration rewrites stored addresses in place, and 2.0.0 cannot read the result. To go back to 2.0.0, you need that backup.
- Back up
plugins/AlternateAccountFinder/ip-encryption.keyafter the first start, and keep it with your database backups. If the key is lost or replaced, every stored address becomes unreadable. If startup fails while loading the key, restore it from a backup rather than deleting it. - After the first start, check the console for the migration summary. If any records are listed as unrecognized or failed, they were left unchanged and will not match lookups until they are resolved.
- Remove
aaf.ipsfrom your permission plugin configuration, and update any scripts or habits that use/aaf ips. - Usage reporting is on by default, including on upgraded servers. To opt out, set
usage-reporting.enabled: falsein this plugin's config.yml, orenabled: falseinplugins/trace/config.ymlto opt out for every plugin on the server. - If
database.dialectis set to a value jOOQ does not recognise, the plugin now disables itself at startup. UseH2orMARIADB.
Version
2.0.0 → 3.0.0 — MAJOR. Mechanical floor from comparing the two jars: MAJOR.
Judgment: Keeping the mechanical floor of major. It is also confirmed by changes the jar comparison cannot fully see. /aaf ips and the aaf.ips permission are removed (#57). Stored IP addresses are rewritten in place from plaintext to AES ciphertext by a startup migration (#58), so the database can no longer be read by 2.0.0. Usage reporting is also enabled by default on existing servers, and its config block is written into their existing config.yml (#114, #116). The patches for eight test files were truncated. Only their names were available, and all of them sit under src/test, so they do not ship in the jar. Their effect is otherwise unknown, and nothing in them could lower the level.
- major: permission removed: aaf.ips
- minor: default config key added: usage-reporting.enabled
- minor: default config key added: usage-reporting.endpoint
- minor: default config key added: usage-reporting.key
- minor: storage path changed: src/main/java/com/dansplugins/detectionsystem/AlternateAccountFinder.java
- minor: storage path changed: src/main/java/com/dansplugins/detectionsystem/encryption/IpEncryption.java
- minor: storage path changed: src/main/java/com/dansplugins/detectionsystem/encryption/StoredAddressClassifier.java
- minor: storage path changed: src/main/java/com/dansplugins/detectionsystem/logins/LoginRepository.java
Java API changes (informational — nothing depends on this plugin)
- public class removed: com.dansplugins.detectionsystem.commands.AafIpsCommand
- public class removed: com.dansplugins.detectionsystem.logins.AccountAddressInfo
- public class removed: com.dansplugins.detectionsystem.logins.AddressInfo
- public class added: com.dansplugins.detectionsystem.commands.PlayerNames
- public class added: com.dansplugins.detectionsystem.encryption.IpEncryption
- public class added: com.dansplugins.detectionsystem.encryption.StoredAddressClassifier
- public class added: com.dansplugins.detectionsystem.encryption.StoredAddressClassifier$Classification
- public class added: com.dansplugins.detectionsystem.trace.TraceClient
- public class added: com.dansplugins.detectionsystem.trace.TraceClient$Builder
- com.dansplugins.detectionsystem.AlternateAccountFinder: added public void onDisable();
- com.dansplugins.detectionsystem.logins.LoginRepository: removed/changed public com.dansplugins.detectionsystem.logins.AccountAddressInfo getAccountInfo(java.util.UUID);
- com.dansplugins.detectionsystem.logins.LoginRepository: removed/changed public com.dansplugins.detectionsystem.logins.LoginRepository(com.dansplugins.detectionsystem.shadow.org.jooq.DSLContext);
- com.dansplugins.detectionsystem.logins.LoginRepository: removed/changed public void saveLogin(org.bukkit.entity.Player);
- com.dansplugins.detectionsystem.logins.LoginRepository: added public com.dansplugins.detectionsystem.logins.LoginRepository(com.dansplugins.detectionsystem.shadow.org.jooq.DSLContext, com.dansplugins.detectionsystem.encryption.IpEncryption);
- com.dansplugins.detectionsystem.logins.LoginRepository: added public void saveLogin(java.util.UUID, java.net.InetAddress);
- com.dansplugins.detectionsystem.logins.LoginService: removed/changed public com.dansplugins.detectionsystem.logins.AccountAddressInfo getAccountInfo(java.util.UUID);
- com.dansplugins.detectionsystem.logins.LoginService: removed/changed public void saveLogin(org.bukkit.entity.Player);
- com.dansplugins.detectionsystem.logins.LoginService: added public void saveLogin(java.util.UUID, java.net.InetAddress);
Verification
Verified on a real Spigot server before publication; this release carries the exact jar that was verified.
- boot gate run: booted twice on a fresh Spigot server (10 assertions passed).
- save-compatibility gate run: data written by
2.0.0was loaded by this release across 5 restart cycles with nothing lost (32 assertions passed). - The current stable release
2.0.0does not close its database cleanly on shutdown (plugins/AlternateAccountFinder/aaf.trace.dbleft behind after its own stops); this release does.
Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.
drafted by Claude on behalf of Daniel Stephenson