From 6c7f02170b6ffeae35e0a47aecd93700dc230663 Mon Sep 17 00:00:00 2001
From: Maximilian Betz <Maximilian.Betz@awi.de>
Date: Fri, 1 Apr 2022 13:03:16 +0200
Subject: [PATCH] moved login information storage to SecureStorage

---
 lib/addevent.dart      |  1 -
 lib/configuration.dart |  4 +---
 lib/datamodel.dart     | 36 ++++++++++++++++++++++++++++++------
 lib/main.dart          |  9 ---------
 lib/viewevents.dart    |  1 -
 5 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/lib/addevent.dart b/lib/addevent.dart
index 102a491..f62cb0c 100644
--- a/lib/addevent.dart
+++ b/lib/addevent.dart
@@ -1,5 +1,4 @@
 import 'dart:convert';
-
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
diff --git a/lib/configuration.dart b/lib/configuration.dart
index 5fda58a..9754859 100644
--- a/lib/configuration.dart
+++ b/lib/configuration.dart
@@ -1,4 +1,3 @@
-import 'dart:convert';
 import 'dart:io';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
@@ -216,7 +215,7 @@ class _MyHomePageState extends State<Configuration> {
                       }
                     }
                 ),
-                const SizedBox(height: 50.0),
+                const SizedBox(height: 70.0),
                 TextFormField(
                   minLines: 1,
                   maxLines: 5,
@@ -265,6 +264,5 @@ class _MyHomePageState extends State<Configuration> {
 }
 
 //TODO: write configuration on app dispose!
-//TODO: align bottom buttons nicely!
 //TODO: add label prefix with appended upcounting number.
 //TODO: grey out update button if nothing has changed. ?
\ No newline at end of file
diff --git a/lib/datamodel.dart b/lib/datamodel.dart
index c209847..e046e1b 100644
--- a/lib/datamodel.dart
+++ b/lib/datamodel.dart
@@ -1,6 +1,7 @@
 import 'dart:convert';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/services.dart';
+import 'package:flutter_secure_storage/flutter_secure_storage.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 
 class Collection {
@@ -261,11 +262,20 @@ abstract class ConfigurationStoreBase {
       'currentCollection': currentCollection.toJson(),
       'devices': jsonEncode(devices),
       'eventTypes': jsonEncode(eventTypes),
-      'loginInformation' : loginInformation.toJson(),
       'initialized' : initialized,
     };
   }
 
+  Map<String, dynamic> loginDataToMap() {
+    return {
+      'loginInformation' : loginInformation.toJson(),
+    };
+  }
+
+  void loginDataFromMap(Map<String, dynamic> map){
+    loginInformation = SensorLogin.fromJson(map['loginInformation']);
+  }
+
   void fromMap(Map<String, dynamic> map) {
     List<dynamic> dynList = jsonDecode(map['collections']);
     collections = [];
@@ -285,8 +295,6 @@ abstract class ConfigurationStoreBase {
     for (var element in dynList){
       eventTypes.add(EventType.fromJson(element));
     }
-
-    loginInformation = SensorLogin.fromJson(map['loginInformation']);
     initialized = map['initialized'];
   }
 
@@ -336,20 +344,36 @@ class ConfigurationStoreInstance extends ConfigurationStoreBase {
       ._internal();
 
   Future<void> storeToSharedPrefs() async {
+
+    const secureStorage = FlutterSecureStorage();
+    var writeData = await secureStorage.write(key: 'login', value: jsonEncode(loginDataToMap()));
+
     final prefs = await SharedPreferences.getInstance();
     prefs.setString('configuration', jsonEncode(toMap()));
+
+
     debugPrint('Stored current configuration to shared prefs');
   }
 
   Future<void> loadFromSharedPrefs() async {
+
+    const secureStorage = FlutterSecureStorage();
+    final String? readData = await secureStorage.read(key: 'login');
+    if (readData != null) {
+      loginDataFromMap(jsonDecode(readData));
+      debugPrint('Login loaded from secure storage');
+    }else{
+      debugPrint('Failed to load login details from secure storage');
+    }
+
     final prefs = await SharedPreferences.getInstance();
     final String? configuration = prefs.getString('configuration');
     if (configuration != null){
-      debugPrint('Configuration Current Event String: ' + configuration);
+      debugPrint('Configuration String: ' + configuration);
       fromMap(jsonDecode(configuration));
-      debugPrint('Configuration Current Event loaded from shared preferences');
+      debugPrint('Configuration loaded from shared preferences');
     }else{
-      debugPrint('Failed to load Current Event configuration from shared preferences.');
+      debugPrint('Failed to load configuration from shared preferences.');
     }
   }
 
diff --git a/lib/main.dart b/lib/main.dart
index 70016de..b4946fb 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,6 +1,4 @@
 import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:flutter_secure_storage/flutter_secure_storage.dart';
 import 'datamodel.dart';
 import 'addevent.dart';
 import 'viewevents.dart';
@@ -8,7 +6,6 @@ import 'overview.dart';
 import 'configuration.dart';
 import 'databaseconnector.dart';
 
-
 Future<void> loadConfiguration() async {
   final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
   final EventStoreInstance event = EventStoreInstance();
@@ -20,10 +17,6 @@ Future<void> loadConfiguration() async {
   await configuration.loadFromSharedPrefs();
   await event.loadFromSharedPrefs();
 
-  //const storage = FlutterSecureStorage();   //TODO: move login information to secure storage
-  //Map<String, String> allValues = await storage.readAll();
-  //print('Secure Storage: ' + allValues.toString());
-
   var database = DatabaseInstance();
   await database.connect();  //Do once at start of APP!
 }
@@ -31,8 +24,6 @@ Future<void> loadConfiguration() async {
 void main() {
   loadConfiguration();
 
-  //configuration.loginInformation = SensorLogin.fromJson({"mail":"admin","password":"adminadmin"}); //TODO: replace for productive version.
-
   runApp(MaterialApp(
     title: 'Mobile Event Log',
     theme: ThemeData(
diff --git a/lib/viewevents.dart b/lib/viewevents.dart
index 6d843b8..12b3330 100644
--- a/lib/viewevents.dart
+++ b/lib/viewevents.dart
@@ -1,4 +1,3 @@
-import 'dart:io';
 import 'package:flutter/material.dart';
 import 'datamodel.dart';
 import 'sensorconnector.dart';
-- 
GitLab