Update: 2026-06-26 01:10:36

This commit is contained in:
Hamza-Ayed
2026-06-26 01:10:36 +03:00
parent 595ae99e1d
commit a9e2ee1a58
6 changed files with 84 additions and 106 deletions

View File

@@ -68,11 +68,13 @@ try {
]); ]);
} else { } else {
// الإضافة لجدول المستخدمين (خدمة العملاء) // الإضافة لجدول المستخدمين (خدمة العملاء)
$sql = "INSERT INTO users (id, phone, email, gender, password, birthdate, user_type, first_name, last_name, site, country, created_at) $sql = "INSERT INTO users (id, fingerprint, fingerprint_hash, phone, email, gender, password, birthdate, user_type, first_name, last_name, site, country, status, created_at)
VALUES (:id, :phone, :email, :gender, :pass, :bdate, 'service', :fname, :lname, :site, :country, NOW())"; VALUES (:id, :fp, :fp_hash, :phone, :email, :gender, :pass, :bdate, 'service', :fname, :lname, :site, :country, 'approved', NOW())";
$stmt = $con->prepare($sql); $stmt = $con->prepare($sql);
$stmt->execute([ $stmt->execute([
':id' => $uniqueId, ':id' => $uniqueId,
':fp' => $encFp,
':fp_hash' => $fpHash,
':phone' => $encPhone, ':phone' => $encPhone,
':email' => $encEmail, ':email' => $encEmail,
':gender' => $gender, ':gender' => $gender,

View File

@@ -20,7 +20,5 @@
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.0</string> <string>1.0</string>
<key>MinimumOSVersion</key>
<string>12.0</string>
</dict> </dict>
</plist> </plist>

View File

@@ -1,62 +1,52 @@
PODS: PODS:
- AppAuth (2.0.0):
- AppAuth/Core (= 2.0.0)
- AppAuth/ExternalUserAgent (= 2.0.0)
- AppAuth/Core (2.0.0)
- AppAuth/ExternalUserAgent (2.0.0):
- AppAuth/Core
- AppCheckCore (11.2.0):
- GoogleUtilities/Environment (~> 8.0)
- GoogleUtilities/UserDefaults (~> 8.0)
- PromisesObjC (~> 2.4)
- device_info_plus (0.0.1): - device_info_plus (0.0.1):
- Flutter - Flutter
- Firebase/Auth (12.0.0): - Firebase/Auth (12.14.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseAuth (~> 12.0.0) - FirebaseAuth (~> 12.14.0)
- Firebase/CoreOnly (12.0.0): - Firebase/CoreOnly (12.14.0):
- FirebaseCore (~> 12.0.0) - FirebaseCore (~> 12.14.0)
- Firebase/Messaging (12.0.0): - Firebase/Messaging (12.14.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseMessaging (~> 12.0.0) - FirebaseMessaging (~> 12.14.0)
- firebase_auth (6.0.0): - firebase_auth (6.5.2):
- Firebase/Auth (= 12.0.0) - Firebase/Auth (= 12.14.0)
- firebase_core - firebase_core
- Flutter - Flutter
- firebase_core (4.0.0): - firebase_core (4.10.0):
- Firebase/CoreOnly (= 12.0.0) - Firebase/CoreOnly (= 12.14.0)
- Flutter - Flutter
- firebase_messaging (16.0.0): - firebase_messaging (16.3.0):
- Firebase/Messaging (= 12.0.0) - Firebase/Messaging (= 12.14.0)
- firebase_core - firebase_core
- Flutter - Flutter
- FirebaseAppCheckInterop (12.0.0) - FirebaseAppCheckInterop (12.14.0)
- FirebaseAuth (12.0.0): - FirebaseAuth (12.14.0):
- FirebaseAppCheckInterop (~> 12.0.0) - FirebaseAppCheckInterop (~> 12.14.0)
- FirebaseAuthInterop (~> 12.0.0) - FirebaseAuthInterop (~> 12.14.0)
- FirebaseCore (~> 12.0.0) - FirebaseCore (~> 12.14.0)
- FirebaseCoreExtension (~> 12.0.0) - FirebaseCoreExtension (~> 12.14.0)
- GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
- GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Environment (~> 8.1)
- GTMSessionFetcher/Core (< 6.0, >= 3.4) - GTMSessionFetcher/Core (< 6.0, >= 3.4)
- RecaptchaInterop (~> 101.0) - RecaptchaInterop (~> 101.0)
- FirebaseAuthInterop (12.0.0) - FirebaseAuthInterop (12.14.0)
- FirebaseCore (12.0.0): - FirebaseCore (12.14.0):
- FirebaseCoreInternal (~> 12.0.0) - FirebaseCoreInternal (~> 12.14.0)
- GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Environment (~> 8.1)
- GoogleUtilities/Logger (~> 8.1) - GoogleUtilities/Logger (~> 8.1)
- FirebaseCoreExtension (12.0.0): - FirebaseCoreExtension (12.14.0):
- FirebaseCore (~> 12.0.0) - FirebaseCore (~> 12.14.0)
- FirebaseCoreInternal (12.0.0): - FirebaseCoreInternal (12.14.0):
- "GoogleUtilities/NSData+zlib (~> 8.1)" - "GoogleUtilities/NSData+zlib (~> 8.1)"
- FirebaseInstallations (12.0.0): - FirebaseInstallations (12.14.0):
- FirebaseCore (~> 12.0.0) - FirebaseCore (~> 12.14.0)
- GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Environment (~> 8.1)
- GoogleUtilities/UserDefaults (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1)
- PromisesObjC (~> 2.4) - PromisesObjC (~> 2.4)
- FirebaseMessaging (12.0.0): - FirebaseMessaging (12.14.0):
- FirebaseCore (~> 12.0.0) - FirebaseCore (~> 12.14.0)
- FirebaseInstallations (~> 12.0.0) - FirebaseInstallations (~> 12.14.0)
- GoogleDataTransport (~> 10.1) - GoogleDataTransport (~> 10.1)
- GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/AppDelegateSwizzler (~> 8.1)
- GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Environment (~> 8.1)
@@ -73,51 +63,34 @@ PODS:
- Flutter - Flutter
- flutter_secure_storage (6.0.0): - flutter_secure_storage (6.0.0):
- Flutter - Flutter
- google_sign_in_ios (0.0.1):
- Flutter
- FlutterMacOS
- GoogleSignIn (~> 9.0)
- GTMSessionFetcher (>= 3.4.0)
- GoogleDataTransport (10.1.0): - GoogleDataTransport (10.1.0):
- nanopb (~> 3.30910.0) - nanopb (~> 3.30910.0)
- PromisesObjC (~> 2.4) - PromisesObjC (~> 2.4)
- GoogleSignIn (9.0.0): - GoogleUtilities/AppDelegateSwizzler (8.1.1):
- AppAuth (~> 2.0)
- AppCheckCore (~> 11.0)
- GTMAppAuth (~> 5.0)
- GTMSessionFetcher/Core (~> 3.3)
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
- GoogleUtilities/Environment - GoogleUtilities/Environment
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/Network - GoogleUtilities/Network
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Environment (8.1.1):
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Logger (8.1.1):
- GoogleUtilities/Environment - GoogleUtilities/Environment
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Network (8.1.0): - GoogleUtilities/Network (8.1.1):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib" - "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Reachability - GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (8.1.0)": - "GoogleUtilities/NSData+zlib (8.1.1)":
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Privacy (8.1.0) - GoogleUtilities/Privacy (8.1.1)
- GoogleUtilities/Reachability (8.1.0): - GoogleUtilities/Reachability (8.1.1):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/UserDefaults (8.1.0): - GoogleUtilities/UserDefaults (8.1.1):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GTMAppAuth (5.0.0): - GTMSessionFetcher/Core (5.3.0)
- AppAuth/Core (~> 2.0)
- GTMSessionFetcher/Core (< 4.0, >= 3.3)
- GTMSessionFetcher (3.5.0):
- GTMSessionFetcher/Full (= 3.5.0)
- GTMSessionFetcher/Core (3.5.0)
- GTMSessionFetcher/Full (3.5.0):
- GTMSessionFetcher/Core
- image_cropper (0.0.4): - image_cropper (0.0.4):
- Flutter - Flutter
- TOCropViewController (~> 2.7.4) - TOCropViewController (~> 2.7.4)
@@ -146,9 +119,9 @@ PODS:
- path_provider_foundation (0.0.1): - path_provider_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- permission_handler_apple (9.3.0): - permission_handler_apple (9.4.8):
- Flutter - Flutter
- PromisesObjC (2.4.0) - PromisesObjC (2.4.1)
- RecaptchaInterop (101.0.0) - RecaptchaInterop (101.0.0)
- SDWebImage (5.21.2): - SDWebImage (5.21.2):
- SDWebImage/Core (= 5.21.2) - SDWebImage/Core (= 5.21.2)
@@ -176,7 +149,6 @@ DEPENDENCIES:
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`)
- image_cropper (from `.symlinks/plugins/image_cropper/ios`) - image_cropper (from `.symlinks/plugins/image_cropper/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
@@ -188,8 +160,6 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- AppAuth
- AppCheckCore
- Firebase - Firebase
- FirebaseAppCheckInterop - FirebaseAppCheckInterop
- FirebaseAuth - FirebaseAuth
@@ -200,9 +170,7 @@ SPEC REPOS:
- FirebaseInstallations - FirebaseInstallations
- FirebaseMessaging - FirebaseMessaging
- GoogleDataTransport - GoogleDataTransport
- GoogleSignIn
- GoogleUtilities - GoogleUtilities
- GTMAppAuth
- GTMSessionFetcher - GTMSessionFetcher
- libwebp - libwebp
- Mantle - Mantle
@@ -230,8 +198,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_local_notifications/ios" :path: ".symlinks/plugins/flutter_local_notifications/ios"
flutter_secure_storage: flutter_secure_storage:
:path: ".symlinks/plugins/flutter_secure_storage/ios" :path: ".symlinks/plugins/flutter_secure_storage/ios"
google_sign_in_ios:
:path: ".symlinks/plugins/google_sign_in_ios/darwin"
image_cropper: image_cropper:
:path: ".symlinks/plugins/image_cropper/ios" :path: ".symlinks/plugins/image_cropper/ios"
image_picker_ios: image_picker_ios:
@@ -250,39 +216,34 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/vibration/ios" :path: ".symlinks/plugins/vibration/ios"
SPEC CHECKSUMS: SPEC CHECKSUMS:
AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063
AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
Firebase: 800d487043c0557d9faed71477a38d9aafb08a41 Firebase: 7cc10425300768ec86292688af5cb228f0604bde
firebase_auth: 5a5603bbe7fc673f88b7c652bf9c41d6c742b545 firebase_auth: d4091ec40b52cc2ea56171ea521c30b388844acb
firebase_core: 633e1851ffe1b9ab875f6467a4f574c79cef02e4 firebase_core: 383e19b49a08df5d7a6cf5017616de6a357ed7af
firebase_messaging: d17feef781edc84ebefe62624fb384358ad96361 firebase_messaging: ab03d6090864c0fb8136521231df6a66cb13be49
FirebaseAppCheckInterop: c848d06a04030c9858ef0ae555b82035dbe470d0 FirebaseAppCheckInterop: f123c0261a7b46f060e98fc2961651f1ac68f384
FirebaseAuth: 654e4de84787c45d7265599a651038e854ccb439 FirebaseAuth: 01a77d472aec77ec008141e7d859d1b9cb8dc2cf
FirebaseAuthInterop: 002da671896af5e8879ae117dc604ed240b86e80 FirebaseAuthInterop: 63056ef7f9602e79a8f8d756d4cb35f38e2927c3
FirebaseCore: 055f4ab117d5964158c833f3d5e7ec6d91648d4a FirebaseCore: 4939b340b9c598dc1f965d68f8fe57e630b65407
FirebaseCoreExtension: 639afb3de6abd611952be78a794c54a47fa0f361 FirebaseCoreExtension: ee3e3697acea1062288b1900bcdcab4d59ab93b4
FirebaseCoreInternal: dedc28e569a4be85f38f3d6af1070a2e12018d55 FirebaseCoreInternal: 090369a5fffd7423cf88006ab4d2ccc2173a8db9
FirebaseInstallations: d4c7c958f99c8860d7fcece786314ae790e2f988 FirebaseInstallations: 7cdc919e29dc54306edeffdbdc1eed1a40d7d1e7
FirebaseMessaging: af49f8d7c0a3d2a017d9302c80946f45a7777dde FirebaseMessaging: 4803888ce3002188f24e19faa8d2326261538426
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1 flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb
flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13
google_sign_in_ios: 205742c688aea0e64db9da03c33121694a365109
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 GoogleUtilities: 4f2618a4a1e762a1ee134a1e2323bba9843e06da
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 GTMSessionFetcher: 127211aeec0b1e904fc49f4f6f895dcc535b0ecf
GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
image_cropper: c4326ea50132b1e1564499e5d32a84f01fb03537 image_cropper: c4326ea50132b1e1564499e5d32a84f01fb03537
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
@@ -290,7 +251,7 @@ SPEC CHECKSUMS:
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
vibration: 69774ad57825b11c951ee4c46155f455d7a592ce vibration: ca8104a8875b9c493e15b21b04e456befd0ff6eb
PODFILE CHECKSUM: 53a6aebc29ccee84c41f92f409fc20cd4ca011f1 PODFILE CHECKSUM: 53a6aebc29ccee84c41f92f409fc20cd4ca011f1

View File

@@ -477,7 +477,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
@@ -607,7 +607,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -658,7 +658,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;

View File

@@ -244,7 +244,13 @@ class CRUD {
} }
// Initialize app signature if null // Initialize app signature if null
_appSignature ??= await SecurityHelper.getAppSignature(); if (_appSignature == null) {
try {
_appSignature = await SecurityHelper.getAppSignature();
} catch (_) {
_appSignature = '';
}
}
final headers = { final headers = {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
@@ -277,7 +283,13 @@ class CRUD {
}; };
// Initialize app signature if null // Initialize app signature if null
_appSignature ??= await SecurityHelper.getAppSignature(); if (_appSignature == null) {
try {
_appSignature = await SecurityHelper.getAppSignature();
} catch (_) {
_appSignature = '';
}
}
final headers = { final headers = {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',

View File

@@ -14,6 +14,9 @@ class SecurityHelper {
Log.print('----------------------------------------------------'); Log.print('----------------------------------------------------');
return signature; return signature;
} on MissingPluginException {
Log.print('⚠️ getAppSignature not implemented on this platform');
return null;
} on PlatformException catch (e) { } on PlatformException catch (e) {
Log.print('❌ Failed to get app signature: ${e.message}'); Log.print('❌ Failed to get app signature: ${e.message}');
return null; return null;
@@ -24,6 +27,8 @@ class SecurityHelper {
try { try {
final bool isRooted = await platform.invokeMethod('isNativeRooted'); final bool isRooted = await platform.invokeMethod('isNativeRooted');
return isRooted; return isRooted;
} on MissingPluginException {
return false;
} on PlatformException catch (e) { } on PlatformException catch (e) {
Log.print('❌ Failed to check root: ${e.message}'); Log.print('❌ Failed to check root: ${e.message}');
return false; return false;