Merge pull request #49 from ente-io/handle_low_end_device

Fix: Attempt to avoid crash on low-spec devices
This commit is contained in:
Neeraj Gupta 2023-02-06 11:39:37 +05:30 committed by GitHub
commit 1584a23936
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 69 additions and 21 deletions

View file

@ -2,7 +2,7 @@ PODS:
- connectivity (0.0.1):
- Flutter
- Reachability
- device_info (0.0.1):
- device_info_plus (0.0.1):
- Flutter
- DKImagePickerController/Core (4.3.4):
- DKImagePickerController/ImageDataManager
@ -104,7 +104,7 @@ PODS:
DEPENDENCIES:
- connectivity (from `.symlinks/plugins/connectivity/ios`)
- device_info (from `.symlinks/plugins/device_info/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- fk_user_agent (from `.symlinks/plugins/fk_user_agent/ios`)
- Flutter (from `Flutter`)
@ -143,8 +143,8 @@ SPEC REPOS:
EXTERNAL SOURCES:
connectivity:
:path: ".symlinks/plugins/connectivity/ios"
device_info:
:path: ".symlinks/plugins/device_info/ios"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
file_picker:
:path: ".symlinks/plugins/file_picker/ios"
fk_user_agent:
@ -190,7 +190,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467
device_info: d7d233b645a32c40dfdc212de5cf646ca482f175
device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
file_picker: ce3938a0df3cc1ef404671531facef740d03f920

View file

@ -17,6 +17,7 @@ import 'package:ente_auth/ui/code_widget.dart';
import 'package:ente_auth/ui/common/loading_widget.dart';
import 'package:ente_auth/ui/scanner_page.dart';
import 'package:ente_auth/ui/settings_page.dart';
import 'package:ente_auth/utils/device_info.dart';
import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:move_to_background/move_to_background.dart';

View file

@ -4,6 +4,7 @@ import 'dart:typed_data';
import 'package:computer/computer.dart';
import 'package:ente_auth/models/derived_key_result.dart';
import 'package:ente_auth/models/encryption_result.dart';
import 'package:ente_auth/utils/device_info.dart';
import 'package:flutter_sodium/flutter_sodium.dart';
import 'package:logging/logging.dart';
@ -287,16 +288,29 @@ class CryptoUtil {
Uint8List salt,
) async {
final logger = Logger("pwhash");
// Default with 1 GB mem and 4 ops limit
int memLimit = Sodium.cryptoPwhashMemlimitSensitive;
int opsLimit = Sodium.cryptoPwhashOpslimitSensitive;
if (await isLowSpecDevice()) {
logger.info("low spec device detected");
// When high memLimit is used, on low spec device the OS might kill the
// app with OOM. To avoid that, start with 256 MB and 16 ops limit
memLimit = Sodium.cryptoPwhashMemlimitModerate;
opsLimit = 16;
}
Uint8List key;
while (memLimit > Sodium.cryptoPwhashMemlimitMin &&
opsLimit < Sodium.cryptoPwhashOpslimitMax) {
while (memLimit >= Sodium.cryptoPwhashMemlimitMin &&
opsLimit <= Sodium.cryptoPwhashOpslimitMax) {
try {
key = await deriveKey(password, salt, memLimit, opsLimit);
return DerivedKeyResult(key, memLimit, opsLimit);
} catch (e, s) {
logger.severe(e, s);
logger.severe(
"failed to derive memLimit: $memLimit and opsLimit: $opsLimit",
e,
s,
);
}
memLimit = (memLimit / 2).round();
opsLimit = opsLimit * 2;

View file

@ -0,0 +1,31 @@
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:logging/logging.dart';
late DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
// https://gist.github.com/adamawolf/3048717
late Set<String> iOSLowEndMachineCodes = <String>{
"iPhone5,2",
"iPhone5,3",
"iPhone5,4",
"iPhone6,1",
"iPhone6,2",
"iPhone7,2",
"iPhone7,1",
};
Future<bool> isLowSpecDevice() async {
try {
if (Platform.isIOS) {
final IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo;
debugPrint("ios utc name ${iosInfo.utsname.machine}");
return iOSLowEndMachineCodes.contains(iosInfo.utsname.machine);
}
} catch (e) {
Logger("device_info").severe("deviceSpec check failed", e);
}
return false;
}

View file

@ -6,6 +6,7 @@ import FlutterMacOS
import Foundation
import connectivity_macos
import device_info_plus
import flutter_local_notifications
import flutter_secure_storage_macos
import package_info_plus_macos
@ -18,6 +19,7 @@ import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FlutterSecureStorageMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageMacosPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))

View file

@ -28,7 +28,7 @@ packages:
name: archive
url: "https://pub.dartlang.org"
source: hosted
version: "3.3.5"
version: "3.3.6"
args:
dependency: transitive
description:
@ -238,7 +238,7 @@ packages:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.3+2"
version: "0.3.3+4"
crypto:
dependency: transitive
description:
@ -274,20 +274,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.7.8"
device_info:
device_info_plus:
dependency: "direct main"
description:
name: device_info
name: device_info_plus
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
device_info_platform_interface:
version: "8.0.0"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_platform_interface
name: device_info_plus_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
version: "7.0.0"
diff_match_patch:
dependency: transitive
description:
@ -666,7 +666,7 @@ packages:
name: logging
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.1.1"
matcher:
dependency: transitive
description:
@ -1009,7 +1009,7 @@ packages:
name: shared_preferences_foundation
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
version: "2.1.3"
shared_preferences_linux:
dependency: transitive
description:
@ -1112,14 +1112,14 @@ packages:
name: sqflite
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.3"
version: "2.2.4+1"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.1"
version: "2.4.2+2"
stack_trace:
dependency: transitive
description:

View file

@ -16,7 +16,7 @@ dependencies:
confetti: ^0.7.0
connectivity: ^3.0.3
cupertino_icons: ^1.0.0
device_info: ^2.0.2
device_info_plus: ^8.0.0
dio: ^4.0.6
dotted_border: ^2.0.0+2
email_validator: ^2.0.1