Skip to content
Draft
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
Expand Up @@ -2,6 +2,7 @@ import 'dart:convert';

import 'package:commet/client/components/voip/voip_session.dart';
import 'package:commet/client/components/voip/webrtc_default_devices.dart';
import 'package:commet/client/matrix/components/voip_room/matrix_livekit_encryption_key_provider.dart';
import 'package:commet/client/matrix/components/voip_room/matrix_livekit_voip_session.dart';
import 'package:commet/client/matrix/components/voip_room/matrix_voip_room_component.dart';
import 'package:commet/client/matrix/matrix_room.dart';
Expand Down Expand Up @@ -139,13 +140,21 @@ class MatrixLivekitBackend {
final sfuUrl = data["url"];
Log.d("Got sfu: ${sfuUrl}");
final jwt = data["jwt"];
lk.E2EEOptions? e2eeOptions;

var provider =
await MatrixLivekitEncryptionKeyProvider.create(room.matrixRoom);
if (room.isE2EE) {
e2eeOptions = lk.E2EEOptions(keyProvider: provider);
}

final roomOptions = lk.RoomOptions(
adaptiveStream: true,
dynacast: true,
);
adaptiveStream: true, dynacast: true, encryption: e2eeOptions);

final lkRoom = lk.Room(roomOptions: roomOptions);

provider.lkRoom = lkRoom;

await lkRoom.prepareConnection(sfuUrl, jwt);
final stateKey =
"_${room.client.self!.identifier}_${room.matrixRoom.client.deviceID!}_m.call";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import 'dart:convert';
import 'dart:typed_data';

import 'package:commet/debug/log.dart';
import 'package:livekit_client/livekit_client.dart' hide KeyProvider;
import 'package:webrtc_interface/src/frame_cryptor.dart';

import 'package:matrix/matrix.dart' as mx;

import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;

class MatrixLivekitEncryptionKeyProvider implements BaseKeyProvider {
mx.Room room;
Room? lkRoom;

BaseKeyProvider _keyProvider;

MatrixLivekitEncryptionKeyProvider(this._keyProvider, this.room) {
room.client.onToDeviceEvent.stream.listen(onToDeviceEvent);
}

static Future<MatrixLivekitEncryptionKeyProvider> create(mx.Room room) async {
final rtc.KeyProviderOptions options = rtc.KeyProviderOptions(
sharedKey: false,
ratchetSalt: Uint8List.fromList(defaultRatchetSalt.codeUnits),
ratchetWindowSize: 10,
uncryptedMagicBytes: Uint8List.fromList(defaultMagicBytes.codeUnits),
failureTolerance: -1,
keyRingSize: 256,
keyDerivationAlgorithm: KeyDerivationAlgorithm.kHKDF,
discardFrameWhenCryptorNotReady:
defaultDiscardFrameWhenCryptorNotReady);

final keyProvider =
await rtc.frameCryptorFactory.createDefaultKeyProvider(options);

var provider = BaseKeyProvider(keyProvider, options);

Log.i("Created livekit encryption key provider");

return MatrixLivekitEncryptionKeyProvider(provider, room);
}

@override
Future<Uint8List> exportKey(String participantId, int? keyIndex) {
return _keyProvider.exportKey(participantId, keyIndex);
}

@override
Future<Uint8List> exportSharedKey({int? keyIndex}) {
return _keyProvider.exportSharedKey(keyIndex: keyIndex);
}

@override
int getLatestIndex(String participantId) {
return _keyProvider.getLatestIndex(participantId);
}

@override
KeyProvider get keyProvider => _keyProvider.keyProvider;

@override
KeyProviderOptions get options => _keyProvider.options;

@override
Future<Uint8List> ratchetKey(String participantId, int? keyIndex) {
return _keyProvider.ratchetKey(participantId, keyIndex);
}

@override
Future<Uint8List> ratchetSharedKey({int? keyIndex}) {
return _keyProvider.ratchetSharedKey(keyIndex: keyIndex);
}

@override
Future<void> setKey(String key, {String? participantId, int? keyIndex}) {
return _keyProvider.setKey(key,
participantId: participantId, keyIndex: keyIndex);
}

@override
Future<void> setRawKey(Uint8List key,
{String? participantId, int? keyIndex}) {
return _keyProvider.setRawKey(key,
participantId: participantId, keyIndex: keyIndex);
}

@override
Future<void> setSharedKey(String key, {int? keyIndex}) {
return _keyProvider.setSharedKey(key, keyIndex: keyIndex);
}

@override
Future<void> setSifTrailer(Uint8List trailer) {
return _keyProvider.setSifTrailer(trailer);
}

@override
Uint8List? get sharedKey => _keyProvider.sharedKey;

void onToDeviceEvent(mx.ToDeviceEvent event) {
Log.i(
"Received to device event: ${event.toJson()}",
);

if (event.type == "io.element.call.encryption_keys") {
var data = event.content["keys"] as Map<String, dynamic>;
Log.i("Setting encryption key");
Log.i(data);

var index = data["index"];
var key = data["key"] as String;

var b = base64Decode(key);

var deviceId = (event.content["member"]
as Map<String, dynamic>)["claimed_device_id"] as String;

var participantId = event.senderId + ":" + deviceId;

Log.i("Particpant: $participantId");

setRawKey(b, participantId: participantId, keyIndex: index);
}
}
}
1 change: 0 additions & 1 deletion commet/lib/debug/log.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ class Log {
}
},
errorCallback: (self, parent, zone, error, stackTrace) {
parent.print(zone, "ERROR CALLBACK");
parent.print(zone, error.toString());
parent.print(zone, stackTrace?.toString() ?? "");
String? info =
Expand Down
7 changes: 7 additions & 0 deletions commet/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';
import 'package:logging/logging.dart';
import 'package:media_kit/media_kit.dart';
import 'package:provider/provider.dart';
import 'package:receive_intent/receive_intent.dart';
Expand Down Expand Up @@ -135,6 +136,12 @@ void main(List<String> args) async {
return;
}

final format = DateFormat('HH:mm:ss');
Logger.root.level = Level.FINE;
Logger.root.onRecord.listen((record) {
print('${format.format(record.time)} ${record.level} : ${record.message}');
});

if (BuildConfig.RELEASE) {
runZonedGuarded(appMain, Log.onError, zoneSpecification: Log.spec);
} else {
Expand Down
4 changes: 1 addition & 3 deletions commet/lib/ui/organisms/voip_room_view/voip_room_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,7 @@ class _VoipRoomViewState extends State<VoipRoomView> {
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: widget.voip.room.isE2EE && BuildConfig.RELEASE
? e2eeUnsupportedView()
: joinCallView(),
child: joinCallView(),
),
Align(
alignment: AlignmentGeometry.bottomLeft,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:signal_sticker_api/signal_sticker_api.dart';

import 'package:tiamat/atoms/panel.dart';

import 'package:path/path.dart' as p;
Expand Down Expand Up @@ -131,10 +131,8 @@ class _EmoticonBulkImportDialogState extends State<EmoticonBulkImportDialog> {
}

Future<void> loadSignalPack(Uri uri) async {
var client = SignalStickerClient(
host: preferences.proxyUrl.value,
rootPath: "/proxy/signal",
useHttps: false);
dynamic client = null;

var packInfo = client.getPackFromUri(uri);
var pack = await client.getPack(packInfo!);
_packNameEditor.text = pack!.name;
Expand Down
12 changes: 5 additions & 7 deletions commet/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ dependencies:
crypto: ^3.0.2
desktop_drop: ^0.4.1
desktop_notifications: ^0.6.3
device_info_plus: ^11.3.0
device_info_plus: ^12.2.0
flutter_background_service: ^5.0.5
flutter_blurhash: ^0.8.2
flutter_markdown: ^0.6.9+1
Expand Down Expand Up @@ -74,10 +74,6 @@ dependencies:
url: https://github.com/commetchat/matrix-dart-sdk-drift-db.git
ref: upstream-v6.1.1+patch.1

signal_sticker_api:
git:
url: https://github.com/commetchat/signal-sticker-api.git
ref: f3295318c27d420f195e00164f104ead9aaa6209
starfield:
git: https://github.com/lagmachine-com/starfield.git
sqlite3_flutter_libs: ^0.5.23
Expand All @@ -86,8 +82,8 @@ dependencies:
archive: ^3.6.1
exif: ^3.3.0
image: ^4.2.0
livekit_client: ^2.5.1
flutter_webrtc: ^1.2.0
livekit_client: 2.7.0
flutter_webrtc: 1.4.0
file_picker: ^10.2.0
flutter_web_auth_2: ^4.1.0
receive_intent:
Expand Down Expand Up @@ -120,10 +116,12 @@ dependencies:
canonical_json: ^1.1.2
cryptography: ^2.9.0
crop_image: ^1.0.17
logging: ^1.3.0
dart_ipc: ^1.0.1
dbus: ^0.7.11
hotkey_manager: ^0.2.3
launcher_entry: ^0.1.1

dependency_overrides:
analyzer: ^7.3.0

Expand Down
Loading
Loading