diff --git a/lib/main.dart b/lib/main.dart index 0e45a9f..25e7768 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,6 +10,7 @@ import 'package:twonly/src/services/api.service.dart'; import 'package:flutter/material.dart'; import 'package:twonly/src/providers/connection.provider.dart'; import 'package:twonly/src/providers/settings.provider.dart'; +import 'package:twonly/src/services/backup.identitiy.service.dart'; import 'package:twonly/src/services/fcm.service.dart'; import 'package:twonly/src/services/notification.service.dart'; import 'package:twonly/src/utils/log.dart'; @@ -48,6 +49,8 @@ void main() async { purgeReceivedMediaFiles(); purgeSendMediaFiles(); + performTwonlySafeBackup(); + await initFileDownloader(); runApp( diff --git a/lib/src/services/backup.identitiy.service.dart b/lib/src/services/backup.identitiy.service.dart index 05db08a..74bca64 100644 --- a/lib/src/services/backup.identitiy.service.dart +++ b/lib/src/services/backup.identitiy.service.dart @@ -6,6 +6,7 @@ import 'package:drift/drift.dart'; import 'package:drift_flutter/drift_flutter.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:hashlib/hashlib.dart'; +import 'package:http/http.dart' as http; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:twonly/src/constants/secure_storage_keys.dart'; @@ -17,8 +18,23 @@ import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/views/settings/backup/backup.view.dart'; +Future getTwonlySafeBackupUrl() async { + final user = await getUser(); + if (user == null || user.twonlySafeBackup == null) return null; + + String backupServerUrl = "https://safe.twonly.eu/"; + + if (user.backupServer != null) { + backupServerUrl = user.backupServer!.serverUrl; + } + + String backupId = + uint8ListToHex(user.twonlySafeBackup!.backupId).toLowerCase(); + + return "${backupServerUrl}backups/$backupId"; +} + Future performTwonlySafeBackup({bool force = false}) async { - Log.info("Starting new backup creation."); final user = await getUser(); if (user == null || user.twonlySafeBackup == null) { @@ -32,6 +48,15 @@ Future performTwonlySafeBackup({bool force = false}) async { return; } + DateTime? lastUpdateTime = user.twonlySafeBackup!.lastBackupDone; + if (!force && lastUpdateTime != null) { + if (lastUpdateTime.isAfter(DateTime.now().subtract(Duration(days: 1)))) { + return; + } + } + + Log.info("Starting new twonly Safe-Backup."); + final baseDir = (await getApplicationSupportDirectory()).path; final backupDir = Directory(join(baseDir, "backup_twonly_safe/")); @@ -133,11 +158,7 @@ Future performTwonlySafeBackup({bool force = false}) async { Log.info( "Create twonly Safe backup with a size of ${encryptedBackupBytes.length} bytes."); - String backupServerUrl = "https://safe.twonly.eu/"; - if (user.backupServer != null) { - backupServerUrl = user.backupServer!.serverUrl; - if (encryptedBackupBytes.length > user.backupServer!.maxBackupBytes) { Log.error("Backup is to big for the alternative backup server."); await updateUserdata((user) { @@ -148,14 +169,11 @@ Future performTwonlySafeBackup({bool force = false}) async { } } - String backupId = - uint8ListToHex(user.twonlySafeBackup!.backupId).toLowerCase(); - final task = UploadTask.fromFile( taskId: "backup", file: encryptedBackupBytesFile, httpRequestMethod: "PUT", - url: "${backupServerUrl}backups/$backupId", + url: (await getTwonlySafeBackupUrl())!, requiresWiFi: true, priority: 5, retries: 2, @@ -218,21 +236,31 @@ Future enableTwonlySafe(String password) async { ); return user; }); - startTwonlySafeBackup(); - performTwonlySafeBackup(); + performTwonlySafeBackup(force: true); } Future disableTwonlySafe() async { + final serverUrl = await getTwonlySafeBackupUrl(); + if (serverUrl != null) { + try { + final response = await http.delete( + Uri.parse(serverUrl), + headers: { + 'Content-Type': 'application/json', // Set the content type if needed + // Add any other headers if required + }, + ); + Log.info("Download deleted with: ${response.statusCode}"); + } catch (e) { + Log.error("Could not connect to the server."); + } + } await updateUserdata((user) { user.twonlySafeBackup = null; return user; }); } -Future startTwonlySafeBackup() async { - print("startTwonlySafeBackup"); -} - Future<(Uint8List, Uint8List)> getMasterKey( String password, String username, diff --git a/lib/src/views/settings/backup/twonly_safe_backup.view.dart b/lib/src/views/settings/backup/twonly_safe_backup.view.dart index 7e7621e..a98725b 100644 --- a/lib/src/views/settings/backup/twonly_safe_backup.view.dart +++ b/lib/src/views/settings/backup/twonly_safe_backup.view.dart @@ -25,6 +25,7 @@ class _TwonlyIdentityBackupViewState extends State { isLoading = true; }); + await Future.delayed(Duration(milliseconds: 100)); await enableTwonlySafe(passwordCtrl.text); if (!mounted) return;