| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-09-13 18:51:32 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-09-13 18:53:11 UTC |
| parent | 8b138a608af1fe776693988a07d4a497f7310098 |
| xmpp/Client.hx | +10 | -1 |
| xmpp/Persistence.hx | +1 | -1 |
| xmpp/persistence/browser.js | +2 | -2 |
diff --git a/xmpp/Client.hx b/xmpp/Client.hx index 4bb7a20..a250fc0 100644 --- a/xmpp/Client.hx +++ b/xmpp/Client.hx @@ -52,8 +52,17 @@ class Client extends xmpp.EventEmitter { final pubsubEvent = PubsubEvent.fromStanza(stanza); if (pubsubEvent != null && pubsubEvent.getFrom() != null && pubsubEvent.getNode() == "urn:xmpp:avatar:metadata" && pubsubEvent.getItems().length > 0) { + final item = pubsubEvent.getItems()[0]; final avatarSha1Hex = pubsubEvent.getItems()[0].attr.get("id"); final avatarSha1 = Bytes.ofHex(avatarSha1Hex).getData(); + final metadata = item.getChild("metadata", "urn:xmpp:avatar:metadata"); + var mime = "image/png"; + if (metadata != null) { + final info = metadata.getChild("info"); // should have xmlns matching metadata + if (info != null && info.attr.get("type") != null) { + mime = info.attr.get("type"); + } + } final chat = this.getDirectChat(JID.parse(pubsubEvent.getFrom()).asBare().asString(), false); chat.setAvatarSha1(avatarSha1); persistence.getMediaUri("sha-1", avatarSha1, (uri) -> { @@ -64,7 +73,7 @@ class Client extends xmpp.EventEmitter { if (item == null) return; final dataNode = item.getChild("data", "urn:xmpp:avatar:data"); if (dataNode == null) return; - persistence.storeMedia(Base64.decode(dataNode.getText()).getData(), () -> { + persistence.storeMedia(mime, Base64.decode(StringTools.replace(dataNode.getText(), "\n", "")).getData(), () -> { this.trigger("chats/update", [chat]); }); }); diff --git a/xmpp/Persistence.hx b/xmpp/Persistence.hx index af1396f..3698acb 100644 --- a/xmpp/Persistence.hx +++ b/xmpp/Persistence.hx @@ -8,5 +8,5 @@ abstract class Persistence { abstract public function storeMessage(accountId: String, message: ChatMessage):Void; abstract public function getMessages(accountId: String, chatId: String, beforeId: Null<String>, beforeTime: Null<String>, callback: (messages:Array<ChatMessage>)->Void):Void; abstract public function getMediaUri(hashAlgorithm:String, hash:BytesData, callback: (uri:Null<String>)->Void):Void; - abstract public function storeMedia(bytes:BytesData, callback: ()->Void):Void; + abstract public function storeMedia(mime:String, bytes:BytesData, callback: ()->Void):Void; } diff --git a/xmpp/persistence/browser.js b/xmpp/persistence/browser.js index 3bc9412..0848e4d 100644 --- a/xmpp/persistence/browser.js +++ b/xmpp/persistence/browser.js @@ -123,13 +123,13 @@ exports.xmpp.persistence = { }); }, - storeMedia: function(buffer, callback) { + storeMedia: function(mime, buffer, callback) { (async function() { const sha256 = await crypto.subtle.digest("SHA-256", buffer); const sha512 = await crypto.subtle.digest("SHA-512", buffer); const sha1 = await crypto.subtle.digest("SHA-1", buffer); const sha256NiUrl = mkNiUrl("sha-256", sha256); - await cache.put(sha256NiUrl, new Response(buffer)); + await cache.put(sha256NiUrl, new Response(buffer, { headers: { "Content-Type": mime } })); localStorage.setItem(mkNiUrl("sha-1", sha1), sha256NiUrl); localStorage.setItem(mkNiUrl("sha-512", sha512), sha256NiUrl); })().then(callback);