From b14363319aa39b26979f720aeb5860610cd82d0c Mon Sep 17 00:00:00 2001 From: "Alexander \"PapaTutuWawa" Date: Sun, 6 Aug 2023 13:01:28 +0200 Subject: [PATCH] feat(xep): Remove Extensible File Thumbnails --- flake.nix | 13 - packages/moxxmpp/CHANGELOG.md | 1 + packages/moxxmpp/lib/moxxmpp.dart | 1 - packages/moxxmpp/lib/src/namespaces.dart | 3 + .../staging/extensible_file_thumbnails.dart | 57 ---- packages/moxxmpp/lib/src/xeps/xep_0264.dart | 59 +++++ packages/moxxmpp/lib/src/xeps/xep_0385.dart | 19 +- packages/moxxmpp/lib/src/xeps/xep_0446.dart | 16 +- packages/moxxmpp/moxxmpp.doap | 244 +++++++++--------- 9 files changed, 195 insertions(+), 218 deletions(-) delete mode 100644 packages/moxxmpp/lib/src/xeps/staging/extensible_file_thumbnails.dart create mode 100644 packages/moxxmpp/lib/src/xeps/xep_0264.dart diff --git a/flake.nix b/flake.nix index a456520..8b5eb61 100644 --- a/flake.nix +++ b/flake.nix @@ -12,12 +12,6 @@ config = { android_sdk.accept_license = true; allowUnfree = true; - - # Fix to allow building the NDK package - # TODO: Remove once https://github.com/tadfisher/android-nixpkgs/issues/62 is resolved - permittedInsecurePackages = [ - "python-2.7.18.6" - ]; }; }; # Everything to make Flutter happy @@ -34,13 +28,6 @@ platforms-android-30 platforms-android-31 platforms-android-33 - - # For flutter_zxing - cmake-3-18-1 - #ndk-21-4-7075529 - (ndk-21-4-7075529.overrideAttrs (old: { - buildInputs = old.buildInputs ++ [ pkgs.python27 ]; - })) ]); lib = pkgs.lib; pinnedJDK = pkgs.jdk17; diff --git a/packages/moxxmpp/CHANGELOG.md b/packages/moxxmpp/CHANGELOG.md index f653e13..f752ae8 100644 --- a/packages/moxxmpp/CHANGELOG.md +++ b/packages/moxxmpp/CHANGELOG.md @@ -18,6 +18,7 @@ - **BREAKING**: `ChatState.toString()` is now `ChatState.toName()` - **BREAKING**: Overriding `BaseOmemoManager` is no longer required. `OmemoManager` now takes callback methods instead. - Removed `ErrorResponseDiscoError` from the possible XEP-0030 errors. +- **BREAKING**: Removed "Extensible File Thumbnails" (The `Thumbnail` type) ## 0.3.1 diff --git a/packages/moxxmpp/lib/moxxmpp.dart b/packages/moxxmpp/lib/moxxmpp.dart index 55c910c..0429cca 100644 --- a/packages/moxxmpp/lib/moxxmpp.dart +++ b/packages/moxxmpp/lib/moxxmpp.dart @@ -39,7 +39,6 @@ export 'package:moxxmpp/src/socket.dart'; export 'package:moxxmpp/src/stanza.dart'; export 'package:moxxmpp/src/stringxml.dart'; export 'package:moxxmpp/src/util/typed_map.dart'; -export 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart'; export 'package:moxxmpp/src/xeps/staging/fast.dart'; export 'package:moxxmpp/src/xeps/staging/file_upload_notification.dart'; export 'package:moxxmpp/src/xeps/xep_0004.dart'; diff --git a/packages/moxxmpp/lib/src/namespaces.dart b/packages/moxxmpp/lib/src/namespaces.dart index 2249410..6da96fb 100644 --- a/packages/moxxmpp/lib/src/namespaces.dart +++ b/packages/moxxmpp/lib/src/namespaces.dart @@ -69,6 +69,9 @@ const delayedDeliveryXmlns = 'urn:xmpp:delay'; // XEP-0234 const jingleFileTransferXmlns = 'urn:xmpp:jingle:apps:file-transfer:5'; +// XEP-0264 +const jingleContentThumbnailXmlns = 'urn:xmpp:thumbs:1'; + // XEP-0280 const carbonsXmlns = 'urn:xmpp:carbons:2'; diff --git a/packages/moxxmpp/lib/src/xeps/staging/extensible_file_thumbnails.dart b/packages/moxxmpp/lib/src/xeps/staging/extensible_file_thumbnails.dart deleted file mode 100644 index 97899ef..0000000 --- a/packages/moxxmpp/lib/src/xeps/staging/extensible_file_thumbnails.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:moxxmpp/src/stringxml.dart'; - -/// NOTE: Specified by https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-extensible-file-thumbnails.md - -const fileThumbnailsXmlns = 'proto:urn:xmpp:eft:0'; -const blurhashThumbnailType = '$fileThumbnailsXmlns:blurhash'; - -abstract class Thumbnail {} - -class BlurhashThumbnail extends Thumbnail { - BlurhashThumbnail(this.hash); - final String hash; -} - -Thumbnail? parseFileThumbnailElement(XMLNode node) { - assert( - node.attributes['xmlns'] == fileThumbnailsXmlns, - 'Invalid element xmlns', - ); - assert(node.tag == 'file-thumbnail', 'Invalid element name'); - - switch (node.attributes['type']!) { - case blurhashThumbnailType: - { - final hash = node.firstTag('blurhash')!.innerText(); - return BlurhashThumbnail(hash); - } - } - - return null; -} - -XMLNode? _fromThumbnail(Thumbnail thumbnail) { - if (thumbnail is BlurhashThumbnail) { - return XMLNode( - tag: 'blurhash', - text: thumbnail.hash, - ); - } - - return null; -} - -XMLNode constructFileThumbnailElement(Thumbnail thumbnail) { - final node = _fromThumbnail(thumbnail)!; - var type = ''; - if (thumbnail is BlurhashThumbnail) { - type = blurhashThumbnailType; - } - - return XMLNode.xmlns( - tag: 'file-thumbnail', - xmlns: fileThumbnailsXmlns, - attributes: {'type': type}, - children: [node], - ); -} diff --git a/packages/moxxmpp/lib/src/xeps/xep_0264.dart b/packages/moxxmpp/lib/src/xeps/xep_0264.dart new file mode 100644 index 0000000..b67a748 --- /dev/null +++ b/packages/moxxmpp/lib/src/xeps/xep_0264.dart @@ -0,0 +1,59 @@ +import 'package:moxxmpp/src/namespaces.dart'; +import 'package:moxxmpp/src/stringxml.dart'; + +extension _StringToInt on String { + int toInt() => int.parse(this); +} + +class JingleContentThumbnail { + const JingleContentThumbnail( + this.uri, + this.mediaType, + this.width, + this.height, + ); + + factory JingleContentThumbnail.fromXML(XMLNode thumbnail) { + assert( + thumbnail.tag == 'thumbnail', + 'thumbnail must be Jingle Content Thumbnail', + ); + assert( + thumbnail.attributes['xmlns'] == jingleContentThumbnailXmlns, + 'thumbnail must be Jingle Content Thumbnail', + ); + + return JingleContentThumbnail( + Uri.parse(thumbnail.attributes['uri']! as String), + thumbnail.attributes['media-type'] as String?, + (thumbnail.attributes['width'] as String?)?.toInt(), + (thumbnail.attributes['height'] as String?)?.toInt(), + ); + } + + /// The URI of the thumbnail data. + final Uri uri; + + /// The MIME type of the thumbnail + final String? mediaType; + + /// The width of the thumbnail. + final int? width; + + /// The height of the thumbnail. + final int? height; + + /// Convert the thumbnail to its XML representation. + XMLNode toXML() { + return XMLNode.xmlns( + tag: 'thumbnail', + xmlns: jingleContentThumbnailXmlns, + attributes: { + 'uri': uri.toString(), + if (mediaType != null) 'media-type': mediaType!, + if (width != null) 'width': width.toString(), + if (height != null) 'height': height.toString(), + }, + ); + } +} diff --git a/packages/moxxmpp/lib/src/xeps/xep_0385.dart b/packages/moxxmpp/lib/src/xeps/xep_0385.dart index 70b249b..1f6881c 100644 --- a/packages/moxxmpp/lib/src/xeps/xep_0385.dart +++ b/packages/moxxmpp/lib/src/xeps/xep_0385.dart @@ -5,7 +5,7 @@ import 'package:moxxmpp/src/managers/namespaces.dart'; import 'package:moxxmpp/src/namespaces.dart'; import 'package:moxxmpp/src/stanza.dart'; import 'package:moxxmpp/src/stringxml.dart'; -import 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart'; +import 'package:moxxmpp/src/xeps/xep_0264.dart'; class StatelessMediaSharingData implements StanzaHandlerExtension { const StatelessMediaSharingData({ @@ -20,7 +20,7 @@ class StatelessMediaSharingData implements StanzaHandlerExtension { final int size; final String description; final Map hashes; // algo -> hash value - final List thumbnails; + final List thumbnails; final String url; } @@ -48,16 +48,11 @@ StatelessMediaSharingData parseSIMSElement(XMLNode node) { break; } - final thumbnails = List.empty(growable: true); - for (final child in file.children) { - // TODO(Unknown): Handle other thumbnails - if (child.tag == 'file-thumbnail' && - child.attributes['xmlns'] == fileThumbnailsXmlns) { - final thumb = parseFileThumbnailElement(child); - if (thumb != null) { - thumbnails.add(thumb); - } - } + // Thumbnails + final thumbnails = List.empty(growable: true); + for (final i + in file.findTags('thumbnail', xmlns: jingleContentThumbnailXmlns)) { + thumbnails.add(JingleContentThumbnail.fromXML(i)); } return StatelessMediaSharingData( diff --git a/packages/moxxmpp/lib/src/xeps/xep_0446.dart b/packages/moxxmpp/lib/src/xeps/xep_0446.dart index 515c4e7..0cd759c 100644 --- a/packages/moxxmpp/lib/src/xeps/xep_0446.dart +++ b/packages/moxxmpp/lib/src/xeps/xep_0446.dart @@ -1,6 +1,6 @@ import 'package:moxxmpp/src/namespaces.dart'; import 'package:moxxmpp/src/stringxml.dart'; -import 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart'; +import 'package:moxxmpp/src/xeps/xep_0264.dart'; import 'package:moxxmpp/src/xeps/xep_0300.dart'; class FileMetadataData { @@ -39,12 +39,10 @@ class FileMetadataData { } // Thumbnails - final thumbnails = List.empty(growable: true); - for (final i in node.findTags('file-thumbnail')) { - final thumbnail = parseFileThumbnailElement(i); - if (thumbnail != null) { - thumbnails.add(thumbnail); - } + final thumbnails = List.empty(growable: true); + for (final i + in node.findTags('thumbnail', xmlns: jingleContentThumbnailXmlns)) { + thumbnails.add(JingleContentThumbnail.fromXML(i)); } // Length and height @@ -75,7 +73,7 @@ class FileMetadataData { final String? mediaType; final int? width; final int? height; - final List thumbnails; + final List thumbnails; final String? desc; final Map hashes; final int? length; @@ -119,7 +117,7 @@ class FileMetadataData { for (final thumbnail in thumbnails) { node.addChild( - constructFileThumbnailElement(thumbnail), + thumbnail.toXML(), ); } diff --git a/packages/moxxmpp/moxxmpp.doap b/packages/moxxmpp/moxxmpp.doap index 5ceec1e..f0c7348 100644 --- a/packages/moxxmpp/moxxmpp.doap +++ b/packages/moxxmpp/moxxmpp.doap @@ -1,275 +1,267 @@ - - - + + + moxxmpp 2021-12-26 - + Linux Windows macOS Android iOS - Dart - - Alexander "Polynomdivision" - + Alexander "Polynomdivision" + - - - + - - complete - 2.13.0 + + complete + 2.13.0 - - complete - 2.5rc3 + + complete + 2.5rc3 - - partial - 1.2 + + partial + 1.2 - - partial - 1.24.1 + + partial + 1.24.1 - - partial - Only jabber:x:oob - 1.5 + + partial + Only jabber:x:oob + 1.5 - - partial - Receiving data - 1.1.4 + + partial + Receiving data + 1.1.4 - - complete - 2.1 + + complete + 2.1 - - partial - 1.5.2 + + partial + 1.5.2 - - partial - 1.1 + + partial + 1.1 - - complete - 1.4.0 + + complete + 1.4.0 - - complete - 1.3.0 - Not plugged into the UI + + complete + 1.3.0 + Not plugged into the UI - - complete - 1.6 + + complete + 1.6 - - complete - 1.0.1 + + complete + 0.4.1 - - partial - Exists only as part of support for XEP-0280 - 1.0 + + complete + 1.0.1 - - partial - Supports only Sha256, Sha512 and blake2b512 - 1.0.0 + + partial + Exists only as part of support for XEP-0280 + 1.0 - - complete - 1.2.1 + + partial + Supports only Sha256, Sha512 and blake2b512 + 1.0.0 - - partial - Read-only support - 0.4 + + complete + 1.2.1 - - complete - Write-only support - 0.3.0 + + partial + Read-only support + 0.4 - - complete - 1.0 + + complete + Write-only support + 0.3.0 - - complete - 0.6.1 + + complete + 1.0 - - partial - 1.1.0 - Only handles the success case; not accessible via the App + + complete + 0.6.1 - - partial - 1.1.0 + + partial + 1.1.0 + Only handles the success case; not accessible via the App - - complete - 0.4.0 + + partial + 1.1.0 - - complete - 0.8.3 + + complete + 0.4.0 - - partial - 0.4.1 + + complete + 0.8.3 - - complete - 0.3.0 + + partial + 0.4.1 - - complete - 0.1.0 + + complete + 0.3.0 - - complete - 0.2.0 + + complete + 0.1.0 - - complete - 0.1.2 + + complete + 0.2.0 - - partial - 0.2.0 + + complete + 0.1.2 - - complete - 0.1.1 + + partial + 0.2.0 - - complete - 0.2.0 + + complete + 0.1.1 - - partial - 0.2.1 - Only Blurhash is implemented + + complete + 0.2.0 - - partial - 0.0.5 - Sending and receiving implemented; cancellation not implemented + + partial + 0.0.5 + Sending and receiving implemented; cancellation not implemented