diff --git a/lib/models/manifest.dart b/lib/models/manifest.dart index 9c00d4f..c301976 100644 --- a/lib/models/manifest.dart +++ b/lib/models/manifest.dart @@ -8,8 +8,7 @@ class Manifest { final String backgroundColor; final String themeColor; - Manifest(this.display, this.startUrl, this.shortName, this.name, - this.backgroundColor, this.themeColor); + Manifest(this.display, this.startUrl, this.shortName, this.name, this.backgroundColor, this.themeColor); String get baseUrl { Uri url = Uri.parse(startUrl); @@ -36,8 +35,10 @@ class Manifest { 'theme_color': themeColor, }; - static Future Function(Dio dio) get(String url) => (dio) async { - final res = await dio.get('$url/manifest.json'); + static Future Function(Dio dio) get(String url, {bool isUriPretty = true}) => (dio) async { + Response res = !isUriPretty + ? await dio.get('$url/index.php?r=web%2Fpwa-manifest%2Findex') + : await dio.get('$url/manifest.json'); return Manifest.fromJson(res.data); }; } diff --git a/lib/util/extensions.dart b/lib/util/extensions.dart index ff361d7..bc15fea 100644 --- a/lib/util/extensions.dart +++ b/lib/util/extensions.dart @@ -8,6 +8,7 @@ import 'package:humhub/util/const.dart'; import 'package:humhub/util/providers.dart'; import 'package:loggy/loggy.dart'; import 'package:webview_flutter/webview_flutter.dart'; + // ignore_for_file: use_build_context_synchronously extension MyCookies on WebViewCookieManager { Future setMyCookies(Manifest manifest) async { @@ -55,21 +56,19 @@ extension MyWebViewController on InAppWebViewController { var isHide = ref.read(humHubProvider).isHideDialog; isHide ? SystemNavigator.pop() - : Navigator.of(context).pushNamedAndRemoveUntil( - Opener.path, (Route route) => false); + : Navigator.of(context).pushNamedAndRemoveUntil(Opener.path, (Route route) => false); } } class HexColor extends Color { static int _getColorFromHex(String hexColor) { - try{ + try { hexColor = hexColor.toUpperCase().replaceAll("#", ""); if (hexColor.length == 6) { hexColor = "FF$hexColor"; } return int.parse(hexColor, radix: 16); - } - catch(e){ + } catch (e) { logError("Color from manifest is not valid use primary color"); return primaryColor.value; } @@ -93,6 +92,13 @@ extension AsyncValueX on AsyncValue { extension FutureAsyncValueX on Future> { Future get valueOrNull => then( (asyncValue) => asyncValue.asData?.value, - ); + ); } +extension PrettyUri on Uri { + bool isUriPretty() { + RegExp regex = RegExp(r'index\.php.*[?&]r='); + String path = Uri.decodeComponent(toString()); + return !regex.hasMatch(path); + } +} diff --git a/lib/util/notifications/channel.dart b/lib/util/notifications/channel.dart index b937ee9..92a3e5f 100644 --- a/lib/util/notifications/channel.dart +++ b/lib/util/notifications/channel.dart @@ -1,5 +1,4 @@ import 'package:flutter/cupertino.dart'; -import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:humhub/pages/web_view.dart'; import 'package:humhub/util/universal_opener_controller.dart'; import 'package:humhub/util/router.dart'; diff --git a/lib/util/opener_controller.dart b/lib/util/opener_controller.dart index 2968012..34b23d7 100644 --- a/lib/util/opener_controller.dart +++ b/lib/util/opener_controller.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http/http.dart'; import 'package:humhub/models/hum_hub.dart'; import 'package:humhub/models/manifest.dart'; +import 'package:humhub/util/extensions.dart'; import 'package:humhub/util/providers.dart'; import 'package:http/http.dart' as http; import 'package:loggy/loggy.dart'; @@ -25,15 +26,19 @@ class OpenerController { findManifest(String url) async { Uri uri = assumeUrl(url); - for (var i = uri.pathSegments.length - 1; i >= 0; i--) { - String urlIn = "${uri.origin}/${uri.pathSegments.getRange(0, i).join('/')}"; - asyncData = await APIProvider.of(ref).request(Manifest.get(i != 0 ? urlIn : uri.origin)); - if (!asyncData!.hasError) break; - } - if (uri.pathSegments.isEmpty) { - asyncData = await APIProvider.of(ref).request(Manifest.get(uri.origin)); + if (!uri.isUriPretty()) { + asyncData = await APIProvider.of(ref).request(Manifest.get(uri.origin, isUriPretty: false)); + } else { + for (var i = uri.pathSegments.length - 1; i >= 0; i--) { + String urlIn = "${uri.origin}/${uri.pathSegments.getRange(0, i).join('/')}"; + asyncData = await APIProvider.of(ref).request(Manifest.get(i != 0 ? urlIn : uri.origin)); + if (!asyncData!.hasError) break; + } + if (uri.pathSegments.isEmpty) { + asyncData = await APIProvider.of(ref).request(Manifest.get(uri.origin)); + } } - if(asyncData!.hasError) return; + if (asyncData!.hasError) return; await checkHumHubModuleView(asyncData!.value!.startUrl); } diff --git a/test/pretty_urls_test.dart b/test/pretty_urls_test.dart new file mode 100644 index 0000000..5d3ec13 --- /dev/null +++ b/test/pretty_urls_test.dart @@ -0,0 +1,23 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:humhub/util/extensions.dart'; + +Future main() async { + group("Testing pretty urls", () { + test("Community url", () { + Uri uri = Uri.parse("https://community.humhub.com/dashboard"); + expect(uri.isUriPretty(), true); + }); + test("Lado", () { + Uri uri = Uri.parse("https://labo-sphere.fr/index.php?r=user%2Fauth%2Flogin"); + expect(uri.isUriPretty(), false); + }); + test("Test12345", () { + Uri uri = Uri.parse("https://sometestproject12345.humhub.com/dashboard"); + expect(uri.isUriPretty(), true); + }); + test("Local", () { + Uri uri = Uri.parse("http://192.168.64.3/humhub/index.php?r=user%2Fauth%2Flogin"); + expect(uri.isUriPretty(), false); + }); + }); +}