file_downloader.dart 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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/events/remote_sync_event.dart';
  8. import 'package:photos/models/file.dart';
  9. import 'package:photos/utils/crypto_util.dart';
  10. import 'package:photos/utils/file_util.dart';
  11. class DiffFetcher {
  12. final _logger = Logger("FileDownloader");
  13. final _dio = Dio();
  14. Future<List<File>> getEncryptedFilesDiff(int lastSyncTime, int limit) async {
  15. return _dio
  16. .get(
  17. Configuration.instance.getHttpEndpoint() + "/encrypted-files/diff",
  18. queryParameters: {
  19. "token": Configuration.instance.getToken(),
  20. "sinceTime": lastSyncTime,
  21. "limit": limit,
  22. },
  23. )
  24. .catchError((e) => _logger.severe(e))
  25. .then((response) async {
  26. final files = List<File>();
  27. if (response != null) {
  28. Bus.instance.fire(RemoteSyncEvent(true));
  29. final diff = response.data["diff"] as List;
  30. for (final item in diff) {
  31. final file = File();
  32. file.uploadedFileID = item["id"];
  33. file.ownerID = item["ownerID"];
  34. file.updationTime = item["updationTime"];
  35. file.isEncrypted = true;
  36. file.encryptedKey = item["encryptedKey"];
  37. file.keyDecryptionNonce = item["keyDecryptionNonce"];
  38. file.fileDecryptionHeader = item["fileDecryptionHeader"];
  39. file.thumbnailDecryptionHeader =
  40. item["thumbnailDecryptionHeader"];
  41. file.metadataDecryptionHeader = item["metadataDecryptionHeader"];
  42. final encodedMetadata = CryptoUtil.decryptChaCha(
  43. Sodium.base642bin(item["metadata"]["encryptedData"]),
  44. await decryptFileKey(file),
  45. Sodium.base642bin(file.metadataDecryptionHeader),
  46. );
  47. Map<String, dynamic> metadata =
  48. jsonDecode(utf8.decode(encodedMetadata));
  49. file.applyMetadata(metadata);
  50. files.add(file);
  51. }
  52. } else {
  53. Bus.instance.fire(RemoteSyncEvent(false));
  54. }
  55. return files;
  56. });
  57. }
  58. Future<List<File>> getFilesDiff(int lastSyncTime, int limit) async {
  59. Response response = await _dio.get(
  60. Configuration.instance.getHttpEndpoint() + "/files/diff",
  61. options:
  62. Options(headers: {"X-Auth-Token": Configuration.instance.getToken()}),
  63. queryParameters: {
  64. "sinceTime": lastSyncTime,
  65. "limit": limit,
  66. },
  67. ).catchError((e) => _logger.severe(e));
  68. if (response != null) {
  69. Bus.instance.fire(RemoteSyncEvent(true));
  70. return (response.data["diff"] as List)
  71. .map((file) => new File.fromJson(file))
  72. .toList();
  73. } else {
  74. Bus.instance.fire(RemoteSyncEvent(false));
  75. return null;
  76. }
  77. }
  78. }