From 9c8c4fd286de3b40d23a42d590868c47034c78fa Mon Sep 17 00:00:00 2001 From: ppc Date: Mon, 13 Jan 2025 21:17:38 +0000 Subject: [PATCH] improve HTTPS server warning --- amnet-native/app/ServerAddModal.tsx | 41 ++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/amnet-native/app/ServerAddModal.tsx b/amnet-native/app/ServerAddModal.tsx index f772c35..f15a3dc 100644 --- a/amnet-native/app/ServerAddModal.tsx +++ b/amnet-native/app/ServerAddModal.tsx @@ -1,7 +1,7 @@ import {useModalStyles} from "../utils/ModalStyles"; import {Card, Paragraph, useTheme} from "react-native-paper"; import {useCallback, useEffect, useLayoutEffect, useState} from "react"; -import {Platform, TextInput, TouchableOpacity, View} from "react-native"; +import {Alert, Platform, TextInput, TouchableOpacity, View} from "react-native"; import RealmContext from "../models/RealmContext"; import {AMServer} from "../models/AMServer"; @@ -34,25 +34,48 @@ export default function ServerAddModal({route, navigation}) { let urlValid = false; try { - new URL(serverAddress); - urlValid = true; + const protocol = new URL(serverAddress).protocol; + urlValid = protocol.localeCompare("http:", undefined, {sensitivity: "case"}) === 0 || protocol.localeCompare("https:", undefined, {sensitivity: "case"}) === 0; } catch { // do nothing } const themeOptions = urlValid ? modalStyles.headerText : {color: theme.colors.outline}; navigation.setOptions({ - headerRight: () => saveServer()}> + headerRight: () => saveServer(serverAddress)}> Save }) }, [navigation, modalStyles, serverAddress]); - const saveServer = useCallback(() => { - let serverObject = realm.objects("server").find(x => x.serverAddress == serverAddress); + const saveServer = useCallback(async (address: string) => { + if (address.startsWith("https:")) { + await new Promise(done => { + Alert.alert( + "HTTPS Warning", + "By default, AMNet doesn't support HTTPS without advanced configuration. It's highly likely you won't be able to connect.", + [ + { + text: "Keep HTTPS", + style: "destructive", + onPress: () => done() + }, + { + text: "Change to HTTP", + isPreferred: true, + onPress: () => { + address = address.replace(/^https:/i, "http:"); + done(); + } + }, + ]); + }) + } + + let serverObject = realm.objects("server").find(x => x.serverAddress == address); if (!serverObject) { realm.write(() => { - serverObject = realm.create("server", AMServer.generate(serverAddress)); + serverObject = realm.create("server", AMServer.generate(address)); }); } @@ -60,7 +83,7 @@ export default function ServerAddModal({route, navigation}) { setTimeout(() => navigation.navigate('server', { serverId: serverObject._id.toHexString() }), 500); - }, [serverAddress, realm]); + }, [realm]); return ( @@ -85,7 +108,7 @@ export default function ServerAddModal({route, navigation}) { - If you're using HTTPS, ensure a trusted certificate has been configured via HTTP.SYS + AMNet uses HTTP by default. Unless has been configured to work with HTTP.SYS, HTTPS will not work. ) }