feat(base): SimpleLogin's sign-in comes back by the app's scheme or the loopback (ADR 0020, D9 corrected)

simpleLogin.begin takes the way back (SimpleLoginReturn: loopback,
scheme) rather than the platform, so macOS can come back through its
scheme as iOS and Android do; the markers become learn-loopback,
learn-scheme, todo-loopback and todo-scheme. Not breaking: the
endpoint has never been released.

D9 corrected by the developer after research: Android, iOS and macOS
come back through the app's scheme, Linux and Windows through the
loopback. Verified links protected nothing here: a code caught on its
way is worthless without the attempt's ID, and a hostile app beginning
an attempt of its own can ask for a way back that other platforms need
open. The ADR notes the residual risk and the check of prompt=consent
still to do. assetlinks.json stays served.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-23 23:35:46 +02:00
commit 7ea9f16904
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -565,7 +565,7 @@ void main() {
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
final proof = await remote.completeSimpleLogin(
@ -577,7 +577,7 @@ void main() {
),
);
expect(start.state, startsWith('todo-desktop.'));
expect(start.state, startsWith('todo-loopback.'));
expect(proof.outcome, SimpleLoginOutcome.signedIn);
expect(proof.account, ben);
});
@ -588,7 +588,7 @@ void main() {
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-phone',
marker: 'todo-scheme',
caller: annaOnTodo,
network: '203.0.113.0/24',
);
@ -617,7 +617,7 @@ void main() {
test('passes on the handle suggested to someone new', () async {
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
final proof = await remote.completeSimpleLogin(
@ -639,7 +639,7 @@ void main() {
'crossing whole', () async {
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
final code = simpleLogin.authorize(
@ -677,7 +677,7 @@ void main() {
final device = await KeysDevice.make();
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
await remote.completeSimpleLogin(
@ -737,7 +737,7 @@ void main() {
final device = await KeysDevice.make();
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
await remote.completeSimpleLogin(
@ -810,7 +810,7 @@ void main() {
) async {
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
caller: person,
network: '203.0.113.0/24',
);
@ -885,7 +885,7 @@ void main() {
final next = await KeysDevice.make(seed: 7);
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
await remote.completeSimpleLogin(
@ -988,7 +988,7 @@ void main() {
final device = await KeysDevice.make();
final first = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
await remote.completeSimpleLogin(
@ -1008,7 +1008,7 @@ void main() {
);
final start = await remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
);
await remote.completeSimpleLogin(
@ -1073,7 +1073,7 @@ void main() {
await expectLater(
remote.beginSimpleLogin(
session,
marker: 'todo-desktop',
marker: 'todo-loopback',
network: '203.0.113.0/24',
),
refused(OidcRefusal.unknownProvider),