From 9a6a46fd0d97b52415139dddc7f0dc4c88b98167 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 24 Dec 2024 16:23:57 +0530 Subject: [PATCH 1/5] [mob][photos] Chore --- mobile/lib/ui/viewer/file/zoomable_live_image_new.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/file/zoomable_live_image_new.dart b/mobile/lib/ui/viewer/file/zoomable_live_image_new.dart index 036a3a62f0..74be3d954e 100644 --- a/mobile/lib/ui/viewer/file/zoomable_live_image_new.dart +++ b/mobile/lib/ui/viewer/file/zoomable_live_image_new.dart @@ -51,6 +51,8 @@ class _ZoomableLiveImageNewState extends State @override void initState() { + super.initState(); + _enteFile = widget.enteFile; _logger.info( 'initState for ${_enteFile.generatedID} with tag ${_enteFile.tag} and name ${_enteFile.displayName}', @@ -64,7 +66,6 @@ class _ZoomableLiveImageNewState extends State isGuestView = event.isGuestView; }); }); - super.initState(); } void _onLongPressEvent(bool isPressed) { From df68d3f005b196eb138772a691935e6eca69efa4 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 24 Dec 2024 16:25:55 +0530 Subject: [PATCH 2/5] [mob][photos] Fix local files coming up when public links are opened in-app --- mobile/lib/utils/diff_fetcher.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/lib/utils/diff_fetcher.dart b/mobile/lib/utils/diff_fetcher.dart index 044dc3a1a1..5d3f9986b7 100644 --- a/mobile/lib/utils/diff_fetcher.dart +++ b/mobile/lib/utils/diff_fetcher.dart @@ -79,6 +79,9 @@ class DiffFetcher { file.pubMagicMetadata = PubMagicMetadata.fromEncodedJson(file.pubMmdEncodedJson!); } + + // To avoid local file to be used as thumbnail or full file. + file.localID = null; sharedFiles.add(file); } From cc674183cdccf258d4d6f96af304fadfab03fd0b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 24 Dec 2024 16:30:38 +0530 Subject: [PATCH 3/5] [mob][photos] Use genId + uploadedId instead of just genId for value key to make sure all keys are unique when opening a public link in-app (genID is null for all files in public link) --- mobile/lib/ui/viewer/file/file_widget.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/file/file_widget.dart b/mobile/lib/ui/viewer/file/file_widget.dart index 9cae3d328f..4926b76b36 100644 --- a/mobile/lib/ui/viewer/file/file_widget.dart +++ b/mobile/lib/ui/viewer/file/file_widget.dart @@ -27,7 +27,9 @@ class FileWidget extends StatelessWidget { Widget build(BuildContext context) { // Specify key to ensure that the widget is rebuilt when the file changes // Before changing this, ensure that file deletes are handled properly - final String fileKey = "file_${file.generatedID}"; + + final String fileKey = + "file_genID_${file.generatedID}___file_id_${file.uploadedFileID}"; if (file.fileType == FileType.livePhoto || file.fileType == FileType.image) { return ZoomableLiveImageNew( From bd0e8e6fe65766863a29af739ae401dcc1a82ab1 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 24 Dec 2024 17:25:33 +0530 Subject: [PATCH 4/5] [mob][photos] Fix in-app public links only showing upto 2000 files --- mobile/lib/utils/diff_fetcher.dart | 103 ++++++++++++++++------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/mobile/lib/utils/diff_fetcher.dart b/mobile/lib/utils/diff_fetcher.dart index 5d3f9986b7..4cf989f9ae 100644 --- a/mobile/lib/utils/diff_fetcher.dart +++ b/mobile/lib/utils/diff_fetcher.dart @@ -27,66 +27,75 @@ class DiffFetcher { .getSharedPublicAlbumToken(collectionID); final authJWTToken = await CollectionsService.instance .getSharedPublicAlbumTokenJWT(collectionID); + bool hasMore = false; + final sharedFiles = []; final headers = { "X-Auth-Access-Token": authToken, if (authJWTToken != null) "X-Auth-Access-Token-JWT": authJWTToken, }; - final response = await _enteDio.get( - "/public-collection/diff", - options: Options(headers: headers), - queryParameters: {"sinceTime": 0}, - ); + int sinceTime = 0; - final diff = response.data["diff"] as List; - final startTime = DateTime.now(); - final sharedFiles = []; - - for (final item in diff) { - final file = EnteFile(); - if (item["isDeleted"]) { - continue; - } - file.uploadedFileID = item["id"]; - file.collectionID = item["collectionID"]; - file.ownerID = item["ownerID"]; - file.encryptedKey = item["encryptedKey"]; - file.keyDecryptionNonce = item["keyDecryptionNonce"]; - file.fileDecryptionHeader = item["file"]["decryptionHeader"]; - file.thumbnailDecryptionHeader = item["thumbnail"]["decryptionHeader"]; - file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"]; - if (item["info"] != null) { - file.fileSize = item["info"]["fileSize"]; - } - final fileKey = getFileKey(file); - final encodedMetadata = await CryptoUtil.decryptChaCha( - CryptoUtil.base642bin(item["metadata"]["encryptedData"]), - fileKey, - CryptoUtil.base642bin(file.metadataDecryptionHeader!), + do { + final response = await _enteDio.get( + "/public-collection/diff", + options: Options(headers: headers), + queryParameters: {"sinceTime": sinceTime}, ); - final Map metadata = - jsonDecode(utf8.decode(encodedMetadata)); - file.applyMetadata(metadata); - if (item['pubMagicMetadata'] != null) { - final utfEncodedMmd = await CryptoUtil.decryptChaCha( - CryptoUtil.base642bin(item['pubMagicMetadata']['data']), + + final diff = response.data["diff"] as List; + hasMore = response.data["hasMore"] as bool; + + for (final item in diff) { + final file = EnteFile(); + if (item["isDeleted"]) { + continue; + } + file.uploadedFileID = item["id"]; + file.collectionID = item["collectionID"]; + file.ownerID = item["ownerID"]; + file.encryptedKey = item["encryptedKey"]; + file.keyDecryptionNonce = item["keyDecryptionNonce"]; + file.fileDecryptionHeader = item["file"]["decryptionHeader"]; + file.thumbnailDecryptionHeader = + item["thumbnail"]["decryptionHeader"]; + file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"]; + if (item["info"] != null) { + file.fileSize = item["info"]["fileSize"]; + } + final fileKey = getFileKey(file); + final encodedMetadata = await CryptoUtil.decryptChaCha( + CryptoUtil.base642bin(item["metadata"]["encryptedData"]), fileKey, - CryptoUtil.base642bin(item['pubMagicMetadata']['header']), + CryptoUtil.base642bin(file.metadataDecryptionHeader!), ); - file.pubMmdEncodedJson = utf8.decode(utfEncodedMmd); - file.pubMmdVersion = item['pubMagicMetadata']['version']; - file.pubMagicMetadata = - PubMagicMetadata.fromEncodedJson(file.pubMmdEncodedJson!); + final Map metadata = + jsonDecode(utf8.decode(encodedMetadata)); + file.applyMetadata(metadata); + if (item['pubMagicMetadata'] != null) { + final utfEncodedMmd = await CryptoUtil.decryptChaCha( + CryptoUtil.base642bin(item['pubMagicMetadata']['data']), + fileKey, + CryptoUtil.base642bin(item['pubMagicMetadata']['header']), + ); + file.pubMmdEncodedJson = utf8.decode(utfEncodedMmd); + file.pubMmdVersion = item['pubMagicMetadata']['version']; + file.pubMagicMetadata = + PubMagicMetadata.fromEncodedJson(file.pubMmdEncodedJson!); + } + + // To avoid local file to be used as thumbnail or full file. + file.localID = null; + + sharedFiles.add(file); } - // To avoid local file to be used as thumbnail or full file. - file.localID = null; - sharedFiles.add(file); - } + if (diff.isNotEmpty) { + sinceTime = diff.last["updationTime"]; + } + } while (hasMore); - _logger.info('[Collection-$collectionID] parsed ${diff.length} ' - 'diff items ( ${sharedFiles.length} updated) in ${DateTime.now().difference(startTime).inMilliseconds}ms'); return sharedFiles; } catch (e, s) { _logger.severe("Failed to decrypt collection ", e, s); From 21f0602161da3b7ba502ea34be0b76c67cd8c9bf Mon Sep 17 00:00:00 2001 From: ashilkn Date: Tue, 24 Dec 2024 18:13:28 +0530 Subject: [PATCH 5/5] [mob][photos] Fix sort order setting not reflecting on public link opened in-app --- mobile/lib/services/collections_service.dart | 18 ++++++++++++++++++ mobile/lib/ui/tabs/home_widget.dart | 15 +++++++++++---- mobile/lib/utils/diff_fetcher.dart | 5 ++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/mobile/lib/services/collections_service.dart b/mobile/lib/services/collections_service.dart index 659113aeee..38b54af8f0 100644 --- a/mobile/lib/services/collections_service.dart +++ b/mobile/lib/services/collections_service.dart @@ -1067,6 +1067,24 @@ class CollectionsService { _cachedPublicAlbumToken[collection.id] = authToken!; _cachedPublicCollectionID.add(collection.id); _cachedPublicAlbumKey[collection.id] = albumKey; + + if (collectionData['pubMagicMetadata'] != null) { + final utfEncodedMmd = await CryptoUtil.decryptChaCha( + CryptoUtil.base642bin(collectionData['pubMagicMetadata']['data']), + collectionKey, + CryptoUtil.base642bin( + collectionData['pubMagicMetadata']['header'], + ), + ); + collection.mMdPubEncodedJson = utf8.decode(utfEncodedMmd); + collection.mMbPubVersion = + collectionData['pubMagicMetadata']['version']; + collection.pubMagicMetadata = + CollectionPubMagicMetadata.fromEncodedJson( + collection.mMdPubEncodedJson ?? '{}', + ); + } + collection.setName(_getDecryptedCollectionName(collection)); return collection; } catch (e, s) { diff --git a/mobile/lib/ui/tabs/home_widget.dart b/mobile/lib/ui/tabs/home_widget.dart index 73ed33d428..2c10c300f4 100644 --- a/mobile/lib/ui/tabs/home_widget.dart +++ b/mobile/lib/ui/tabs/home_widget.dart @@ -306,8 +306,12 @@ class _HomeWidgetState extends State { if (result) { await dialog.show(); - final List sharedFiles = await _diffFetcher - .getPublicFiles(context, collection.id); + final List sharedFiles = + await _diffFetcher.getPublicFiles( + context, + collection.id, + collection.pubMagicMetadata.asc ?? false, + ); await dialog.hide(); Navigator.of(context).pop(); @@ -334,8 +338,11 @@ class _HomeWidgetState extends State { } else { await dialog.show(); - final List sharedFiles = - await _diffFetcher.getPublicFiles(context, collection.id); + final List sharedFiles = await _diffFetcher.getPublicFiles( + context, + collection.id, + collection.pubMagicMetadata.asc ?? false, + ); await dialog.hide(); await routeToPage( diff --git a/mobile/lib/utils/diff_fetcher.dart b/mobile/lib/utils/diff_fetcher.dart index 4cf989f9ae..3bcf22b7d0 100644 --- a/mobile/lib/utils/diff_fetcher.dart +++ b/mobile/lib/utils/diff_fetcher.dart @@ -21,6 +21,7 @@ class DiffFetcher { Future> getPublicFiles( BuildContext context, int collectionID, + bool sortAsc, ) async { try { final authToken = await CollectionsService.instance @@ -95,7 +96,9 @@ class DiffFetcher { sinceTime = diff.last["updationTime"]; } } while (hasMore); - + if (sortAsc) { + sharedFiles.sort((a, b) => a.creationTime!.compareTo(b.creationTime!)); + } return sharedFiles; } catch (e, s) { _logger.severe("Failed to decrypt collection ", e, s);