Allow logging into homeservers without discovery working

This commit is contained in:
Henry Hiles 2026-08-10 22:50:13 -04:00
commit 620440e2a1
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 38 additions and 20 deletions

View file

@ -311,7 +311,7 @@ class ClientController extends AsyncNotifier<int> {
Future<Uri?> discoverHomeserver(Uri homeserver) async {
try {
final response = await _sendCommand("discover_homeserver", {
"user_id": "@fake-user:${homeserver.host}",
"user_id": "@fake-user:${homeserver.authority}",
});
return Uri.parse(response["m.homeserver"]?["base_url"]);
} catch (error) {

View file

@ -26,6 +26,17 @@ class SelectServerPage extends HookConsumerWidget {
final homeserverUrl = useTextEditingController();
Future<void> setHomeserver(Uri? newHomeserver) async {
if (newHomeserver == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Failed to parse homeserver URL. Are you sure you typed it correctly?",
style: .new(color: theme.colorScheme.onErrorContainer),
),
backgroundColor: theme.colorScheme.errorContainer,
),
);
}
isLoading.value = true;
try {
@ -33,26 +44,14 @@ class SelectServerPage extends HookConsumerWidget {
newHomeserver = Uri.https(newHomeserver!.path);
}
final newUrl = newHomeserver == null
? null
: await ref
.read(ClientController.provider.notifier)
.discoverHomeserver(newHomeserver);
final newUrl = await ref
.read(ClientController.provider.notifier)
.discoverHomeserver(newHomeserver!);
if (context.mounted) {
if (newUrl == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Homeserver verification failed. Is your homeserver down?",
style: .new(color: theme.colorScheme.onErrorContainer),
),
backgroundColor: theme.colorScheme.errorContainer,
),
);
} else {
Future<void> tryLogin(Uri url) async {
final codeResponse = await ref.watch(
AuthUrlController.provider(newUrl).future,
AuthUrlController.provider(url).future,
);
await ref.watch(LaunchHelper.provider).launchUrl(codeResponse.url);
@ -70,7 +69,7 @@ class SelectServerPage extends HookConsumerWidget {
.watch(ClientController.provider.notifier)
.exchangeToken(
.new(
homeserverUrl: newUrl,
homeserverUrl: url,
codeVerifier: codeResponse.codeVerifier,
redirectUri: .new(
scheme: "nexus.federated.nexus",
@ -78,7 +77,7 @@ class SelectServerPage extends HookConsumerWidget {
),
code: code,
clientId: await ref.watch(
ClientIdController.provider(newUrl).future,
ClientIdController.provider(url).future,
),
),
)
@ -89,6 +88,25 @@ class SelectServerPage extends HookConsumerWidget {
}
});
}
if (newUrl == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Homeserver verification failed.",
style: .new(color: theme.colorScheme.onErrorContainer),
),
action: SnackBarAction(
onPressed: () => tryLogin(newHomeserver!),
label: "Attempt log in anyways",
textColor: theme.colorScheme.onErrorContainer,
),
backgroundColor: theme.colorScheme.errorContainer,
),
);
} else {
tryLogin(newUrl);
}
}
} catch (error, stackTrace) {
showError(error, stackTrace);