diff --git a/covas_mobile/lib/classes/MyDrawer.dart b/covas_mobile/lib/classes/MyDrawer.dart index 14eab93..27cfe5e 100644 --- a/covas_mobile/lib/classes/MyDrawer.dart +++ b/covas_mobile/lib/classes/MyDrawer.dart @@ -10,6 +10,8 @@ import 'alert.dart'; import '../variable/globals.dart' as globals; import '../pages/LoginDemo.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; // Import dotenv +import 'package:encrypt_shared_preferences/provider.dart'; class MyDrawer extends StatelessWidget with ShowAlertDialog { Future logout(BuildContext context) async { @@ -28,7 +30,20 @@ class MyDrawer extends StatelessWidget with ShowAlertDialog { print("Status code logout ${response.statusCode}"); if (response.statusCode == 200) { - await prefs.remove("access_token"); // Correctly remove the token + await prefs.remove("access_token"); + await dotenv.load(fileName: ".env"); // Load .env file + + final keyEncrypt = dotenv.env['KEY_ENCRYPT'] ?? ''; + if (keyEncrypt.isNotEmpty) { + await EncryptedSharedPreferences.initialize(keyEncrypt); + var sharedPref = EncryptedSharedPreferences.getInstance(); + String username = sharedPref.getString("username") ?? ""; + String password = sharedPref.getString("password") ?? ""; + if ((username.isEmpty) || (password.isEmpty)) { + sharedPref.remove("username"); + sharedPref.remove("password"); + } + } Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (_) => LoginDemo()), diff --git a/covas_mobile/lib/classes/auth_service.dart b/covas_mobile/lib/classes/auth_service.dart index 08fa45b..2cd7a8c 100644 --- a/covas_mobile/lib/classes/auth_service.dart +++ b/covas_mobile/lib/classes/auth_service.dart @@ -4,7 +4,9 @@ import 'package:http/http.dart' as http; import '../variable/globals.dart' as globals; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:encrypt_shared_preferences/provider.dart'; import '../pages/LoginDemo.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; // Import dotenv class AuthService { // Login with username and password @@ -19,15 +21,22 @@ class AuthService { 'accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded', }, - body: { - "username": username, - "password": password, - "remember_me": rememberMe.toString() - }, + body: {"username": username, "password": password}, ); if (response.statusCode == 200 || response.statusCode == 201) { final prefs = await SharedPreferences.getInstance(); + if (rememberMe) { + await dotenv.load(fileName: ".env"); // Load .env file + + final keyEncrypt = dotenv.env['KEY_ENCRYPT'] ?? ''; + if (keyEncrypt.isNotEmpty) { + await EncryptedSharedPreferences.initialize(keyEncrypt); + var sharedPref = EncryptedSharedPreferences.getInstance(); + sharedPref.setString("username", username); + sharedPref.setString("password", password); + } + } final cookies = response.headers["set-cookie"]?.split(";") ?? []; for (final cookie in cookies) { @@ -81,8 +90,25 @@ class AuthService { return true; } else { print("Token is invalid. Status code: ${response.statusCode}"); - await prefs.remove("access_token"); // Clear invalid token - return false; + await dotenv.load(fileName: ".env"); // Load .env file + + final keyEncrypt = dotenv.env['KEY_ENCRYPT'] ?? ''; + if (keyEncrypt.isNotEmpty) { + await EncryptedSharedPreferences.initialize(keyEncrypt); + var sharedPref = EncryptedSharedPreferences.getInstance(); + String username = sharedPref.getString("username") ?? ""; + String password = sharedPref.getString("password") ?? ""; + if ((username.isEmpty) || (password.isEmpty)) { + sharedPref.remove("username"); + sharedPref.remove("password"); + await prefs.remove("access_token"); // Clear invalid token + return false; + } else { + return login(username, password); + } + } else { + return false; + } } } catch (e) { print("Error while checking token: $e"); diff --git a/covas_mobile/pubspec.lock b/covas_mobile/pubspec.lock index e908575..f8e2f6c 100644 --- a/covas_mobile/pubspec.lock +++ b/covas_mobile/pubspec.lock @@ -9,6 +9,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "4bae5ae63e6d6dd17c4aac8086f3dec26c0236f6a0f03416c6c19d830c367cf5" + url: "https://pub.dev" + source: hosted + version: "1.5.8" async: dependency: transitive description: @@ -89,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" cross_file: dependency: transitive description: @@ -137,6 +161,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + encrypt: + dependency: transitive + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + encrypt_shared_preferences: + dependency: "direct main" + description: + name: encrypt_shared_preferences + sha256: "35cd218e5e9d12fe4a63a545f46f2144d861909e4c4f2c4606fc75ffb53d9a46" + url: "https://pub.dev" + source: hosted + version: "0.8.8" fake_async: dependency: transitive description: @@ -648,6 +688,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" shared_preferences: dependency: "direct main" description: diff --git a/covas_mobile/pubspec.yaml b/covas_mobile/pubspec.yaml index a8ac907..99c6d89 100644 --- a/covas_mobile/pubspec.yaml +++ b/covas_mobile/pubspec.yaml @@ -51,6 +51,7 @@ dependencies: url_launcher: ^6.3.1 mapbox_gl: ^0.16.0 google_mobile_ads: ^5.3.1 + encrypt_shared_preferences: ^0.8.8 dev_dependencies: flutter_test: