fluffychat/lib/utils/uia_request_manager.dart

117 lines
3.9 KiB
Dart
Raw Permalink Normal View History

2021-10-30 14:06:10 +02:00
import 'dart:async';
2021-10-26 18:50:34 +02:00
import 'package:adaptive_dialog/adaptive_dialog.dart';
2021-10-26 20:08:17 +02:00
import 'package:flutter_gen/gen_l10n/l10n.dart';
2021-10-26 18:50:34 +02:00
import 'package:matrix/matrix.dart';
2023-01-26 09:47:30 +01:00
import 'package:url_launcher/url_launcher_string.dart';
2021-10-26 20:08:17 +02:00
import 'package:fluffychat/widgets/matrix.dart';
2021-10-26 20:08:17 +02:00
extension UiaRequestManager on MatrixState {
Future uiaRequestHandler(UiaRequest uiaRequest) async {
2022-10-17 10:43:09 +02:00
final l10n = L10n.of(navigatorContext)!;
try {
if (uiaRequest.state != UiaRequestState.waitForUser ||
2021-10-30 14:06:10 +02:00
uiaRequest.nextStages.isEmpty) {
Logs().d('Uia Request Stage: ${uiaRequest.state}');
return;
}
final stage = uiaRequest.nextStages.first;
2021-10-30 14:06:10 +02:00
Logs().d('Uia Request Stage: $stage');
switch (stage) {
case AuthenticationTypes.password:
final input = cachedPassword ??
(await showTextInputDialog(
2021-10-26 20:08:17 +02:00
context: navigatorContext,
2022-10-17 10:43:09 +02:00
title: l10n.pleaseEnterYourPassword,
okLabel: l10n.ok,
cancelLabel: l10n.cancel,
textFields: [
const DialogTextField(
minLines: 1,
maxLines: 1,
obscureText: true,
hintText: '******',
)
],
))
?.single;
if (input == null || input.isEmpty) {
2021-10-30 14:06:10 +02:00
return uiaRequest.cancel();
}
return uiaRequest.completeStage(
AuthenticationPassword(
session: uiaRequest.session,
password: input,
identifier: AuthenticationUserIdentifier(user: client.userID!),
),
);
case AuthenticationTypes.emailIdentity:
2022-01-29 12:35:03 +01:00
if (currentThreepidCreds == null) {
2021-10-30 14:06:10 +02:00
return uiaRequest.cancel(
UiaException(L10n.of(widget.context)!.serverRequiresEmail),
2021-10-30 14:06:10 +02:00
);
}
final auth = AuthenticationThreePidCreds(
session: uiaRequest.session,
type: AuthenticationTypes.emailIdentity,
2021-11-04 16:09:12 +01:00
threepidCreds: ThreepidCreds(
sid: currentThreepidCreds!.sid,
2021-11-04 16:09:12 +01:00
clientSecret: currentClientSecret,
),
);
if (OkCancelResult.ok ==
await showOkCancelAlertDialog(
useRootNavigator: false,
2021-10-26 20:08:17 +02:00
context: navigatorContext,
2022-10-17 10:43:09 +02:00
title: l10n.weSentYouAnEmail,
message: l10n.pleaseClickOnLink,
okLabel: l10n.iHaveClickedOnLink,
cancelLabel: l10n.cancel,
)) {
return uiaRequest.completeStage(auth);
}
return uiaRequest.cancel();
case AuthenticationTypes.dummy:
return uiaRequest.completeStage(
AuthenticationData(
type: AuthenticationTypes.dummy,
session: uiaRequest.session,
),
);
default:
2022-08-14 16:59:21 +02:00
final url = Uri.parse(
'${client.homeserver}/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}',
);
2023-01-26 09:47:30 +01:00
launchUrlString(url.toString());
if (OkCancelResult.ok ==
await showOkCancelAlertDialog(
useRootNavigator: false,
2022-10-17 10:43:09 +02:00
message: l10n.pleaseFollowInstructionsOnWeb,
context: navigatorContext,
2022-10-17 10:43:09 +02:00
okLabel: l10n.next,
cancelLabel: l10n.cancel,
)) {
return uiaRequest.completeStage(
AuthenticationData(session: uiaRequest.session),
);
} else {
return uiaRequest.cancel();
}
}
} catch (e, s) {
Logs().e('Error while background UIA', e, s);
2021-10-26 15:39:54 +02:00
return uiaRequest.cancel(e is Exception ? e : Exception(e));
}
}
}
2021-10-30 14:06:10 +02:00
class UiaException implements Exception {
final String reason;
UiaException(this.reason);
@override
String toString() => reason;
}