EpiSODIC's dashboard is used by a small board of epidemiologists (the
"epidemiologist" role - by definition, they assess clusters and
classify them) and by "viewer" accounts for anyone who needs to see
cluster detail, including patient-level data, without classifying
anything themselves. Both roles sign in with a username and password;
there is no self-service registration - an administrator creates each
account with episodic_add_user(), and the new user sets their
own password on first sign-in.
Details
Passwords are hashed (never stored in plain text). Both outcomes are
recorded: a successful sign-in as a login event on the account, a
refused one - with which of unknown username, wrong password or
deactivated account it was, and the username as typed - in
episodic_app_login_failure. Both appear on the dashboard's Activity
screen, to signed-in readers only, where the sign-in category can be
filtered to on its own.
That record is an audit trail, not a defence. This login exists to attribute who assessed what, not to keep an attacker out: EpiSODIC does not implement TLS, account lockout, or rate limiting, so it should always be deployed behind your own organisation's network controls (VPN, internal network, or a reverse proxy that terminates TLS). What the failure log gives you is the ability to notice - a burst of refused attempts on one account is visible on the Activity screen the same day it happens.