[1.0.0] - 2026-08-11
Universal single-jar architecture (1.16.x - 26.1-26.2)
- One source, every Minecraft version - the old per-version source sets are gone; version
variants live under
src/(src/main/java+src/client/java= classic yarn code,src/modern/java= Mojang 26.1-26.2 code) behind thenet.ded3ec.compatreflection layer and version-stable mixin targets. Verified by compiling the identical source against 1.16.5, 1.17.1, 1.18.2, 1.19.4, 1.20.6 and 1.21.11 (all green), with a per-push CI matrix. - Universal mixins: login hello (reflects over
getProfile()vsname()/profileId(), plus authlib'sgetName()/getId()vs recordname()/id()), handshake proxy forwarding (record accessor vs private field), chat restriction (single mixin coveringonGameMessage/onChatMessage/handleChatMessage). FabricHooksregisters commands (API v1/v2), item-use and damage events reflectively - missing fabric APIs are skipped gracefully.fabric.mod.jsondeclaresminecraft >=1.16.0,java >=16,environment "*"- the same jar runs on servers AND clients, standalone or behind Velocity / BungeeCord.- Version-independent features (commands, config, database, security, web panel, email, Redis) work unchanged on every version.
- Client companion always included: the universal jar bundles the client login-screen companion (auto-login GUI) for 1.20.2+ clients. The companion is fully reflection-guarded, so the jar loads safely on older clients (1.16 - 1.20.1) and simply skips the screen there.
- If the client cannot send the auto-login command (e.g. signed-chat restrictions), the player gets an in-chat hint with the exact command to type instead of failing silently.
- Limbo tick re-assert guards: every tick the lobby re-applies the blindness/invisibility effects (lost e.g. by milk) and teleports lobby players back when movement is disabled and they drifted - fallbacks for environments where the version-specific mixins cannot apply.
- Defense in depth:
/loginand/registerre-verify their prerequisites at execution time, not only in the commandrequirespredicate. - Release automation: tag-triggered GitHub workflow (
ci.yml- the ONLY workflow now) builds the universal jar, extracts the changelog section for the tag and drafts a release with the jar attached. - One workflow, honest CI: all previous workflows (build / client-check / lint-test /
gradle-validate / dependency-audit / multi-version-check / release) were merged into a
single
ci.yml. Matrix builds no longer mask failures (gradlewexec-bit bug fixed, yarn versions corrected: 1.19.4+build.2, 1.20.6+build.3, fabric-api 0.46.1+1.17, 0.100.8+1.20.6). - Full proxy-side auth: the proxy plugin (BungeeCord + Velocity) can now disconnect players WITHOUT a valid Redis session (block-unauthenticated=true in config/authcore-proxy.properties) before they reach any backend - zero-dependency RESP Redis client, fail-open on Redis outage, /authcore status command.
- 26.1-26.2 snapshot compile checks: new daily CI job compiles the modern source against the NEWEST 26.1-26.2 release the moment Fabric publishes yarn mappings for it - fails visibly on breakage.
- **Velocity modern forwarding (Fabric server): HMAC-verified velocity:player_info login receiver applies the real UUID/username when velocity-secret is set; legacy/BungeeCord handshake parsing auto-detected (protocol = auto).
- Interop channel authcore:auth + BungeeCord AuthCore subchannel - other mods and proxies can coexist with a DIFFERENT auth mod on the backend; broadcasts on join/login/register/logout/kick/unregister (session.interop).
- Separate database config: optional config/authcore/database.conf (only the database { } block) is merged over settings.conf, so credentials can live outside the main config.
- Config per role: server = settings.conf, client = authcore-client.json, proxy = authcore-proxy.properties, database = database.conf.
- 26.1-26.2 support (real build): Minecraft 26.0+ is unobfuscated (Mojang names at runtime,
intermediary gone), so AuthCore ships a second jar built from the Mojang-mapped
source (
src/modern/java,-Pmodern=true, loom 1.16.x, Java 25, no mappings):authcore-modern-1.0.0.jarfor 26.0+ servers/clients. The classic universal jar covers 1.16.0 - 1.21.11. Both jars carry the client login-screen companion (environment "*"), and the release workflow attaches both. The two name-spaces cannot coexist in one jar - seedocs/26x.mdfor the migration/sync workflow.
Multi-loader & multi-version workspace (Stonecutter / Stonecraft)
- One Mojang-mapped source tree, three range jars per loader: fabric/forge/neoforge for 1.16-1.18, 1.19-1.21 and 26.1-26.2 (7 release jars in total).
- Verified on every range endpoint: 1.16.5, 1.17.1, 1.18.2, 1.19.4, 1.20.6, 1.21.11, 26.1.2, 26.2, all 22 harness checks PASS on all 7 loader build targets.
Modrinth version range fix
- Uploaded jars no longer claim every Minecraft version. The shipped metadata now declares the
exact supported range per jar, so Modrinth pre-selects precisely the tested versions instead
of the full grid:
- Fabric (
fabric.mod.json):>=1.16 <=1.18.2/>=1.19 <=1.21.11/>=26.1 <=26.2. - Forge / NeoForge (
mods.toml/neoforge.mods.toml):[1.16,1.18.2]/[1.19,1.21.11]/[26.1,26.2](maven syntax).
- Fabric (
- Loader minimums are now the exact pins of the build target instead of
*/[1,): Fabric loader>=0.19.3, FML[40.3.12,)/[61.2.0,), NeoForge[21.11.45,)/[26.2.0.57,). - Root cause: the range placeholders never reached the built jars -
fabric.mod.jsonshipped"minecraft": "*"(Modrinth reads this as "all versions") andmods.tomlshipped only the single build target. All 7 jars were rebuilt and their metadata verified.
Security & anti-bypass
- ClientGuard: behavioral profiles, 16 detection signals (ghost clients, missing client settings, packet/click/chat/payload floods, tab probing, fake companions, confusable names, concurrent logins), weighted risk score with a decision matrix.
- Companion attestation: challenge-response HMAC, periodic re-challenges, session tokens (rotated on every login, hashed at rest) and token-based session resume.
- MFA / 2FA: TOTP + single-use recovery codes + optional email OTP + MFA step-up for sensitive commands.
- Network SSO: Redis-backed single sign-on across a server network (optional).
- Error codes: console-only AC-... codes at every failure site, decodable by the author; no internals leak to clients.
Security fixes found by the new test suite
- PBKDF2 DoS fixed - password4j's PBKDF2
check()could hang the server thread during login. PBKDF2 is now a self-contained JDKSecretKeyFactoryimplementation ($pbkdf2-sha256$iter$salt$hash, constant-time comparison).
Performance for 100k+ users
- Lazy user loading - users are fetched from the database on demand (join/login/whois) instead of loading the whole table at startup. A 100k-registered server keeps only online + recently-touched users in memory.
- Bounded LRU cache (20k max) with idle eviction; online users are never evicted.
- Admin
listcommands,whois, export and the web panel are now database-backed (bounded, searchable queries) instead of iterating the in-memory map. - Thread-safe canonical cache (a single User instance per account under concurrent access).
Race-condition hardening
AuthCoreServer.config/messages, user session fields,TpsManager.tickCounterand the DB connection are nowvolatile.- All database access is
synchronized(single shared JDBC connection is never used concurrently). - User cache-miss fetches are serialized under a dedicated lock.
New features
- Cross-server security event bus (Redis pub/sub
authcore:events): login, logout, register, brute-force, account-locked and kick events are broadcast network-wide; receivers log, webhook and execute remote kicks. - Discord account linking:
/discord link|unlink, 6-char link codes (webhook + Redis, 10-min TTL), bot completion via the web panellinkaction,discordIdstored per account. - Maintenance mode:
/authcore maintenance on|offblocks all joins with a custom message. - Honeypot: a fake listener port auto-bans every connecting IP (writes
denyrules toip-rules.conf). - Automated backups: scheduled SQLite copies / JSON exports with rotation (
session.backup). - Rotating announcements: list-based, interval-driven (
lobby.announcements). - Password history:
password-rules.history-sizeblocks reuse of recent passwords. - Fast-rejoin alert: bot-pattern detection (alert-only).
- Web panel: read-only token,
/metricsendpoint, DB-backed player list. - Extra webhooks:
security.extra-webhook-urls(Slack/Telegram/custom). /authcore validateconfig dry-run,/authcore resetpwalias.- New config surface for admins:
session.maintenance,session.honeypot,session.backup,session.authentication.auto-luck-perms-group,bind-bedrock-xuid,web-panel.readonly-token,rate-limit.alert-on-fast-rejoin,lobby.announcements,password-rules.history-size,security.extra-webhook-urls- all fully commented insettings.confand documented indocs/CONFIG.mdwith defaults + scenarios.
Quality
tools/security-tests/- standalone test suite (57 checks) covering password hashing round-trips, captcha lifecycle, email recovery, rate limiting, proxy parsing, device fingerprints. Run viatools/security-tests/run-tests.ps1.- Access control validation pass: every command re-verified (player vs admin vs console),
/discordguarded in lobby, read-only web token.
Bot / backend separation
- The Discord bot integration is now strictly backend-owned: the bot never touches the
database. Every write is executed by the mod backend through the web panel API; the bot
communicates over Redis (link codes
authcore:discordlink:*, mappingauthcore:discord:*,authcore:eventspub/sub) plus the API. Docs (API.md,WEBPANEL.md) state the rule explicitly.
Tooling
- Host-compat harness: range/loader/version selection, forward-compat scan, live logs, parallel 6, professional HTML dashboard + markdown coverage matrix, 22 checks.
- GitHub Actions: builds all 7 variants, Docker host-tests on every push/schedule, weekly compat scan that auto-releases new validated versions with changelog entries.
Cleanup
- Removed legacy / migration leftovers:
src/common/,src/client/,_migration/,postman/,release.sh,docs/migration.md. - Removed IDE artifacts (
.settings/,bin/,.classpath,.project,.factorypath), staledist/jars and the obsoleteauthcore-26.x-*jars. - Fixed mojibake in the ClientGuard config comment, removed duplicated/corrupt changelog sections, corrected stale wording ("26.0+" โ 26.1-26.2, Java 17/21/25, multi-loader tagline).
[1.0.0-alpha.5] - 2026-08-08
- Velocity / BungeeCord proxy support (server-side IP forwarding,
session.proxy-support) - Web admin panel (HTTP/HTTPS with auto self-signed cert, token auth)
- Email recovery & alerts (SMTP login alerts,
/account recover) - Client login-screen companion (login GUI before joining)
[1.0.0-alpha.4] - 2026-08-08
- Combat-log punishment, Discord webhooks, security log + rotation, login history,
intelligence (new IP/country), account locking, risk scores, CAPTCHA, recovery codes,
progressive punishment, per-IP rate limits, PostgreSQL, Redis session/ban sync,
AuthCoreApi,/authcore backup|history, 6 new localized messages in 7 languages.
[1.0.0-alpha.3] - 2026-08-08
- Fixed premium (online-mode) detection: Mojang API-outage-safe, no player ever blocked by an API failure; transient failures retry; health-tracked lookups.
[1.0.0-alpha.2] - 2026-08-08
- Per-hash random salts (bcrypt/scrypt/pbkdf2 no longer broken), case-insensitive user lookup,
UUID re-keying, no account enumeration, command
requiresversion fix, console/authcore, MySQL URL fixes, localhost/LAN support, JDK HttpClient, structured startup banner.
[1.0.0-alpha.1] - 2026-01-01
- Initial framework: hybrid auth, limbo (lobby), session management, message system, granular lobby restrictions, 2FA (TOTP), config system (settings.conf + messages.conf).