Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:commet/client/components/url_preview/url_preview_component.dart';
import 'package:commet/client/matrix/extensions/matrix_client_extensions.dart';
import 'package:commet/client/matrix/matrix_client.dart';
import 'package:commet/client/matrix/matrix_mxc_image_provider.dart';
import 'package:commet/client/matrix/matrix_room.dart';
Expand All @@ -11,7 +10,6 @@ import 'package:commet/main.dart';
import 'package:commet/utils/mime.dart';
import 'package:flutter/widgets.dart';
import 'package:matrix/matrix.dart' as matrix;
import 'package:encrypted_url_preview/encrypted_url_preview.dart';
import 'package:matrix/matrix_api_lite.dart';

class MatrixUrlPreviewComponent implements UrlPreviewComponent<MatrixClient> {
Expand All @@ -22,24 +20,8 @@ class MatrixUrlPreviewComponent implements UrlPreviewComponent<MatrixClient> {

Map<String, UrlPreviewData> cache = {};

EncryptedUrlPreview? privatePreviewGetter;

bool? serverSupportsUrlPreview;

void createPrivatePreviewGetter() {
privatePreviewGetter = EncryptedUrlPreview(
proxyServerUrl: Uri.https("telescope.commet.chat"),
publicKeyPem: """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+sAi8PsT4QwjV/+xXK0
vwavZJEjkwJyFODGWkoo7qB87Y2yU6/C4csul6kQpxBFu9ID7mCavAlr93/c70Qm
sgX791W7oOSpvyeffJe5iluzaglZ/KWYo6Bc0QajKT8rLdI5vUljVMyx/nR9rIhY
PvSJhSFLC2ZyUhhTb/ZeLm0arEtGeyfo1V3nLGsJZJx12UK8E0FpKP14S7Wke9zM
e05PDCU/llEQpUgQOJI9Vnji71Fgocii76aSULhXalGjQIzBGKib5MIYlb0Zgf8k
wKkRg6IrNt5kjad4PoRKocxj3ylvuxEtMN582ni3lO4gi1uzzVvFtJBzrhNMjTPC
pQIDAQAB
-----END PUBLIC KEY-----""");
}

@override
Future<UrlPreviewData?> getPreview(
Timeline timeline, TimelineEvent event) async {
Expand All @@ -66,11 +48,7 @@ pQIDAQAB
UrlPreviewData? data;

try {
if (room.isE2EE) {
data = await getEncryptedPreviewData(mxClient, uri);
} else {
data = await fetchPreviewData(mxClient, uri);
}
data = await fetchPreviewData(mxClient, uri);
} catch (_) {
return null;
}
Expand Down Expand Up @@ -130,59 +108,6 @@ pQIDAQAB
}
}

Future<UrlPreviewData> getEncryptedPreviewData(
matrix.Client client, Uri url) async {
if (privatePreviewGetter == null) {
createPrivatePreviewGetter();
}

var key = privatePreviewGetter!.getNextKey();
var proxyUrl = privatePreviewGetter!.getProxyUrl(url, key);

var response = await client.request(
matrix.RequestType.GET, await getRequestPath(),
query: {"url": proxyUrl.toString()});

var title = response['og:title'] as String?;
var siteName = response['og:site_name'] as String?;
var imageUrl = response['og:image'] as String?;
var description = response['og:description'] as String?;

ImageProvider? image;

if (imageUrl != null) {
var mxcUri = Uri.parse(imageUrl);
if (mxcUri.scheme == "mxc") {
try {
var response = await client.getContentFromUri(mxcUri);
var bytes = response.data;
var decrypted = privatePreviewGetter!.decryptContent(bytes, key);

image = Image.memory(decrypted).image;
} catch (e, t) {
Log.onError(e, t,
content: "Failed to get encrypted url preview image data");
}
}
}

if (title != null)
title = privatePreviewGetter!.decryptContentString(title, key);
if (siteName != null)
siteName = privatePreviewGetter!.decryptContentString(siteName, key);

if (description != null)
description = privatePreviewGetter!
.decryptContentString(description, key)
.replaceAll("\n", " ");

return UrlPreviewData(url,
siteName: siteName,
title: title,
description: description,
image: image);
}

Future<UrlPreviewData?> fetchPreviewData(
matrix.Client client, Uri url) async {
late Map<String, Object?> response;
Expand Down
2 changes: 1 addition & 1 deletion commet/lib/config/preferences.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class Preferences {
static const String _pushGateway = "push_gateway";
static const String _lastDownloadLocation = "last_download_location";
static const String _stickerCompatibilityMode = "sticker_compatibility_mode";
static const String _urlPreviewInE2EEChat = "use_url_preview_in_e2ee_chat";
static const String _urlPreviewInE2EEChat = "enable_url_preview_in_e2ee_chat";
static const String _messageEffectsEnabled = "message_effects_enabled";
static const String _lastForegroundServiceSucceeded =
"did_last_foreground_service_run_succeed";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,17 @@ class GeneralSettingsPageState extends State<GeneralSettingsPage> {
args: [proxyUrl],
name: "labelGifSearchDescription");

String get labelEncryptedPreview => Intl.message(
"URL Preview in Encrypted Chats (Experimental)",
String get labelUrlPreviewInEncryptedChatTitle => Intl.message(
"URL Preview in Encrypted Chats",
desc:
"Label for the toggle for enabling and disabling encrypted url preview",
name: "labelEncryptedPreview");
"Label for the toggle for enabling and disabling use of url previews in encrypted chats",
name: "labelUrlPreviewInEncryptedChatTitle");

String labelEncryptedPreviewDescription(proxyUrl) => Intl.message(
"Enable use of a proxy server ($proxyUrl) to get url preview in an encrypted chat. The content of these requests will be hidden from your homeserver using Commet's 'encrypted url preview'\nLearn more: https://github.com/commetchat/encrypted_url_preview",
desc: "Explains briefly how encrypted url preview works",
args: [proxyUrl],
name: "labelEncryptedPreviewDescription");
String get labelUrlPreviewInEncryptedChatDescription => Intl.message(
"This will expose any URLs sent in your encrypted chats to your homeserver in order to fetch the preview",
desc:
"description for the toggle for enabling and disabling use of url previews in encrypted chats",
name: "labelUrlPreviewInEncryptedChatDescription");

String get labelMessageEffectsTitle => Intl.message("Message Effects",
desc:
Expand Down Expand Up @@ -87,9 +87,8 @@ class GeneralSettingsPageState extends State<GeneralSettingsPage> {
),
settingToggle(
enableEncryptedPreview,
title: labelEncryptedPreview,
description:
labelEncryptedPreviewDescription("telescope.commet.chat"),
title: labelUrlPreviewInEncryptedChatTitle,
description: labelUrlPreviewInEncryptedChatDescription,
onChanged: (value) async {
setState(() {
enableEncryptedPreview = value;
Expand Down
17 changes: 0 additions & 17 deletions commet/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.0"
basic_utils:
dependency: transitive
description:
name: basic_utils
sha256: "2064b21d3c41ed7654bc82cc476fd65542e04d60059b74d5eed490a4da08fc6c"
url: "https://pub.dev"
source: hosted
version: "5.7.0"
blurhash_dart:
dependency: transitive
description:
Expand Down Expand Up @@ -375,15 +367,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.0.3"
encrypted_url_preview:
dependency: "direct main"
description:
path: "."
ref: HEAD
resolved-ref: "38ae4d905739237277decea9c564d7b7ebf2d52e"
url: "https://github.com/commetchat/encrypted_url_preview.git"
source: git
version: "1.0.0"
enhanced_enum:
dependency: transitive
description:
Expand Down
3 changes: 1 addition & 2 deletions commet/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,7 @@ dependencies:
ref: main
matrix_dart_sdk_drift_db:
git: https://github.com/commetchat/matrix-dart-sdk-drift-db.git
encrypted_url_preview:
git: https://github.com/commetchat/encrypted_url_preview.git

signal_sticker_api:
git: https://github.com/commetchat/signal-sticker-api.git
starfield:
Expand Down