Compare commits

..

4 Commits

16 changed files with 334 additions and 255 deletions

View File

@ -7,7 +7,7 @@ line-length=72
[title-trailing-punctuation] [title-trailing-punctuation]
[title-hard-tab] [title-hard-tab]
[title-match-regex] [title-match-regex]
regex=^((feat|fix|chore|refactor|docs|release|test)\((meta|tests|style|docs|xep|core|example|all)+(,(meta|tests|style|docs|xep|core|example|all))*\)|release): [A-Z0-9].*$ regex=^((feat|fix|chore|refactor|docs|release|test)\((meta|tests|style|docs|xep|core|example|all|flake)+(,(meta|tests|style|docs|xep|core|example|all|flake))*\)|release): [A-Z0-9].*$
[body-trailing-whitespace] [body-trailing-whitespace]

View File

@ -1,12 +1,72 @@
{ {
"nodes": { "nodes": {
"flake-utils": { "android-nixpkgs": {
"inputs": {
"devshell": "devshell",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
},
"locked": { "locked": {
"lastModified": 1678901627, "lastModified": 1689798050,
"narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=", "narHash": "sha256-ZyFPra7N0MF803o55dYQQyX9b/BmXr6QTCyN7slRThY=",
"owner": "tadfisher",
"repo": "android-nixpkgs",
"rev": "9aa0e2990da86de8ca203af313668851dcb9ea6e",
"type": "github"
},
"original": {
"owner": "tadfisher",
"repo": "android-nixpkgs",
"type": "github"
}
},
"devshell": {
"inputs": {
"nixpkgs": [
"android-nixpkgs",
"nixpkgs"
],
"systems": "systems"
},
"locked": {
"lastModified": 1688380630,
"narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=",
"owner": "numtide",
"repo": "devshell",
"rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "devshell",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1689068808,
"narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6", "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"locked": {
"lastModified": 1667395993,
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -17,27 +77,27 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1676076353, "lastModified": 1689679375,
"narHash": "sha256-mdUtE8Tp40cZETwcq5tCwwLqkJVV1ULJQ5GKRtbshag=", "narHash": "sha256-LHUC52WvyVDi9PwyL1QCpaxYWBqp4ir4iL6zgOkmcb8=",
"owner": "AtaraxiaSjel", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "5deb99bdccbbb97e7562dee4ba8a3ee3021688e6", "rev": "684c17c429c42515bafb3ad775d2a710947f3d67",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "AtaraxiaSjel", "owner": "NixOS",
"ref": "update/flutter", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs-unstable": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1680273054, "lastModified": 1689752456,
"narHash": "sha256-Bs6/5LpvYp379qVqGt9mXxxx9GSE789k3oFc+OAL07M=", "narHash": "sha256-VOChdECcEI8ixz8QY+YC4JaNEFwQd1V8bA0G4B28Ki0=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "3364b5b117f65fe1ce65a3cdd5612a078a3b31e3", "rev": "7f256d7da238cb627ef189d56ed590739f42f13b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -49,9 +109,39 @@
}, },
"root": { "root": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "android-nixpkgs": "android-nixpkgs",
"nixpkgs": "nixpkgs", "flake-utils": "flake-utils_2",
"nixpkgs-unstable": "nixpkgs-unstable" "nixpkgs": "nixpkgs_2"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
} }
} }
}, },

View File

@ -1,12 +1,12 @@
{ {
description = "moxxmpp"; description = "moxxmpp";
inputs = { inputs = {
nixpkgs.url = "github:AtaraxiaSjel/nixpkgs/update/flutter"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; android-nixpkgs.url = "github:tadfisher/android-nixpkgs";
flake-utils.url = "github:numtide/flake-utils"; flake-utils.url = "github:numtide/flake-utils";
}; };
outputs = { self, nixpkgs, nixpkgs-unstable, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let outputs = { self, nixpkgs, android-nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let
pkgs = import nixpkgs { pkgs = import nixpkgs {
inherit system; inherit system;
config = { config = {
@ -14,25 +14,22 @@
allowUnfree = true; allowUnfree = true;
}; };
}; };
unstable = import nixpkgs-unstable { # Everything to make Flutter happy
inherit system; sdk = android-nixpkgs.sdk.${system} (sdkPkgs: with sdkPkgs; [
}; cmdline-tools-latest
android = pkgs.androidenv.composeAndroidPackages { build-tools-30-0-3
# TODO: Find a way to pin these build-tools-33-0-2
#toolsVersion = "26.1.1"; build-tools-34-0-0
#platformToolsVersion = "31.0.3"; platform-tools
#buildToolsVersions = [ "31.0.0" ]; emulator
#includeEmulator = true; patcher-v4
#emulatorVersion = "30.6.3"; platforms-android-28
platformVersions = [ "28" ]; platforms-android-29
includeSources = false; platforms-android-30
includeSystemImages = true; platforms-android-31
systemImageTypes = [ "default" ]; platforms-android-33
abiVersions = [ "x86_64" ]; ]);
includeNDK = false; lib = pkgs.lib;
useGoogleAPIs = false;
useGoogleTVAddOns = false;
};
pinnedJDK = pkgs.jdk17; pinnedJDK = pkgs.jdk17;
pythonEnv = pkgs.python3.withPackages (ps: with ps; [ pythonEnv = pkgs.python3.withPackages (ps: with ps; [
@ -51,7 +48,7 @@
}; };
devShell = let devShell = let
prosody-newer-community-modules = unstable.prosody.overrideAttrs (old: { prosody-newer-community-modules = pkgs.prosody.overrideAttrs (old: {
communityModules = pkgs.fetchhg { communityModules = pkgs.fetchhg {
url = "https://hg.prosody.im/prosody-modules"; url = "https://hg.prosody.im/prosody-modules";
rev = "e3a3a6c86a9f"; rev = "e3a3a6c86a9f";
@ -71,7 +68,7 @@
}; };
in pkgs.mkShell { in pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
flutter pinnedJDK android.platform-tools dart # Dart flutter37 pinnedJDK sdk dart # Dart
gitlint # Code hygiene gitlint # Code hygiene
ripgrep # General utilities ripgrep # General utilities
@ -103,7 +100,13 @@
CPATH = "${pkgs.xorg.libX11.dev}/include:${pkgs.xorg.xorgproto}/include"; CPATH = "${pkgs.xorg.libX11.dev}/include:${pkgs.xorg.xorgproto}/include";
LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ atk cairo epoxy gdk-pixbuf glib gtk3 harfbuzz pango ]; LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [ atk cairo epoxy gdk-pixbuf glib gtk3 harfbuzz pango ];
ANDROID_SDK_ROOT = "${sdk}/share/android-sdk";
ANDROID_HOME = "${sdk}/share/android-sdk";
JAVA_HOME = pinnedJDK; JAVA_HOME = pinnedJDK;
# Fix an issue with Flutter using an older version of aapt2, which does not know
# an used parameter.
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${sdk}/share/android-sdk/build-tools/34.0.0/aapt2";
}; };
}); });
} }

View File

@ -18,6 +18,7 @@
- **BREAKING**: `ChatState.toString()` is now `ChatState.toName()` - **BREAKING**: `ChatState.toString()` is now `ChatState.toName()`
- **BREAKING**: Overriding `BaseOmemoManager` is no longer required. `OmemoManager` now takes callback methods instead. - **BREAKING**: Overriding `BaseOmemoManager` is no longer required. `OmemoManager` now takes callback methods instead.
- Removed `ErrorResponseDiscoError` from the possible XEP-0030 errors. - Removed `ErrorResponseDiscoError` from the possible XEP-0030 errors.
- **BREAKING**: Removed "Extensible File Thumbnails" (The `Thumbnail` type)
## 0.3.1 ## 0.3.1

View File

@ -39,7 +39,6 @@ export 'package:moxxmpp/src/socket.dart';
export 'package:moxxmpp/src/stanza.dart'; export 'package:moxxmpp/src/stanza.dart';
export 'package:moxxmpp/src/stringxml.dart'; export 'package:moxxmpp/src/stringxml.dart';
export 'package:moxxmpp/src/util/typed_map.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/fast.dart';
export 'package:moxxmpp/src/xeps/staging/file_upload_notification.dart'; export 'package:moxxmpp/src/xeps/staging/file_upload_notification.dart';
export 'package:moxxmpp/src/xeps/xep_0004.dart'; export 'package:moxxmpp/src/xeps/xep_0004.dart';

View File

@ -312,7 +312,7 @@ class XmppConnection {
/// Called when a stream ending error has occurred /// Called when a stream ending error has occurred
Future<void> handleError(XmppError error) async { Future<void> handleError(XmppError error) async {
_log.severe('handleError called with ${error.toString()}'); _log.severe('handleError called with $error');
// Whenever we encounter an error that would trigger a reconnection attempt while // Whenever we encounter an error that would trigger a reconnection attempt while
// the connection result is being awaited, don't attempt a reconnection but instead // the connection result is being awaited, don't attempt a reconnection but instead

View File

@ -55,8 +55,6 @@ class JID {
/// Converts the JID into a bare JID. /// Converts the JID into a bare JID.
JID toBare() { JID toBare() {
if (isBare()) return this;
return JID(local, domain, ''); return JID(local, domain, '');
} }

View File

@ -69,6 +69,9 @@ const delayedDeliveryXmlns = 'urn:xmpp:delay';
// XEP-0234 // XEP-0234
const jingleFileTransferXmlns = 'urn:xmpp:jingle:apps:file-transfer:5'; const jingleFileTransferXmlns = 'urn:xmpp:jingle:apps:file-transfer:5';
// XEP-0264
const jingleContentThumbnailXmlns = 'urn:xmpp:thumbs:1';
// XEP-0280 // XEP-0280
const carbonsXmlns = 'urn:xmpp:carbons:2'; const carbonsXmlns = 'urn:xmpp:carbons:2';

View File

@ -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],
);
}

View File

@ -5,7 +5,6 @@ import 'package:moxxmpp/src/managers/namespaces.dart';
import 'package:moxxmpp/src/namespaces.dart'; import 'package:moxxmpp/src/namespaces.dart';
import 'package:moxxmpp/src/stanza.dart'; import 'package:moxxmpp/src/stanza.dart';
import 'package:moxxmpp/src/stringxml.dart'; import 'package:moxxmpp/src/stringxml.dart';
import 'package:moxxmpp/src/xeps/xep_0030/errors.dart';
import 'package:moxxmpp/src/xeps/xep_0030/types.dart'; import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart'; import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
import 'package:moxxmpp/src/xeps/xep_0045/errors.dart'; import 'package:moxxmpp/src/xeps/xep_0045/errors.dart';

View File

@ -15,7 +15,6 @@ import 'package:moxxmpp/src/stringxml.dart';
import 'package:moxxmpp/src/util/list.dart'; import 'package:moxxmpp/src/util/list.dart';
import 'package:moxxmpp/src/xeps/xep_0004.dart'; import 'package:moxxmpp/src/xeps/xep_0004.dart';
import 'package:moxxmpp/src/xeps/xep_0030/cache.dart'; import 'package:moxxmpp/src/xeps/xep_0030/cache.dart';
import 'package:moxxmpp/src/xeps/xep_0030/errors.dart';
import 'package:moxxmpp/src/xeps/xep_0030/types.dart'; import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart'; import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
import 'package:moxxmpp/src/xeps/xep_0300.dart'; import 'package:moxxmpp/src/xeps/xep_0300.dart';

View File

@ -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(),
},
);
}
}

View File

@ -5,7 +5,7 @@ import 'package:moxxmpp/src/managers/namespaces.dart';
import 'package:moxxmpp/src/namespaces.dart'; import 'package:moxxmpp/src/namespaces.dart';
import 'package:moxxmpp/src/stanza.dart'; import 'package:moxxmpp/src/stanza.dart';
import 'package:moxxmpp/src/stringxml.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 { class StatelessMediaSharingData implements StanzaHandlerExtension {
const StatelessMediaSharingData({ const StatelessMediaSharingData({
@ -20,7 +20,7 @@ class StatelessMediaSharingData implements StanzaHandlerExtension {
final int size; final int size;
final String description; final String description;
final Map<String, String> hashes; // algo -> hash value final Map<String, String> hashes; // algo -> hash value
final List<Thumbnail> thumbnails; final List<JingleContentThumbnail> thumbnails;
final String url; final String url;
} }
@ -48,16 +48,11 @@ StatelessMediaSharingData parseSIMSElement(XMLNode node) {
break; break;
} }
final thumbnails = List<Thumbnail>.empty(growable: true); // Thumbnails
for (final child in file.children) { final thumbnails = List<JingleContentThumbnail>.empty(growable: true);
// TODO(Unknown): Handle other thumbnails for (final i
if (child.tag == 'file-thumbnail' && in file.findTags('thumbnail', xmlns: jingleContentThumbnailXmlns)) {
child.attributes['xmlns'] == fileThumbnailsXmlns) { thumbnails.add(JingleContentThumbnail.fromXML(i));
final thumb = parseFileThumbnailElement(child);
if (thumb != null) {
thumbnails.add(thumb);
}
}
} }
return StatelessMediaSharingData( return StatelessMediaSharingData(

View File

@ -1,6 +1,6 @@
import 'package:moxxmpp/src/namespaces.dart'; import 'package:moxxmpp/src/namespaces.dart';
import 'package:moxxmpp/src/stringxml.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'; import 'package:moxxmpp/src/xeps/xep_0300.dart';
class FileMetadataData { class FileMetadataData {
@ -39,12 +39,10 @@ class FileMetadataData {
} }
// Thumbnails // Thumbnails
final thumbnails = List<Thumbnail>.empty(growable: true); final thumbnails = List<JingleContentThumbnail>.empty(growable: true);
for (final i in node.findTags('file-thumbnail')) { for (final i
final thumbnail = parseFileThumbnailElement(i); in node.findTags('thumbnail', xmlns: jingleContentThumbnailXmlns)) {
if (thumbnail != null) { thumbnails.add(JingleContentThumbnail.fromXML(i));
thumbnails.add(thumbnail);
}
} }
// Length and height // Length and height
@ -75,7 +73,7 @@ class FileMetadataData {
final String? mediaType; final String? mediaType;
final int? width; final int? width;
final int? height; final int? height;
final List<Thumbnail> thumbnails; final List<JingleContentThumbnail> thumbnails;
final String? desc; final String? desc;
final Map<HashFunction, String> hashes; final Map<HashFunction, String> hashes;
final int? length; final int? length;
@ -119,7 +117,7 @@ class FileMetadataData {
for (final thumbnail in thumbnails) { for (final thumbnail in thumbnails) {
node.addChild( node.addChild(
constructFileThumbnailElement(thumbnail), thumbnail.toXML(),
); );
} }

View File

@ -1,29 +1,22 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://usefulinc.com/ns/doap#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:xmpp="https://linkmauve.fr/ns/xmpp-doap#">
xmlns='http://usefulinc.com/ns/doap#' <Project xml:lang="en">
xmlns:foaf='http://xmlns.com/foaf/0.1/'
xmlns:xmpp='https://linkmauve.fr/ns/xmpp-doap#'>
<Project xml:lang='en'>
<name>moxxmpp</name> <name>moxxmpp</name>
<created>2021-12-26</created> <created>2021-12-26</created>
<homepage rdf:resource='https://codeberg.org/moxxy/moxxmpp'/> <homepage rdf:resource="https://codeberg.org/moxxy/moxxmpp"/>
<os>Linux</os> <os>Linux</os>
<os>Windows</os> <os>Windows</os>
<os>macOS</os> <os>macOS</os>
<os>Android</os> <os>Android</os>
<os>iOS</os> <os>iOS</os>
<programming-language>Dart</programming-language> <programming-language>Dart</programming-language>
<maintainer> <maintainer>
<foaf:Person> <foaf:Person>
<foaf:name>Alexander "Polynomdivision"</foaf:name> <foaf:name>Alexander "Polynomdivision"</foaf:name>
<foaf:homepage rdf:resource="https://blog.polynom.me"/> <foaf:homepage rdf:resource="https://blog.polynom.me"/>
</foaf:Person> </foaf:Person>
</maintainer> </maintainer>
<implements rdf:resource="https://xmpp.org/rfcs/rfc6120.html"/> <implements rdf:resource="https://xmpp.org/rfcs/rfc6120.html"/>
<implements> <implements>
<xmpp:SupportedXep> <xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/> <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
@ -111,6 +104,13 @@
<xmpp:version>1.6</xmpp:version> <xmpp:version>1.6</xmpp:version>
</xmpp:SupportedXep> </xmpp:SupportedXep>
</implements> </implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0264.html"/>
<xmpp:status>complete</xmpp:status>
<xmpp:version>0.4.1</xmpp:version>
</xmpp:SupportedXep>
</implements>
<implements> <implements>
<xmpp:SupportedXep> <xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0280.html"/> <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0280.html"/>
@ -256,14 +256,6 @@
<xmpp:version>0.2.0</xmpp:version> <xmpp:version>0.2.0</xmpp:version>
</xmpp:SupportedXep> </xmpp:SupportedXep>
</implements> </implements>
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-extensible-file-thumbnails.md" />
<xmpp:status>partial</xmpp:status>
<xmpp:version>0.2.1</xmpp:version>
<xmpp:note xml:lang="en">Only Blurhash is implemented</xmpp:note>
</xmpp:SupportedXep>
</implements>
<implements> <implements>
<xmpp:SupportedXep> <xmpp:SupportedXep>
<xmpp:xep rdf:resource="https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-file-upload-notification.md"/> <xmpp:xep rdf:resource="https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-file-upload-notification.md"/>

View File

@ -58,7 +58,7 @@ List<ExpectationBase> buildAuthenticatedPlay(ConnectionSettings settings) {
); );
return [ return [
StringExpectation( StringExpectation(
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare().toString()}' xml:lang='en'>", "<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare()}' xml:lang='en'>",
''' '''
<stream:stream <stream:stream
xmlns="jabber:client" xmlns="jabber:client"
@ -77,7 +77,7 @@ List<ExpectationBase> buildAuthenticatedPlay(ConnectionSettings settings) {
'<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />', '<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />',
), ),
StringExpectation( StringExpectation(
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare().toString()}' xml:lang='en'>", "<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='${settings.jid.domain}' from='${settings.jid.toBare()}' xml:lang='en'>",
''' '''
<stream:stream <stream:stream
xmlns="jabber:client" xmlns="jabber:client"