From 865e289544692d9c36a3d79bb42cffb2652b07f4 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Fri, 28 Jul 2023 23:25:37 -0500 Subject: [PATCH] Include opengraph metadata about HTML links --- build.gradle | 1 + .../services/XmppConnectionService.java | 43 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 891ddfc97185c778dfc99360d7004f69a8dc8925..ed740ff745e4a423e9f541c95e03dbbd0cb1d6f3 100644 --- a/build.gradle +++ b/build.gradle @@ -119,6 +119,7 @@ dependencies { implementation 'com.caverock:androidsvg-aar:1.4' implementation 'org.tomlj:tomlj:1.1.0' implementation 'com.tbuonomo:dotsindicator:4.2' + implementation 'com.github.Priyansh-Kedia:OpenGraphParser:2.5.5' // INSERT } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 9527bd8931cbfd3cbc992a457bfebf5bc2df8bea..03c7a3df3fefad2a513a85a765ff8bc32a81b69e 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -62,6 +62,10 @@ import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.base.Strings; +import com.kedia.ogparser.OpenGraphCallback; +import com.kedia.ogparser.OpenGraphParser; +import com.kedia.ogparser.OpenGraphResult; + import org.conscrypt.Conscrypt; import org.jxmpp.stringprep.libidn.LibIdnXmppStringprep; import org.openintents.openpgp.IOpenPgpService2; @@ -91,6 +95,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; @@ -1698,6 +1703,7 @@ public class XmppConnectionService extends Service { final boolean audio = mimeType.startsWith("audio/"); final boolean video = mimeType.startsWith("video/"); final boolean pdf = mimeType.equals("application/pdf"); + final boolean html = mimeType.startsWith("text/html") || mimeType.startsWith("application/xhtml+xml"); if (response.isSuccessful() && (image || audio || video || pdf)) { Message.FileParams params = message.getFileParams(); params.url = url.toString(); @@ -1726,8 +1732,43 @@ public class XmppConnectionService extends Service { } }); return; + } else if (response.isSuccessful() && html) { + Semaphore waiter = new Semaphore(0); + new OpenGraphParser(new OpenGraphCallback() { + @Override + public void onPostResponse(OpenGraphResult result) { + Element rdf = new Element("Description", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); + rdf.setAttribute("xmlns:rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); + rdf.setAttribute("rdf:about", link.toString()); + if (result.getTitle() != null && !"".equals(result.getTitle())) { + rdf.addChild("title", "https://ogp.me/ns#").setContent(result.getTitle()); + } + if (result.getDescription() != null && !"".equals(result.getDescription())) { + rdf.addChild("description", "https://ogp.me/ns#").setContent(result.getDescription()); + } + if (result.getUrl() != null) { + rdf.addChild("url", "https://ogp.me/ns#").setContent(result.getUrl()); + } + if (result.getImage() != null) { + rdf.addChild("image", "https://ogp.me/ns#").setContent(result.getImage()); + } + if (result.getType() != null) { + rdf.addChild("type", "https://ogp.me/ns#").setContent(result.getType()); + } + if (result.getSiteName() != null) { + rdf.addChild("site_name", "https://ogp.me/ns#").setContent(result.getSiteName()); + } + message.addPayload(rdf); + waiter.release(); + } + + public void onError(String error) { + waiter.release(); + } + }, false, null).parse(link.toString()); + waiter.acquire(); } - } catch (final IOException e) { } + } catch (final IOException | InterruptedException e) { } } } synchronized (message.getConversation()) {