file_downloader.dart 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import 'dart:convert';
  2. import 'package:dio/dio.dart';
  3. import 'package:flutter_sodium/flutter_sodium.dart';
  4. import 'package:logging/logging.dart';
  5. import 'package:photos/core/configuration.dart';
  6. import 'package:photos/core/event_bus.dart';
  7. import 'package:photos/db/files_db.dart';
  8. import 'package:photos/events/remote_sync_event.dart';
  9. import 'package:photos/models/file.dart';
  10. import 'package:photos/utils/crypto_util.dart';
  11. import 'package:photos/utils/file_util.dart';
  12. class DiffFetcher {
  13. final _logger = Logger("FileDownloader");
  14. final _dio = Dio();
  15. Future<List<File>> getEncryptedFilesDiff(int lastSyncTime, int limit) async {
  16. return _dio
  17. .get(
  18. Configuration.instance.getHttpEndpoint() + "/files/diff",
  19. options: Options(
  20. headers: {"X-Auth-Token": Configuration.instance.getToken()}),
  21. queryParameters: {
  22. "sinceTime": lastSyncTime,
  23. "limit": limit,
  24. },
  25. )
  26. .catchError((e) => _logger.severe(e))
  27. .then((response) async {
  28. final files = List<File>();
  29. if (response != null) {
  30. Bus.instance.fire(RemoteSyncEvent(true));
  31. final diff = response.data["diff"] as List;
  32. for (final item in diff) {
  33. final file = File();
  34. file.uploadedFileID = item["id"];
  35. file.collectionID = item["collectionID"];
  36. if (item["isDeleted"]) {
  37. await FilesDB.instance.deleteFromCollection(
  38. file.uploadedFileID, file.collectionID);
  39. continue;
  40. }
  41. file.ownerID = item["ownerID"];
  42. file.updationTime = item["updationTime"];
  43. file.isEncrypted = true;
  44. file.encryptedKey = item["encryptedKey"];
  45. file.keyDecryptionNonce = item["keyDecryptionNonce"];
  46. file.fileDecryptionHeader = item["file"]["decryptionHeader"];
  47. file.thumbnailDecryptionHeader =
  48. item["thumbnail"]["decryptionHeader"];
  49. file.metadataDecryptionHeader =
  50. item["metadata"]["decryptionHeader"];
  51. final encodedMetadata = CryptoUtil.decryptChaCha(
  52. Sodium.base642bin(item["metadata"]["encryptedData"]),
  53. decryptFileKey(file),
  54. Sodium.base642bin(file.metadataDecryptionHeader),
  55. );
  56. Map<String, dynamic> metadata =
  57. jsonDecode(utf8.decode(encodedMetadata));
  58. file.applyMetadata(metadata);
  59. files.add(file);
  60. }
  61. } else {
  62. Bus.instance.fire(RemoteSyncEvent(false));
  63. }
  64. return files;
  65. });
  66. }
  67. }