halkyon/packages/halkyon_base_client
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tizian 「ティツィアーン」 a4819c3d39
feat(app): sign in with a password and TOTP on the device
ADR 0017, step 3: halkyon_app's side, which Learn and Todo take.

- The account's cryptography on the device (`SodiumAccountCrypto`):
  halkyon_keys and SRP's client half, each step on an isolate of its
  own. sodium hands out results as views of native memory its
  finalizers free once the isolate that made them ends, so everything
  crossing back is copied first: a view read freed memory and crashed
  the process.
- `PasswordGateway` on the module's endpoints (steps without a session
  through a client holding none; an authenticator set up with a session
  granted but not yet the device's), and `PasswordRepository` running
  the flows: signing in (M2 checked, the keys opened before anything is
  trusted), signing up, a password for someone signed in, an account
  never finished, the authenticators, recovery codes, changing the
  password, a new recovery phrase, and getting back in.
- The unlocked keys in the system's keyring per instance and person
  (`SecureAccountKeyStore`), gone once another person signs in or
  nobody, and with the instance's removal.
- The screens: the start screen's Sign in and Create an account (and
  when GitHub sign-in ends), the sign-in sheet (codes, recovery codes,
  an account never finished, a lost authenticator), the account's setup
  (the recovery phrase shown once, three random words typed back before
  anything reaches the instance; the authenticator's QR code, drawn
  with pub.dev's qr; the recovery codes), getting back in, and the
  account section (`AccountSecuritySection`).
- `FileSaver` moves from Learn into halkyon_app, for the phrase and the
  codes in Todo too; `AppDependencies` names it and `passwords`.
- halkyon_keys rebuilds account keys from the secret keys a device kept;
  the key proof's message is in halkyon_base_client, checked against
  the register's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-23 14:12:41 +02:00
..
lib feat(app): sign in with a password and TOTP on the device 2026-10-23 14:12:41 +02:00
test feat(app): sign in with a password and TOTP on the device 2026-10-23 14:12:41 +02:00
.gitignore halkyon_base: a Serverpod module for sign-in, accounts and instance basics 2026-10-19 14:29:28 +02:00
analysis_options.yaml feat(crypto): SRP-6a, the register's half and the device's 2026-10-22 18:11:08 +02:00
CHANGELOG.md halkyon_base: a Serverpod module for sign-in, accounts and instance basics 2026-10-19 14:29:28 +02:00
LICENSE build: Melos, a Dart check and every path for the single repository 2026-10-22 18:11:04 +02:00
pubspec.yaml feat(crypto): SRP-6a, the register's half and the device's 2026-10-22 18:11:08 +02:00
README.md feat(crypto): SRP-6a, the register's half and the device's 2026-10-22 18:11:08 +02:00

halkyon_base_client

The client of halkyon_base, generated by Serverpod: what a Halkyon app calls to sign in, to manage its account, and to learn an instance's basics, under client.base in the app's own client. Never edited by hand; run serverpod --no-analytics generate in halkyon_base_server instead.

The one exception is SRP-6a's client half (ADR 0017), written by hand beside the generated code, which the generator leaves alone (it writes only lib/src/protocol/): package:halkyon_base_client/srp.dart, tested by dart test here. The module's README says how it pairs with the register's half.

Under the GNU Affero General Public License 3.0 or later.