diff --git a/.env b/.env
index 797c841..ded27e0 100644
--- a/.env
+++ b/.env
@@ -5,7 +5,7 @@ accountSIDTwillo=QFx0qy456juj3839xuy2194q629q1fj0y7XrXlBl
serverAPI=QQQQobSrrFi:QVQ87xU7zwCvmZzZdaxuS2f23Y4mz7MzyOzr8od2br6KYyeFaTVLG3K3hx5ZaUyx7eYvAYpAVdKk-286NTRi3zs9iSOnXtXRIxswg3KecBmsl3VxJ9wO-vIpwu4Pv7dkHkXniuxMSDgWXrXlBl
mapAPIKEY=QOmqZsFsutLDCtZCRIUAZAkB5v6AMkKEPMbJGa3XrXlBl
twilloRecoveryCode=CAU79DHPH1BE9PUH4ETXTSXZXrXlBl
-apiKeyHere=g_WNUb5L-7-F8oHpUmgIzH7ETeH9xZ8RwGG9_G8zX9A
+apiKeyHere=g_WNUb5L-tripz7-F8oHpUmgIzH7ETeH9xZ8RwGG9_G8zX9A
authTokenTwillo=70u98ju0214xx4q0u74028u021u4qu65XrXlBl
chatGPTkey=zg-4C26q4SYBKQeHZDqkWowC9XrxgUEfUy9JRw2rm6Q2adb3kjwXrXlBl
transactionCloude=Qhcwilomqcoib:QVO_JNYED2XWA26YXKC2TP:YK1DVH6SJB31N3PE1UXrXlBl
@@ -36,7 +36,7 @@ agoraAppCertificate=j17q944u49390q758u1649448q2y6xfuXrXlBl
usernamePayMob=37319104052XrXlBl
passwordPayMob='g@nkD2#99!hD_.wXrXlBl'
integrationIdPayMob=0237730XrXlBl
-payMobApikey='MDrGqKEWS1rVqHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=XrXlBl'
+payMobApikey='MDrGqKEWS1rVqHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=cvcXrXlBlbbbbb'
integrationIdPayMobWallet=0237739XrXlBl
ocpApimSubscriptionKey=0f5dacccdbce4131b1a5f952996302e3
smsPasswordEgypt="J)Vh=qb/@MXrXlBl"
@@ -47,11 +47,15 @@ payMobOutClientSecrret='xyjjRlahJM0Xc38WjApCOh8bvgL9slFpNdM9YeCu9AhLqboKMPtmSvc2
payMobOutClient_id='Z05ut48dVkS2gI2zenFFcKsfDKfHAU0WELqKyJ0LXrXlBl'
payMobOutPassword='D2zJFxkE#LN3vz38z2dYxpNfWXrXlBl'
payMobOutUserName='zjujl_qvo_fwjfgjlXrXlBl'
-keyOfApp=nqryjp@1737wqnmqqsjyzjujljksvceiXrXlBl
+keyOfApp=nqryjpb@1737wqlnmqqsQ5nuJeIYhMN4PDYr7qjyzjujljksvceiXrXlBl
initializationVector=abcdefghijklmnop
-privateKeyFCM="-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n"
-
-
+privateKeyFCM="-----BEGIN PRIVATE KEY-----\\nMIIEvQIBAkki5DANBgkqhjbjhbjbhjhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsT9GZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vgio9lQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n"
+sss_pass=wqnmqqsjyvwv:nqrYJP@17378XrXlBl
+sss_encryptionSalt=zg-vlie-2l1ZlpxiLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl
+addd=BlBlNl
+allowed=mobile-app:
+passnpassenger=hbgbitbXrXrBr
+newId=new
a=q
b=x
c=f
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 00c966e..6832a50 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -61,8 +61,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = 23
targetSdk = flutter.targetSdkVersion
- versionCode = 118
- versionName = '2.0.118'
+ versionCode = 121
+ versionName = '2.0.121'
multiDexEnabled =true
// manifestPlaceholders can be specified here if needed
@@ -98,6 +98,7 @@ dependencies {
// implementation platform('com.google.firebase:firebase-bom:32.1.1')
implementation "com.stripe:stripe-android:20.52.2"
implementation 'com.stripe:paymentsheet:20.52.2'
+ implementation 'com.scottyab:rootbeer-lib:0.1.0'
// If push provisioning is needed, make sure you have the correct version:
diff --git a/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt b/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt
index cd7a19e..67f67af 100644
--- a/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt
+++ b/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt
@@ -1,8 +1,76 @@
package com.mobileapp.store.ride
-import io.flutter.embedding.android.FlutterActivity
-
+import android.app.AlertDialog
+import android.os.Bundle
+import android.util.Log
import io.flutter.embedding.android.FlutterFragmentActivity
+import java.util.*
-class MainActivity: FlutterFragmentActivity() {
-}
\ No newline at end of file
+class MainActivity : FlutterFragmentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ Log.d("DEBUG", "onCreate executed - Checking root status...")
+
+ // بدء فحص الأمان
+ performSecurityChecks()
+ }
+
+ private fun performSecurityChecks() {
+ val rootDetection = RootDetection
+
+ val isRooted = rootDetection.isRooted()
+ val isDevMode = rootDetection.isDevMode(this)
+ val isTampered = rootDetection.isTampered(this)
+ val isRealDevice = rootDetection.isRealDevice()
+ val isOnExternalStorage = rootDetection.isOnExternalStorage()
+ val isNotTrust = rootDetection.isNotTrust()
+ val checkForIssues = rootDetection.checkForIssues()
+
+ Log.d("DEBUG", "Security Check Results:")
+ Log.d("DEBUG", "isRooted: $isRooted")
+ Log.d("DEBUG", "isDevMode: $isDevMode")
+ Log.d("DEBUG", "isTampered: $isTampered")
+ Log.d("DEBUG", "isRealDevice: $isRealDevice")
+ Log.d("DEBUG", "isOnExternalStorage: $isOnExternalStorage")
+ Log.d("DEBUG", "isNotTrust: $isNotTrust")
+ Log.d("DEBUG", "checkForIssues: $checkForIssues")
+
+ if (isRooted || isTampered) {
+ Log.e("DEBUG", "Security issue detected! Showing dialog.")
+ showSecurityWarningDialog()
+ } else {
+ Log.d(
+ "DEBUG",
+ getString(R.string.device_secure)
+ ) // Using dynamic string based on the device language
+ }
+ }
+
+ private fun showSecurityWarningDialog() {
+ val builder = AlertDialog.Builder(this)
+ builder.setTitle(getString(R.string.security_warning_title)) // Title based on language
+ builder.setMessage(
+ getString(R.string.security_warning_message)
+ ) // Message based on language
+
+ builder.setPositiveButton(getString(R.string.exit_button)) { _, _ ->
+ Log.e("DEBUG", "User clicked exit. Closing app.")
+ clearAppDataAndExit()
+ }
+
+ builder.setCancelable(false)
+ val alertDialog = builder.create()
+ alertDialog.show()
+ }
+
+ private fun clearAppDataAndExit() {
+ // حذف جميع البيانات هنا، مثل ملفات التخزين وبيانات التطبيق
+ // يمكنك استخدام SharedPreferences أو قاعدة بيانات
+ Log.d("DEBUG", "Clearing app data...")
+
+ // يمكنك استخدام كود لحذف جميع البيانات (SharedPreferences, DB, ملفات)
+ // ثم إغلاق التطبيق:
+ finishAffinity() // يغلق جميع الأنشطة ويفتح نافذة جديدة
+ }
+}
diff --git a/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt b/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt
new file mode 100644
index 0000000..84b66db
--- /dev/null
+++ b/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt
@@ -0,0 +1,61 @@
+package com.mobileapp.store.ride
+
+import android.content.Context
+import android.os.Build
+import android.os.Environment
+import android.provider.Settings
+import com.scottyab.rootbeer.RootBeer
+import java.io.File
+
+object RootDetection {
+
+ fun isRooted(): Boolean {
+ val paths =
+ arrayOf(
+ "/system/app/Superuser.apk",
+ "/system/xbin/su",
+ "/system/bin/su",
+ "/system/bin/magisk",
+ "/system/xbin/magisk",
+ "/sbin/magisk"
+ )
+ for (path in paths) {
+ if (File(path).exists()) {
+ return true
+ }
+ }
+ return false
+ }
+
+ fun isDevMode(context: Context): Boolean {
+ return Settings.Global.getInt(
+ context.contentResolver,
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
+ 0
+ ) == 1
+ }
+
+ fun isTampered(context: Context): Boolean {
+ val rootBeer = RootBeer(context)
+ return rootBeer.isRooted
+ }
+
+ fun checkForIssues(): Boolean {
+ // يمكنك إضافة المزيد من الفحوصات حسب حاجتك
+ return false // نفترض أنه لا توجد مشاكل للأجهزة غير المتجذرة
+ }
+
+ fun isRealDevice(): Boolean {
+ return !Build.FINGERPRINT.contains("generic") && !Build.MODEL.contains("google_sdk")
+ }
+
+ fun isOnExternalStorage(): Boolean {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
+ Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED
+ }
+
+ fun isNotTrust(): Boolean {
+ // مثال تحقق من الثقة (قد تحتاج لتطوير هذا حسب متطلباتك)
+ return false // نفترض أن الجهاز موثوق
+ }
+}
diff --git a/android/app/src/main/res/values-ar/strings.xml b/android/app/src/main/res/values-ar/strings.xml
new file mode 100644
index 0000000..6b7cb35
--- /dev/null
+++ b/android/app/src/main/res/values-ar/strings.xml
@@ -0,0 +1,6 @@
+
+ تحذير أمني
+ تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن تشغيل التطبيق على هذا الجهاز.
+ إغلاق التطبيق
+ الجهاز آمن. الاستمرار بشكل طبيعي.
+
\ No newline at end of file
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 65245cb..ed87b76 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -4,4 +4,10 @@
high_importance_channel
AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0
+ Security Warning
+ A security issue or modification has been detected on
+ this device. The app cannot run on this device.
+ Exit App
+ Device is secure. Proceeding normally.
+
\ No newline at end of file
diff --git a/android/gradle.properties b/android/gradle.properties
index 5794139..e6860ca 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4096M
android.useAndroidX=true
android.enableJetifier=true
android.defaults.buildfeatures.buildconfig=true
-android.nonTransitiveRClass=false
-android.nonFinalResIds=false
-
+android.nonTransitiveRClass=true
+android.nonFinalResIds=true
+dart.obfuscation=true
android.enableR8.fullMode=true
\ No newline at end of file
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 1ca65aa..09baf62 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -135,6 +135,10 @@ PODS:
- TOCropViewController (~> 2.7.4)
- image_picker_ios (0.0.1):
- Flutter
+ - IOSSecuritySuite (1.9.11)
+ - jailbreak_root_detection (1.0.1):
+ - Flutter
+ - IOSSecuritySuite (~> 1.9.10)
- just_audio (0.0.1):
- Flutter
- live_activities (0.0.1):
@@ -238,6 +242,7 @@ DEPENDENCIES:
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`)
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
+ - jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`)
- just_audio (from `.symlinks/plugins/just_audio/ios`)
- live_activities (from `.symlinks/plugins/live_activities/ios`)
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
@@ -277,6 +282,7 @@ SPEC REPOS:
- GoogleUtilities
- GTMAppAuth
- GTMSessionFetcher
+ - IOSSecuritySuite
- nanopb
- PromisesObjC
- RecaptchaInterop
@@ -323,6 +329,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/image_cropper/ios"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
+ jailbreak_root_detection:
+ :path: ".symlinks/plugins/jailbreak_root_detection/ios"
just_audio:
:path: ".symlinks/plugins/just_audio/ios"
live_activities:
@@ -396,6 +404,8 @@ SPEC CHECKSUMS:
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
image_cropper: 37d40f62177c101ff4c164906d259ea2c3aa70cf
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
+ IOSSecuritySuite: b51056d5411aee567153ca86ce7f6edfdc5d2654
+ jailbreak_root_detection: b95de80c3e51eec1fc7d0225784d2fc038fa95ed
just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa
live_activities: 5a5ddcfe2bd2cbbe7555a5da9c35b07d1a4ff2e8
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 382ae34..a509b13 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -16,6 +16,7 @@
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
C60CA7372BE9EF38002095B2 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */; };
+ C6229B682D610CB20014397D /* JailbreakDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6229B672D610C970014397D /* JailbreakDetection.swift */; };
C624C4642BD56D34002834AF /* tone1.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C624C45C2BD56D34002834AF /* tone1.mp3 */; };
C624C4652BD56D34002834AF /* start.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45D2BD56D34002834AF /* start.wav */; };
C624C4672BD56D34002834AF /* promo.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45F2BD56D34002834AF /* promo.wav */; };
@@ -23,6 +24,7 @@
C628BC412C316B1200E4D33B /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = C628BC402C316B1100E4D33B /* ding.wav */; };
C6B15AA12B5FB24600746405 /* order.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15A9F2B5FB24600746405 /* order.wav */; };
C6B15AA22B5FB24600746405 /* tone2.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15AA02B5FB24600746405 /* tone2.wav */; };
+ C6B450142D67556C001427AA /* Constants1.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B450132D67556B001427AA /* Constants1.swift */; };
D529E7C8240CCC30BB7358A2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B099132D71B1299FCDFD9C8 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
@@ -72,6 +74,7 @@
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../../../Downloads/GoogleService-Info.plist"; sourceTree = ""; };
+ C6229B672D610C970014397D /* JailbreakDetection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JailbreakDetection.swift; sourceTree = ""; };
C624C45C2BD56D34002834AF /* tone1.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = tone1.mp3; path = ../../android/app/src/main/res/raw/tone1.mp3; sourceTree = ""; };
C624C45D2BD56D34002834AF /* start.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = start.wav; path = ../../android/app/src/main/res/raw/start.wav; sourceTree = ""; };
C624C45F2BD56D34002834AF /* promo.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = promo.wav; path = ../../android/app/src/main/res/raw/promo.wav; sourceTree = ""; };
@@ -80,6 +83,7 @@
C69588332A8C1F6B00C3AC67 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
C6B15A9F2B5FB24600746405 /* order.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = order.wav; sourceTree = ""; };
C6B15AA02B5FB24600746405 /* tone2.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = tone2.wav; sourceTree = ""; };
+ C6B450132D67556B001427AA /* Constants1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants1.swift; sourceTree = ""; };
CAF37DC30C17166B851DBC8C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
F231BA28015FE2C634809733 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
@@ -160,6 +164,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
+ C6229B672D610C970014397D /* JailbreakDetection.swift */,
C69588332A8C1F6B00C3AC67 /* Runner.entitlements */,
C6B15A9F2B5FB24600746405 /* order.wav */,
C6B15AA02B5FB24600746405 /* tone2.wav */,
@@ -176,6 +181,7 @@
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ C6B450132D67556B001427AA /* Constants1.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
@@ -428,6 +434,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ C6229B682D610CB20014397D /* JailbreakDetection.swift in Sources */,
+ C6B450142D67556C001427AA /* Constants1.swift in Sources */,
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index 3966f9f..a5f250b 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -2,19 +2,39 @@ import UIKit
import Flutter
import FirebaseCore
import GoogleMaps
-// import Constants
@main
@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GMSServices.provideAPIKey(Constants.googleMapsAPIKey)
+ FirebaseApp.configure()
+ GeneratedPluginRegistrant.register(with: self)
- override func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
- GMSServices.provideAPIKey("AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0")
- FirebaseApp.configure()
- GeneratedPluginRegistrant.register(with: self)
- return true
- }
+ if JailbreakDetection.isJailbroken() {
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+ self.showJailbreakAlert()
+ }
+ }
+
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+
+ func showJailbreakAlert() {
+ guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { return }
+
+ let alert = UIAlertController(
+ title: "تحذير أمني",
+ message: "تم اكتشاف أن جهازك يحتوي على جيلبريك. لا يمكن تشغيل التطبيق على هذا الجهاز.",
+ preferredStyle: .alert
+ )
+
+ alert.addAction(UIAlertAction(title: "إنهاء التطبيق", style: .destructive) { _ in
+ exit(0)
+ })
+
+ rootVC.present(alert, animated: true, completion: nil)
+ }
}
-
diff --git a/ios/Runner/Constants.swift b/ios/Runner/Constants.swift
deleted file mode 100644
index b60605b..0000000
--- a/ios/Runner/Constants.swift
+++ /dev/null
@@ -1,8 +0,0 @@
-//
-// Constants.swift
-// Runner
-//
-// Created by Hamza Aleghwairyeen on 15/01/2024.
-//
-
-import Foundation
diff --git a/ios/Runner/Constants1.swift b/ios/Runner/Constants1.swift
new file mode 100644
index 0000000..01788c9
--- /dev/null
+++ b/ios/Runner/Constants1.swift
@@ -0,0 +1,12 @@
+//
+// Constants1.swift
+// Runner
+//
+// Created by Hamza Aleghwairyeen on 20/02/2025.
+//
+
+import Foundation
+
+struct Constants {
+ static let googleMapsAPIKey = "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0"
+}
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index f5823a8..7143b95 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -1,107 +1,116 @@
-
- NSContactsUsageDescription
- This app requires contacts access to function properly.
- LSMinimumSystemVersion
- 12.0
- CFBundleURLTypes
-
-
- CFBundleTypeRole
- Editor
- CFBundleURLSchemes
-
- com.googleusercontent.apps.594687661098-8e26699cris2k3nj5msj1osi59it9kpf
-
-
-
- LSApplicationQueriesSchemes
-
- googlechromes
- comgooglemaps
-
- CADisableMinimumFrameDurationOnPhone
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Tripz
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleGetInfoString
-
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- Tripz
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- 94
- CFBundleSignature
- ????
- CFBundleVersion
- 5.0.94
- NSHumanReadableCopyright
-
- FirebaseAppDelegateProxyEnabled
- NO
- GMSApiKey
- YOUR_API_KEY
- LSApplicationCategoryType
-
- LSRequiresIPhoneOS
-
- NSCameraUsageDescription
- Sovo app requires access to your camera in order to scan QR codes and capture
- images for uploading and access to connect to a call.
- NSFaceIDUsageDescription
- Use Face ID to securely authenticate payment accounts.
- NSLocationAlwaysAndWhenInUseUsageDescription
- This app needs access to your location to provide you with the best ride experience.
+
+ LSApplicationQueriesSchemes
+
+ undecimus
+ sileo
+ zbra
+ filza
+ activator
+ cydia
+
+ NSContactsUsageDescription
+ This app requires contacts access to function properly.
+ LSMinimumSystemVersion
+ 12.0
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLSchemes
+
+ com.googleusercontent.apps.594687661098-8e26699cris2k3nj5msj1osi59it9kpf
+
+
+
+ LSApplicationQueriesSchemes
+
+ googlechromes
+ comgooglemaps
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Tripz
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleGetInfoString
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Tripz
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 95
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 5.0.95
+ NSHumanReadableCopyright
+
+ FirebaseAppDelegateProxyEnabled
+ NO
+ GMSApiKey
+ YOUR_API_KEY
+ LSApplicationCategoryType
+
+ LSRequiresIPhoneOS
+
+ NSCameraUsageDescription
+ Sovo app requires access to your camera in order to scan QR codes and capture images
+ for uploading and access to connect to a call.
+ NSFaceIDUsageDescription
+ Use Face ID to securely authenticate payment accounts.
+ NSLocationAlwaysAndWhenInUseUsageDescription
+ This app needs access to your location to provide you with the best ride experience.
Your location data will be used to find the nearest available cars and connect you with
the closest captain for efficient and convenient rides.
- NSLocationAlwaysUsageDescription
- This app needs access to location.
- NSLocationWhenInUseUsageDescription
- This app needs access to your location to provide you with the best ride experience.
+ NSLocationAlwaysUsageDescription
+ This app needs access to location.
+ NSLocationWhenInUseUsageDescription
+ This app needs access to your location to provide you with the best ride experience.
Your location data will be used to find the nearest available cars and connect you with
the closest captain for efficient and convenient rides.
- NSMicrophoneUsageDescription
- This app requires access to your microphone to record audio, allowing you to add
+ NSMicrophoneUsageDescription
+ This app requires access to your microphone to record audio, allowing you to add
voice recordings to your photos and videos and access to connect to a call.
- NSPhotoLibraryUsageDescription
- Explanation of why your app needs access to the photo library.
- UIApplicationSupportsIndirectInputEvents
-
- UIBackgroundModes
-
- fetch
- location
- remote-notification
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIViewControllerBasedStatusBarAppearance
-
-
+ NSPhotoLibraryUsageDescription
+ Explanation of why your app needs access to the photo library.
+ UIApplicationSupportsIndirectInputEvents
+
+ UIBackgroundModes
+
+ fetch
+ location
+ remote-notification
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
diff --git a/ios/Runner/JailbreakDetection.swift b/ios/Runner/JailbreakDetection.swift
new file mode 100644
index 0000000..504e30e
--- /dev/null
+++ b/ios/Runner/JailbreakDetection.swift
@@ -0,0 +1,25 @@
+//
+// JailbreakDetection.swift
+// Runner
+//
+// Created by Hamza Aleghwairyeen on 15/02/2025.
+//
+
+import Foundation
+
+class JailbreakDetection {
+ static func isJailbroken() -> Bool {
+ let paths = [
+ "/Applications/Cydia.app",
+ "/Library/MobileSubstrate/MobileSubstrate.dylib",
+ "/usr/sbin/sshd",
+ "/etc/apt"
+ ]
+ for path in paths {
+ if FileManager.default.fileExists(atPath: path) {
+ return true
+ }
+ }
+ return false
+ }
+}
diff --git a/lib/constant/api_key.dart b/lib/constant/api_key.dart
index f0e2f77..8dbdaa1 100644
--- a/lib/constant/api_key.dart
+++ b/lib/constant/api_key.dart
@@ -1,3 +1,4 @@
+import 'package:Tripz/main.dart';
import 'package:secure_string_operations/secure_string_operations.dart';
import '../env/env.dart';
@@ -6,6 +7,15 @@ import 'char_map.dart';
class AK {
static final String publishableKey =
X.r(X.r(X.r(Env.stripePublishableKe, cn), cC), cs);
+ static final String sss_pass = X.r(X.r(X.r(Env.sss_pass, cn), cC), cs);
+ static final String allowed = Env.allowed;
+ static final String passnpassenger = X
+ .r(X.r(X.r(Env.passnpassenger, cn), cC), cs)
+ .toString()
+ .split(Env.addd)[0];
+ static final String newId = Env.newId;
+ static final String sss_encryptionSalt =
+ X.r(X.r(X.r(Env.sss_encryptionSalt, cn), cC), cs);
static final String secretKey = X.r(X.r(X.r(Env.secretKey, cn), cC), cs);
static final String basicAuthCredentials =
X.r(X.r(X.r(Env.basicAuthCredentials, cn), cC), cs);
diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart
index 198ac7b..02c1ada 100644
--- a/lib/constant/box_name.dart
+++ b/lib/constant/box_name.dart
@@ -7,6 +7,10 @@ class BoxName {
static const String lang = "lang";
static const String serverChosen = "serverChosen";
static const String gender = "gender";
+ static const String jwt = "jwt";
+ static const String fingerPrint = "fingerPrint";
+ static const String payMobApikey = "payMobApikey";
+ static const String refreshToken = "refreshToken";
static const String serverLocations = "serverLocations";
static const String carType = "carType";
static const String carPlate = "carPlate";
@@ -16,6 +20,7 @@ class BoxName {
static const String locationName = "locationName";
static const String isVerified = 'isVerified';
static const String isFirstTime = 'isFirstTime';
+ static const String firstTimeLoadKey = 'firstTimeLoadKey';
static const String isSavedPhones = 'isSavedPhones';
static const String statusDriverLocation = "statusDriverLocation";
static const String isTest = "isTest";
@@ -70,6 +75,8 @@ class BoxName {
static const String onBoarding = 'onBoarding';
static const String stripePublishableKey = 'stripe_publishableKe';
static const String apiKeyRun = 'apiKeyRun';
+ static const String keyOfApp = 'keyOfApp';
+ static const String initializationVector = 'initializationVector';
static const String serverAPI = 'serverAPI';
static const String secretKey = 'secretKey';
static const String basicAuthCredentials = 'basicAuthCredentials';
diff --git a/lib/constant/info.dart b/lib/constant/info.dart
index f365e56..1c81cbc 100644
--- a/lib/constant/info.dart
+++ b/lib/constant/info.dart
@@ -6,6 +6,7 @@ class AppInformation {
'https://www.linkedin.com/in/hamza-ayed/';
static const String website = 'https://sefer.live';
static const String email = 'hamzaayed@sefer.live';
+ static const String addd = 'BlBlNl';
static const String privacyPolicy = '''
diff --git a/lib/constant/links.dart b/lib/constant/links.dart
index 3c2615f..0c8603c 100644
--- a/lib/constant/links.dart
+++ b/lib/constant/links.dart
@@ -206,7 +206,8 @@ class AppLink {
// =====================================
static String addRateToPassenger = "$ride/rate/add.php";
static String savePlacesServer = "$ride/places/add.php";
- static String getapiKey = "$ride/apiKey/get.php";
+ static String getapiKey =
+ "https://server.sefer.live/sefer.click/sefer/ride/apiKey/get.php";
static String addRateToDriver = "$ride/rate/addRateToDriver.php";
static String getDriverRate = "$ride/rate/getDriverRate.php";
static String getPassengerRate = "$ride/rate/getPassengerRate.php";
@@ -264,6 +265,10 @@ class AppLink {
static String auth = '$server/auth';
static String login = "$auth/login.php";
+ static String loginJwtRider = "$server/login.php";
+ static String loginJwtWalletRider = "$seferPaymentServer/loginWallet.php";
+ static String loginFirstTime =
+ "https://server.sefer.live/sefer.click/sefer/loginFirstTime.php";
static String getTesterApp = "$auth/Tester/getTesterApp.php";
static String updateTesterApp = "$auth/Tester/updateTesterApp.php";
static String signUp = "$auth/signup.php";
diff --git a/lib/constant/table_names.dart b/lib/constant/table_names.dart
index 47cd831..e4019c0 100644
--- a/lib/constant/table_names.dart
+++ b/lib/constant/table_names.dart
@@ -1,3 +1,5 @@
+import 'package:Tripz/env/env.dart';
+
class TableName {
static const String placesFavorite = "placesFavorite";
static const String recentLocations = "recentLocations";
@@ -7,3 +9,11 @@ class TableName {
static const String faceDetectTimes = "faceDetectTimes";
static const String captainNotification = "captainNotification";
}
+
+class Pasenger {
+ static const String pasengerpas = 'MG6DEJZSczBT6Rx0jOlehQ==';
+ static const String payMobApikey = 'payMobApikey';
+ static const String initializationVector = 'initializationVector';
+ static const String keyOfApp = 'keyOfApp';
+ static const String FCM_PRIVATE_KEY = 'FCM_PRIVATE_KEY';
+}
diff --git a/lib/controller/auth/google_sign.dart b/lib/controller/auth/google_sign.dart
index 14b0112..bb9ae4a 100644
--- a/lib/controller/auth/google_sign.dart
+++ b/lib/controller/auth/google_sign.dart
@@ -167,11 +167,11 @@ class GoogleSignInHelper {
// Store driver information
box.write(BoxName.passengerID, user.id);
- box.write(BoxName.email, encryptionHelper.encryptData(user.email));
+ box.write(BoxName.email, EncryptionHelper.instance.encryptData(user.email));
box.write(BoxName.name,
- encryptionHelper.encryptData(user.displayName.toString()));
+ EncryptionHelper.instance.encryptData(user.displayName.toString()));
box.write(BoxName.passengerPhotoUrl,
- encryptionHelper.encryptData(user.photoUrl.toString()));
+ EncryptionHelper.instance.encryptData(user.photoUrl.toString()));
// Perform any additional sign-up tasks or API calls here
// For example, you can send the user data to your server for registration
diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart
index 162e904..719cf45 100644
--- a/lib/controller/auth/login_controller.dart
+++ b/lib/controller/auth/login_controller.dart
@@ -1,5 +1,9 @@
import 'dart:convert';
import 'dart:io';
+import 'package:Tripz/constant/api_key.dart';
+import 'package:Tripz/controller/functions/sss.dart';
+import 'package:Tripz/env/env.dart';
+import 'package:http/http.dart' as http;
import 'package:Tripz/constant/info.dart';
import 'package:Tripz/controller/firebase/firbase_messge.dart';
@@ -14,11 +18,16 @@ import 'package:Tripz/constant/links.dart';
import 'package:Tripz/controller/functions/crud.dart';
import 'package:Tripz/main.dart';
import 'package:Tripz/views/home/map_page_passenger.dart';
+import 'package:jwt_decoder/jwt_decoder.dart';
import 'package:location/location.dart';
+import 'package:secure_string_operations/secure_string_operations.dart';
+import '../../constant/char_map.dart';
+import '../../constant/table_names.dart';
import '../../print.dart';
import '../functions/encrypt_decrypt.dart';
import '../functions/package_info.dart';
+import '../functions/secure_storage.dart';
class LoginController extends GetxController {
final formKey = GlobalKey();
@@ -36,6 +45,7 @@ class LoginController extends GetxController {
update();
}
+ var dev = '';
@override
void onInit() async {
box.read(BoxName.isTest) == null ||
@@ -75,13 +85,108 @@ class LoginController extends GetxController {
update();
}
+ getJwtWallet() async {
+ await SecurityHelper.performSecurityChecks();
+ String fingerPrint = await getDeviceFingerprint();
+ dev = Platform.isAndroid ? 'android' : 'ios';
+ var payload = {
+ 'id': box.read(BoxName.passengerID),
+ 'password': AK.passnpassenger,
+ 'aud': '${AK.allowed}$dev',
+ 'fingerPrint': fingerPrint
+ };
+ var response1 = await http.post(
+ Uri.parse(AppLink.loginJwtWalletRider),
+ body: payload,
+ );
+ Log.print('req: ${response1.request}');
+ Log.print('response: ${response1.body}');
+ Log.print('payload: ${payload}');
+ Log.print('decodedResponse1: ${jsonDecode(response1.body)}');
+ return jsonDecode(response1.body)['jwt'].toString();
+ }
+
+ getJWT() async {
+ print(Pasenger.pasengerpas);
+ await SecurityHelper.performSecurityChecks();
+ Log.print('firstTimeLoadKey: ${box.read(BoxName.firstTimeLoadKey)}');
+ dev = Platform.isAndroid ? 'android' : 'ios';
+ if (box.read(BoxName.firstTimeLoadKey).toString() != 'false') {
+ var response0 = await http.post(
+ Uri.parse(AppLink.loginFirstTime),
+ body: {
+ 'id': box.read(BoxName.passengerID) ?? AK.newId,
+ 'password': AK.passnpassenger,
+ 'aud': '${AK.allowed}$dev',
+ },
+ );
+ if (response0.statusCode == 200) {
+ final decodedResponse1 = jsonDecode(response0.body);
+
+ final jwt = decodedResponse1['jwt'];
+ final refreshToken = decodedResponse1['refresh_token'];
+ box.write(BoxName.jwt, X.c(X.c(X.c(jwt, cn), cC), cs));
+ // Sss.write(BoxName.jwt, jwt);
+ await storage.write(key: BoxName.refreshToken, value: refreshToken);
+
+ await AppInitializer().getAIKey(Pasenger.keyOfApp);
+ await AppInitializer().getAIKey(Pasenger.initializationVector);
+ await Future.delayed(Duration.zero);
+ await EncryptionHelper.initialize();
+
+ await AppInitializer().getAIKey(Pasenger.payMobApikey);
+ await AppInitializer().getAIKey(Pasenger.FCM_PRIVATE_KEY);
+ await AppInitializer().getKey();
+ } else {}
+ } else {
+ await EncryptionHelper.initialize();
+
+ var payload = {
+ 'id': box.read(BoxName.passengerID),
+ 'password': AK.passnpassenger,
+ 'aud': '${AK.allowed}$dev',
+ };
+ var response1 = await http.post(
+ Uri.parse(AppLink.loginJwtRider),
+ body: payload,
+ );
+ Log.print('req: ${response1.request}');
+ Log.print('response: ${response1.body}');
+ Log.print('payload: ${payload}');
+ Log.print('decodedResponse1: ${jsonDecode(response1.body)}');
+
+ if (response1.statusCode == 200) {
+ final decodedResponse1 = jsonDecode(response1.body);
+ Log.print('decodedResponse1: ${decodedResponse1}');
+
+ final jwt = decodedResponse1['jwt'];
+ await box.write(BoxName.jwt, X.c(X.c(X.c(jwt, cn), cC), cs));
+
+ await AppInitializer().getKey();
+
+ final refreshToken = decodedResponse1['refresh_token'];
+ await storage.write(key: BoxName.refreshToken, value: refreshToken);
+ } else {}
+ }
+ }
+
loginUsingCredentials(String passengerID, email) async {
isloading = true;
update();
+ bool isTokenExpired = JwtDecoder.isExpired(X
+ .r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs)
+ .toString()
+ .split(AppInformation.addd)[0]);
+
+ if (isTokenExpired) {
+ Log.print('isTokenExpired loginUsingCredentials: ${isTokenExpired}');
+ await getJWT();
+ }
+
var res =
await CRUD().get(link: AppLink.loginFromGooglePassenger, payload: {
'email': email.toString().contains('@')
- ? encryptionHelper.encryptData(email)
+ ? EncryptionHelper.instance.encryptData(email)
: email,
'id': passengerID,
"platform": Platform.isAndroid ? 'android' : 'ios',
@@ -110,18 +215,22 @@ class LoginController extends GetxController {
box.write(BoxName.validity, d['validity']);
box.write(BoxName.isInstall, d['isInstall'] ?? 'none');
box.write(BoxName.isGiftToken, d['isGiftToken'] ?? 'none');
+ box.write(BoxName.firstTimeLoadKey, 'false');
d['inviteCode'] != null
? box.write(
BoxName.inviteCode,
- encryptionHelper.decryptData(d['inviteCode'].toString()) ??
+ EncryptionHelper.instance
+ .decryptData(d['inviteCode'].toString()) ??
'none')
: null;
var token = await CRUD().get(link: AppLink.getTokens, payload: {
'passengerID': box.read(BoxName.passengerID).toString()
});
+ var fingerPrint = await getDeviceFingerprint();
+ await storage.write(key: BoxName.fingerPrint, value: fingerPrint);
if (token != 'failure') {
- if (encryptionHelper.decryptData(
+ if (EncryptionHelper.instance.decryptData(
jsonDecode(token)['data'][0]['token'].toString()) !=
box.read(BoxName.tokenFCM)) {
MyDialog().getDialog('change device'.tr, 'token change'.tr,
@@ -131,20 +240,23 @@ class LoginController extends GetxController {
link: "${AppLink.server}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
- 'passengerID': box.read(BoxName.passengerID).toString()
+ 'passengerID': box.read(BoxName.passengerID).toString(),
+ 'fingerPrint': (fingerPrint).toString()
}),
CRUD().post(
link:
"${AppLink.tripzAlexandriaServer}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
- 'passengerID': box.read(BoxName.passengerID).toString()
+ 'passengerID': box.read(BoxName.passengerID).toString(),
+ 'fingerPrint': (fingerPrint).toString()
}),
CRUD().post(
link: "${AppLink.tripzGizaServer}/ride/firebase/add.php",
payload: {
'token': box.read(BoxName.tokenFCM),
- 'passengerID': box.read(BoxName.passengerID).toString()
+ 'passengerID': box.read(BoxName.passengerID).toString(),
+ 'fingerPrint': (fingerPrint).toString()
}),
];
// cameras = await availableCameras();
@@ -153,7 +265,7 @@ class LoginController extends GetxController {
.sendNotificationToDriverMAP(
'token change'.tr,
'change device'.tr,
- encryptionHelper.decryptData(
+ EncryptionHelper.instance.decryptData(
jsonDecode(token)['data'][0]['token'].toString()),
[],
'cancel.wav',
@@ -174,9 +286,7 @@ class LoginController extends GetxController {
Get.offAll(() => const MapPagePassenger());
},
);
- } else {
- print('same');
- }
+ } else {}
} // Logging to check if inviteCode is written correctly
if (d['inviteCode'] != 'none' &&
@@ -185,7 +295,7 @@ class LoginController extends GetxController {
box.read(BoxName.isInstall).toString() != '1') {
await CRUD()
.post(link: AppLink.updatePassengersInvitation, payload: {
- "inviteCode": encryptionHelper
+ "inviteCode": EncryptionHelper.instance
.encryptData(box.read(BoxName.inviteCode).toString()),
"passengerID": box.read(BoxName.passengerID).toString(),
});
@@ -198,7 +308,7 @@ class LoginController extends GetxController {
try {
CRUD().post(link: AppLink.addPassengersPromo, payload: {
"promoCode":
- 'S-${encryptionHelper.decryptData(box.read(BoxName.name)).toString().split(' ')[0]}',
+ 'S-${EncryptionHelper.instance.decryptData(box.read(BoxName.name)).toString().split(' ')[0]}',
"amount": '25',
"passengerID": box.read(BoxName.passengerID).toString(),
"description": 'promo first'
@@ -236,7 +346,7 @@ class LoginController extends GetxController {
update();
var res =
await CRUD().get(link: AppLink.loginFromGooglePassenger, payload: {
- 'email': encryptionHelper.encryptData(emailController.text),
+ 'email': EncryptionHelper.instance.encryptData(emailController.text),
'id': passwordController.text
});
diff --git a/lib/controller/auth/register_controller.dart b/lib/controller/auth/register_controller.dart
index ca9f81a..ff3cee7 100644
--- a/lib/controller/auth/register_controller.dart
+++ b/lib/controller/auth/register_controller.dart
@@ -143,7 +143,8 @@ class RegisterController extends GetxController {
var responseChecker = await CRUD().post(
link: AppLink.checkPhoneNumberISVerfiedPassenger,
payload: {
- 'phone_number': encryptionHelper.encryptData(phoneNumber),
+ 'phone_number':
+ EncryptionHelper.instance.encryptData(phoneNumber),
'email': box.read(BoxName.email),
},
);
@@ -156,8 +157,8 @@ class RegisterController extends GetxController {
Get.snackbar('Phone number is verified before'.tr, '',
backgroundColor: AppColor.greenColor);
box.write(BoxName.isVerified, '1');
- box.write(
- BoxName.phone, encryptionHelper.encryptData(phoneNumber));
+ box.write(BoxName.phone,
+ EncryptionHelper.instance.encryptData(phoneNumber));
Get.offAll(const MapPagePassenger());
} else {
await sendOtp(phoneNumber, randomNumber, isEgyptianNumber,
@@ -193,18 +194,18 @@ class RegisterController extends GetxController {
// Trim any leading or trailing whitespace from the phone number
phoneNumber = phoneNumber.trim();
var dd = await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: {
- 'phone_number': encryptionHelper.encryptData(phoneNumber),
- 'token': encryptionHelper.encryptData(otp.toString()),
+ 'phone_number': EncryptionHelper.instance.encryptData(phoneNumber),
+ 'token': EncryptionHelper.instance.encryptData(otp.toString()),
});
Log.print('dd: ${dd}');
if (isEgyptian) {
await CRUD().post(link: AppLink.updatePhoneInvalidSMSPassenger, payload: {
- "phone_number": encryptionHelper
+ "phone_number": EncryptionHelper.instance
.encryptData(Get.find().phoneController.text)
});
- box.write(
- BoxName.phone, encryptionHelper.encryptData(phoneController.text));
- var nameParts = encryptionHelper
+ box.write(BoxName.phone,
+ EncryptionHelper.instance.encryptData(phoneController.text));
+ var nameParts = EncryptionHelper.instance
.decryptData(box.read(BoxName.name))
.toString()
.split(' ');
@@ -213,14 +214,14 @@ class RegisterController extends GetxController {
var payload = {
'id': box.read(BoxName.passengerID),
- 'phone': encryptionHelper.encryptData(phoneController.text),
+ 'phone': EncryptionHelper.instance.encryptData(phoneController.text),
'email': box.read(BoxName.email),
- 'password': encryptionHelper.encryptData('unknown'),
- 'gender': encryptionHelper.encryptData('unknown'),
- 'birthdate': encryptionHelper.encryptData('2002-01-01'),
+ 'password': EncryptionHelper.instance.encryptData('unknown'),
+ 'gender': EncryptionHelper.instance.encryptData('unknown'),
+ 'birthdate': EncryptionHelper.instance.encryptData('2002-01-01'),
'site': box.read(BoxName.passengerPhotoUrl) ?? 'unknown',
- 'first_name': encryptionHelper.encryptData(firstName),
- 'last_name': encryptionHelper.encryptData(lastName),
+ 'first_name': EncryptionHelper.instance.encryptData(firstName),
+ 'last_name': EncryptionHelper.instance.encryptData(lastName),
};
var res1 = await CRUD().post(
@@ -245,8 +246,8 @@ class RegisterController extends GetxController {
box.write(BoxName.isVerified, '1');
box.write(BoxName.isFirstTime, '0');
- box.write(
- BoxName.phone, encryptionHelper.encryptData(phoneController.text));
+ box.write(BoxName.phone,
+ EncryptionHelper.instance.encryptData(phoneController.text));
Get.put(LoginController()).loginUsingCredentials(
box.read(BoxName.passengerID).toString(),
@@ -257,8 +258,8 @@ class RegisterController extends GetxController {
} else if (phoneController.text.toString().length >= 10) {
box.write(BoxName.isVerified, '1');
box.write(BoxName.isFirstTime, '0'); //todo check if first or not
- box.write(
- BoxName.phone, encryptionHelper.encryptData(phoneController.text));
+ box.write(BoxName.phone,
+ EncryptionHelper.instance.encryptData(phoneController.text));
Get.put(LoginController()).loginUsingCredentials(
box.read(BoxName.passengerID).toString(),
@@ -279,14 +280,16 @@ class RegisterController extends GetxController {
try {
if (formKey3.currentState!.validate()) {
var res = await CRUD().post(link: AppLink.verifyOtpMessage, payload: {
- 'phone_number': encryptionHelper.encryptData(phoneController.text),
- 'token': encryptionHelper.encryptData(verifyCode.text.toString()),
+ 'phone_number':
+ EncryptionHelper.instance.encryptData(phoneController.text),
+ 'token':
+ EncryptionHelper.instance.encryptData(verifyCode.text.toString()),
});
if (res != 'failure') {
box.write(BoxName.phone,
- encryptionHelper.encryptData(phoneController.text));
- var nameParts = encryptionHelper
+ EncryptionHelper.instance.encryptData(phoneController.text));
+ var nameParts = EncryptionHelper.instance
.decryptData(box.read(BoxName.name))
.toString()
.split(' ');
@@ -295,7 +298,8 @@ class RegisterController extends GetxController {
var payload = {
'id': box.read(BoxName.passengerID),
- 'phone': encryptionHelper.decryptData(phoneController.text),
+ 'phone':
+ EncryptionHelper.instance.decryptData(phoneController.text),
'email': box.read(BoxName.email),
'password': 'unknown',
'gender': 'unknown',
@@ -328,7 +332,7 @@ class RegisterController extends GetxController {
box.write(BoxName.isVerified, '1');
box.write(BoxName.isFirstTime, '0');
box.write(BoxName.phone,
- encryptionHelper.decryptData(phoneController.text));
+ EncryptionHelper.instance.decryptData(phoneController.text));
Get.put(LoginController()).loginUsingCredentials(
box.read(BoxName.passengerID).toString(),
diff --git a/lib/controller/auth/tokens_controller.dart b/lib/controller/auth/tokens_controller.dart
index 4c85885..c4cf36a 100644
--- a/lib/controller/auth/tokens_controller.dart
+++ b/lib/controller/auth/tokens_controller.dart
@@ -23,8 +23,8 @@ class TokenController extends GetxController {
'Basic ${base64Encode(utf8.encode(basicAuthCredentials.toString()))}',
},
body: {
- 'token':
- encryptionHelper.decryptData(box.read(BoxName.tokenFCM.toString())),
+ 'token': EncryptionHelper.instance
+ .decryptData(box.read(BoxName.tokenFCM.toString())),
'passengerID': box.read(BoxName.passengerID).toString()
},
);
diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart
index 82f2e25..9555a68 100644
--- a/lib/controller/firebase/firbase_messge.dart
+++ b/lib/controller/firebase/firbase_messge.dart
@@ -94,8 +94,8 @@ class FirebaseMessagesController extends GetxController {
Future getToken() async {
fcmToken.getToken().then((token) {
- box.write(
- BoxName.tokenFCM, encryptionHelper.encryptData(token.toString()));
+ box.write(BoxName.tokenFCM,
+ EncryptionHelper.instance.encryptData(token.toString()));
});
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
@@ -415,7 +415,7 @@ class FirebaseMessagesController extends GetxController {
confirm: MyElevatedButton(
title: 'Ok I will go now.'.tr,
onPressed: () {
- FirebaseMessagesController().sendNotificationToPassengerToken(
+ sendNotificationToPassengerToken(
'Hi ,I will go now',
'I will go now'.tr,
Get.find().driverToken,
@@ -440,7 +440,7 @@ class FirebaseMessagesController extends GetxController {
confirm: MyElevatedButton(
title: 'Ok'.tr,
onPressed: () {
- // FirebaseMessagesController().sendNotificationToPassengerToken(
+ // Get.find().sendNotificationToPassengerToken(
// 'Hi ,I will go now'.tr,
// 'I will go now'.tr,
// Get.find().driverToken, []);
@@ -557,25 +557,32 @@ class FirebaseMessagesController extends GetxController {
// });
// }
// }
+ late String serviceAccountKeyJson;
+ @override
+ Future onInit() async {
+ super.onInit();
+ try {
+ var encryptedKey = await storage.read(key: 'FCM_PRIVATE_KEY');
+ // Log.print('encryptedKey: ${encryptedKey}');
+ if (encryptedKey != null) {
+ serviceAccountKeyJson =
+ EncryptionHelper.instance.decryptData(encryptedKey);
+ // Log.print('serviceAccountKeyJson: ${serviceAccountKeyJson}');
+ } else {
+ print('🔴 Error: FCM_PRIVATE_KEY not found in Secure Storage');
+ }
+ } catch (e) {
+ print('🔴 Error decrypting FCM key: $e');
+ }
+ }
void sendNotificationToPassengerToken(
String title, body, token, List map, String tone) async {
try {
- String serviceAccountKeyJson = '''{
- "type": "service_account",
- "project_id": "ride-b1bd8",
- "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249",
- "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n",
- "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com",
- "client_id": "111210077025005706623",
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
- "token_uri": "https://oauth2.googleapis.com/token",
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
- "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com",
- "universe_domain": "googleapis.com"
-}
-'''; // As defined above
-
+ if (serviceAccountKeyJson.isEmpty) {
+ print("🔴 Error: Service Account Key is empty");
+ return;
+ }
// Initialize AccessTokenManager
final accessTokenManager = AccessTokenManager(serviceAccountKeyJson);
@@ -619,16 +626,14 @@ class FirebaseMessagesController extends GetxController {
);
if (response.statusCode == 200) {
- print(
- 'Notification sent successfully. Status code: ${response.statusCode}');
- print('Response body: ${response.body}');
+ print('✅ Notification sent successfully!');
} else {
print(
- 'Failed to send notification. Status code: ${response.statusCode}');
+ '🔴 Failed to send notification. Status code: ${response.statusCode}');
print('Response body: ${response.body}');
}
} catch (e) {
- print('Error sending notification: $e');
+ print('🔴 Error sending notification: $e');
}
}
@@ -636,23 +641,14 @@ class FirebaseMessagesController extends GetxController {
String title, String body, String token, List data, String tone,
{int retryCount = 2}) async {
try {
- String serviceAccountKeyJson = '''{
- "type": "service_account",
- "project_id": "ride-b1bd8",
- "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249",
- "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n",
- "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com",
- "client_id": "111210077025005706623",
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
- "token_uri": "https://oauth2.googleapis.com/token",
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
- "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com",
- "universe_domain": "googleapis.com"
-}
-'''; // As defined above
+ if (serviceAccountKeyJson.isEmpty) {
+ print("🔴 Error: Service Account Key is empty");
+ return;
+ }
// Initialize AccessTokenManager
final accessTokenManager = AccessTokenManager(serviceAccountKeyJson);
+ // Log.print('accessTokenManager: ${accessTokenManager}');
// Obtain an OAuth 2.0 access token
final accessToken = await accessTokenManager.getAccessToken();
diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart
index fe8380d..72d8735 100644
--- a/lib/controller/functions/crud.dart
+++ b/lib/controller/functions/crud.dart
@@ -1,15 +1,23 @@
import 'dart:convert';
import 'package:Tripz/constant/box_name.dart';
import 'package:Tripz/constant/links.dart';
+import 'package:Tripz/controller/auth/login_controller.dart';
+import 'package:Tripz/controller/functions/encrypt_decrypt.dart';
+import 'package:Tripz/controller/functions/package_info.dart';
import 'package:Tripz/main.dart';
+import 'package:Tripz/views/widgets/mydialoug.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:Tripz/env/env.dart';
+import 'package:secure_string_operations/secure_string_operations.dart';
import '../../constant/api_key.dart';
+import '../../constant/char_map.dart';
+import '../../constant/info.dart';
import '../../print.dart';
import '../../views/widgets/elevated_btn.dart';
+import '../../views/widgets/error_snakbar.dart';
import 'add_error.dart';
import 'upload_image.dart';
@@ -27,25 +35,89 @@ class CRUD {
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
- 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}',
+ // 'Bearer ${box.read(BoxName.firstTimeLoadKey) != null ? EncryptionHelper.instance.decryptData(box.read(BoxName.jwt).toString()) : box.read(BoxName.jwt).toString()}'
+ // 'Bearer ${box.read(BoxName.jwt).toString()}'
+ 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}'
},
);
- // Log.print('req: ${response.request}');
- // Log.print('response: ${response.body}');
- // Log.print('payload: ${payload}');
- // if (response.statusCode == 200) {
- var jsonData = jsonDecode(response.body);
- if (jsonData['status'] == 'success') {
- return response.body;
- }
+ Log.print('req: ${response.request}');
+ Log.print('response: ${response.body}');
+ Log.print('payload: ${payload}');
+ if (response.statusCode == 200) {
+ var jsonData = jsonDecode(response.body);
+ if (jsonData['status'] == 'success') {
+ return response.body;
+ }
- return jsonData['status'];
+ return jsonData['status'];
+ } else if (response.statusCode == 401) {
+ // Specifically handle 401 Unauthorized
+ var jsonData = jsonDecode(response.body);
+
+ if (jsonData['error'] == 'Token expired') {
+ // Show snackbar prompting to re-login
+ await Get.put(LoginController()).getJWT();
+ mySnackbarSuccess('please order now'.tr);
+ return 'token_expired'; // Return a specific value for token expiration
+ } else {
+ // Other 401 errors
+ addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
+ return 'failure';
+ }
+ } else {
+ addError('Non-200 response code: ${response.statusCode}',
+ 'crud().post - Other');
+ return 'failure';
+ }
}
- Future post({
+ Future getWallet({
required String link,
Map? payload,
}) async {
+ var s = await LoginController().getJwtWallet();
+ var url = Uri.parse(
+ link,
+ );
+ var response = await http.post(
+ url,
+ body: payload,
+ headers: {
+ "Content-Type": "application/x-www-form-urlencoded",
+ 'Authorization': 'Bearer $s'
+ },
+ );
+
+ if (response.statusCode == 200) {
+ var jsonData = jsonDecode(response.body);
+ if (jsonData['status'] == 'success') {
+ return response.body;
+ }
+
+ return jsonData['status'];
+ } else if (response.statusCode == 401) {
+ // Specifically handle 401 Unauthorized
+ var jsonData = jsonDecode(response.body);
+
+ if (jsonData['error'] == 'Token expired') {
+ // Show snackbar prompting to re-login
+ await Get.put(LoginController()).getJwtWallet();
+
+ return 'token_expired'; // Return a specific value for token expiration
+ } else {
+ // Other 401 errors
+ addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
+ return 'failure';
+ }
+ } else {
+ addError('Non-200 response code: ${response.statusCode}',
+ 'crud().post - Other');
+ return 'failure';
+ }
+ }
+
+ Future post(
+ {required String link, Map? payload}) async {
var url = Uri.parse(link);
try {
var response = await http.post(
@@ -54,34 +126,56 @@ class CRUD {
headers: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization':
- 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
+ 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}'
+ // 'Authorization': 'Bearer ${box.read(BoxName.jwt)}'
},
);
-
+ // Log.print('req: ${response.request}');
+ // Log.print('response: ${response.body}');
+ // Log.print('payload: ${payload}');
if (response.statusCode == 200) {
try {
- // Log.print('req: ${response.request}');
- // Log.print('response: ${response.body}');
- // Log.print('payload: ${payload}');
var jsonData = jsonDecode(response.body);
-
if (jsonData['status'] == 'success') {
return jsonData;
} else {
return jsonData['status'];
}
} catch (e) {
- addError(e.toString(), 'crud().post');
- return 'failure'; // Return a recognizable failure string for JSON errors
+ addError(e.toString(), 'crud().post - JSON decoding');
+ return 'failure';
+ }
+ } else if (response.statusCode == 401) {
+ // Specifically handle 401 Unauthorized
+ var jsonData = jsonDecode(response.body);
+
+ if (jsonData['error'] == 'Token expired') {
+ // Show snackbar prompting to re-login
+ await Get.put(LoginController()).getJWT();
+ // MyDialog().getDialog(
+ // 'Session expired. Please log in again.'.tr,
+ // '',
+ // () {
+ // Get.put(LoginController()).loginUsingCredentials(
+ // box.read(BoxName.passengerID), box.read(BoxName.email));
+ // Get.back();
+ // },
+ // );
+
+ return 'token_expired'; // Return a specific value for token expiration
+ } else {
+ // Other 401 errors
+ addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401');
+ return 'failure';
}
} else {
- addError(
- 'Non-200 response code: ${response.statusCode}', 'crud().post');
- return 'failure'; // Handle unexpected status codes as failures
+ addError('Non-200 response code: ${response.statusCode}',
+ 'crud().post - Other');
+ return 'failure';
}
} catch (e) {
- addError('HTTP request error: $e', 'crud().post');
- return 'failure'; // Handle HTTP request errors as failures
+ addError('HTTP request error: $e', 'crud().post - HTTP');
+ return 'failure';
}
}
@@ -509,24 +603,24 @@ class CRUD {
}
}
- Future update({
- required String endpoint,
- required Map data,
- required String id,
- }) async {
- // String? basicAuthCredentials =
- // await storage.read(key: BoxName.basicAuthCredentials);
- var url = Uri.parse('$endpoint/$id');
- var response = await http.put(
- url,
- body: json.encode(data),
- headers: {
- 'Authorization':
- 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
- },
- );
- return json.decode(response.body);
- }
+ // Future update({
+ // required String endpoint,
+ // required Map data,
+ // required String id,
+ // }) async {
+ // // String? basicAuthCredentials =
+ // // await storage.read(key: BoxName.basicAuthCredentials);
+ // var url = Uri.parse('$endpoint/$id');
+ // var response = await http.put(
+ // url,
+ // body: json.encode(data),
+ // headers: {
+ // 'Authorization':
+ // 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}',
+ // },
+ // );
+ // return json.decode(response.body);
+ // }
Future delete({
required String endpoint,
diff --git a/lib/controller/functions/device_info.dart b/lib/controller/functions/device_info.dart
index 1d9c5d7..33a1e29 100644
--- a/lib/controller/functions/device_info.dart
+++ b/lib/controller/functions/device_info.dart
@@ -1,90 +1,92 @@
-// import 'dart:io';
-//
-// import 'package:device_info_plus/device_info_plus.dart';
-//
-// class DeviceInfoPlus {
-// static List