feat(base)!: no anonymous accounts on the server (ADR 0020, D25)
The server's half of D25: every account has a way in, and the anonymous accounts left from before go with the daily pruning. - The module signs nobody in anonymously: `anonymousIdp` and `gitHubUpgrade` are gone, and so is linking GitHub at the register. - A password is set only by someone whose address is theirs (a `firstPassword` code) or who signs in with GitHub alone (a fresh sign-in and a `signUp` code); an anonymous account is refused `wrongCredentials` before any code is used. - SimpleLogin refuses to link onto a caller without `identified` (`wrongCaller`), the member's endpoint too, so nothing turns an anonymous account into one with a way in. - `pruneAnonymousPeople` deletes every anonymous account left, however new, never one identified. Learn and Todo schedule it as `prune-accounts` and cancel the old `prune-abandoned-anonymous-people` entry once. - Learn: someone without `identified` keeps no files; `FILE_LIMIT_ANONYMOUS_MB` is gone. `minimumAppBuild` is 23, as builds up to 22 start with an anonymous account. - Learn's sync tests make their person and session by SQL in the development database, as Serverpod stores sessions. - Docs, store listings and ADRs 0010, 0014, 0016, 0017 and 0019 amended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
5b9df73756
commit
87671208df
1 changed files with 837 additions and 1353 deletions
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:clock/clock.dart';
|
||||
import 'package:halkyon_base_server/base.dart';
|
||||
import 'package:halkyon_oidc_server/testing.dart';
|
||||
import 'package:serverpod/serverpod.dart';
|
||||
|
|
@ -102,7 +103,28 @@ Future<UuidValue> signInNewDevice(
|
|||
return (await sessionIds()).difference(before).single;
|
||||
}
|
||||
|
||||
/// A person as an app's first launch creates them: anonymous.
|
||||
/// A person as codes by mail left them before passwords (ADR 0017):
|
||||
/// identified, with [address] as their only way in, and no password.
|
||||
Future<UuidValue> newPersonWithAddress(Session session, String address) async {
|
||||
final person = (await AuthServices.instance.authUsers.create(
|
||||
session,
|
||||
scopes: {identified},
|
||||
)).id;
|
||||
// INSERT INTO "email_identity" ("authUserId", "addressHash", "createdAt")
|
||||
// VALUES ($1, $2, $3)
|
||||
await EmailIdentity.db.insertRow(
|
||||
session,
|
||||
EmailIdentity(
|
||||
authUserId: person,
|
||||
addressHash: addressHash(session.serverpod, address),
|
||||
createdAt: clock.now(),
|
||||
),
|
||||
);
|
||||
return person;
|
||||
}
|
||||
|
||||
/// An anonymous account, as apps made them on their first start until
|
||||
/// ADR 0020, D25, left from before.
|
||||
Future<UuidValue> newAnonymousPerson(
|
||||
Session session, {
|
||||
DateTime? createdAt,
|
||||
|
|
|
|||
Loading…
Reference in a new issue