Skip to content

Releases: EntonioDMI/postern

Postern 0.1.1 — Forge/Fabric 1.20.1, NeoForge/Fabric 1.21.1

Choose a tag to compare

@EntonioDMI EntonioDMI released this 10 Aug 05:50

0.1.0 never froze anybody — this release fixes that

If you installed 0.1.0, replace it. It looked like it worked: the server started,
it printed Postern is ready, it created its database and answered admin
commands. It also let every player join and move around freely, because its
mixins were never applied
. There was no error, no warning and nothing in the
log. 0.1.0 has been withdrawn.

The cause was a single missing line: the jar manifest had no MixinConfigs
attribute. Forge 1.20.1 registers mixin configurations from that attribute and
nowhere else — the [[mixins]] block in mods.toml that the build relied on is
NeoForge's mechanism, and classic Forge does not read it for this. Without the
attribute Forge quietly rejects the jar as a mixin container and carries on.

It is worth saying plainly what this defeated: a green build, 179 passing unit
tests, a development server, and a real production server. All four were clean.
Only joining with a game client revealed it, as a ClassCastException the moment
a player connected. The build now checks the manifest before anything else and
fails with an explanation if it is missing.

Downloads

Minecraft Loader File
1.20.1 Forge postern-forge-1.20.1-0.1.1.jar
1.20.1 Fabric postern-fabric-1.20.1-0.1.1.jar
1.21.1 NeoForge postern-neoforge-1.21.1-0.1.1.jar
1.21.1 Fabric postern-fabric-1.21.1-0.1.1.jar

Server-side only — players need no client mod, and a vanilla client can connect.
Drop the jar into mods/ and start the server once; it writes
config/postern/config.yml and its language files, then creates its database.

How far this was verified

1.20.1 Forge was run on a real, reobfuscated Forge 1.20.1-47.4.10 server with
a game client joining it. Confirmed there: the freeze engages (a joined player
cannot move or interact), /register issues recovery codes, an IP session lets a
returning player back in without a password, and the admin commands answer from
the console.

Not exercised on that server: /logout, /changepassword, /recover, the
damage protection, limbo freeze mode, and the lockout after repeated wrong
passwords. They are covered by unit tests, which — as the bug above shows — is
not the same thing.

The other three jars build and pass the static checks, but no server has been
started with them.
They are published so they can be tried, not because they
are known to work. If you run one, please report back.

Fixed

  • A second world in one process had no authentication at all. The runtime was
    built when the mod loaded, once per JVM, and torn down when the server stopped.
    A dedicated server never notices; opening a LAN world, returning to the menu
    and opening another one left no handlers, no commands and no packet gate.
  • Login did a blocking database query on the game thread, as did every join
    and /postern db. On SQLite that queued behind password hashing; on MySQL it
    was a network round trip inside a tick.
  • Players are now frozen the moment they join, before the asynchronous
    decision returns. Previously there was a window with no anchor and no
    protection, and a /register typed into it answered "you already have an
    account".
  • A frozen player stayed visible in the tab list to anyone who joined while
    they were still logging in.
  • /postern user resetpassword and unregister left an online player hanging
    — packets dropped, entity hidden, no message, no protection, until the timeout
    kicked them.
  • /postern reload could not report a broken config.yml. Malformed YAML
    arrives as a runtime exception and only IOException was caught.
  • The password log filter was added again on every reload and could never be
    removed, including when the option was turned off.
  • Expired sessions and stale attempt counters are now actually purged.
  • The resource-pack response is no longer dropped, which was getting players
    kicked from servers with require-resource-pack=true.

Removed

  • The premium config section. It documented an auto-login mode, a Mojang
    timeout and a fail-closed guarantee, and not one line of code ever read it. It
    will return with the implementation.
  • session.disable-if-proxy-detected. It promised that sessions switch off
    behind a proxy "rather than being left as a silent hole". There is no proxy
    detection in the mod; the switch was wired to nothing. The config now says
    plainly that you must turn sessions off yourself.

Also

  • Each jar declares exactly the one Minecraft version it was built for. 0.1.0
    advertised [1.20.1,1.21), which would have let it load on 1.20.2+ — where the
    methods its mixins target have moved.
  • The full LGPL-2.1 text ships in the repository and inside every jar, alongside
    LICENSE and THIRD-PARTY.md, so a jar-only recipient can see the MariaDB
    Connector/J notice.
  • 215 tests, up from 179, covering the admin commands and the packet whitelist.