From e69870ea144d45afa14b4e085c411637042ecda2 Mon Sep 17 00:00:00 2001 From: otsmr Date: Fri, 30 May 2025 21:43:55 +0200 Subject: [PATCH] clean code --- lib/src/constants/secure_storage_keys.dart | 4 + .../signal/connect_signed_pre_key_store.dart | 37 +++- lib/src/model/json/userdata.dart | 2 + lib/src/model/json/userdata.g.dart | 9 +- .../protobuf/api/client_to_server.pb.dart | 166 +++++++++++++++++- .../protobuf/api/client_to_server.pbjson.dart | 75 +++++--- lib/src/model/protobuf/api/error.pbenum.dart | 2 + lib/src/model/protobuf/api/error.pbjson.dart | 4 +- .../protobuf/api/server_to_client.pb.dart | 98 ++++++++++- .../protobuf/api/server_to_client.pbjson.dart | 76 ++++---- lib/src/services/api.service.dart | 17 +- lib/src/services/api/server_messages.dart | 2 +- lib/src/services/signal/consts.signal.dart | 2 + .../services/signal/encryption.signal.dart | 72 +++++++- lib/src/services/signal/identity.signal.dart | 98 +++++++++-- lib/src/services/signal/session.signal.dart | 47 +++-- lib/src/services/signal/utils.signal.dart | 12 -- 17 files changed, 609 insertions(+), 114 deletions(-) create mode 100644 lib/src/constants/secure_storage_keys.dart create mode 100644 lib/src/services/signal/consts.signal.dart diff --git a/lib/src/constants/secure_storage_keys.dart b/lib/src/constants/secure_storage_keys.dart new file mode 100644 index 0000000..035f397 --- /dev/null +++ b/lib/src/constants/secure_storage_keys.dart @@ -0,0 +1,4 @@ +class SecureStorageKeys { + static const String signalIdentity = "signal_identity"; + static const String signalSignedPreKey = "signed_pre_key_store"; +} diff --git a/lib/src/database/signal/connect_signed_pre_key_store.dart b/lib/src/database/signal/connect_signed_pre_key_store.dart index 7f7b63b..2d7e5fd 100644 --- a/lib/src/database/signal/connect_signed_pre_key_store.dart +++ b/lib/src/database/signal/connect_signed_pre_key_store.dart @@ -3,13 +3,14 @@ import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; +import 'package:twonly/src/constants/secure_storage_keys.dart'; class ConnectSignedPreKeyStore extends SignedPreKeyStore { - // final store = HashMap(); - Future> getStore() async { final storage = FlutterSecureStorage(); - final storeSerialized = await storage.read(key: "signed_pre_key_store"); + final storeSerialized = await storage.read( + key: SecureStorageKeys.signalSignedPreKey, + ); var store = HashMap(); if (storeSerialized == null) { return store; @@ -21,6 +22,24 @@ class ConnectSignedPreKeyStore extends SignedPreKeyStore { return store; } + Future getNextKeyId() async { + final storage = FlutterSecureStorage(); + final storeSerialized = await storage.read( + key: SecureStorageKeys.signalSignedPreKey, + ); + if (storeSerialized == null) { + return 0; + } + final storeHashMap = json.decode(storeSerialized); + var maxKeyId = 0; + for (final item in storeHashMap) { + if (maxKeyId < item[0]) { + maxKeyId = item[0]; + } + } + return maxKeyId + 1; + } + Future safeStore(HashMap store) async { final storage = FlutterSecureStorage(); var storeHashMap = []; @@ -28,7 +47,10 @@ class ConnectSignedPreKeyStore extends SignedPreKeyStore { storeHashMap.add([item.key, base64Encode(item.value)]); } final storeSerialized = json.encode(storeHashMap); - await storage.write(key: "signed_pre_key_store", value: storeSerialized); + await storage.write( + key: SecureStorageKeys.signalSignedPreKey, + value: storeSerialized, + ); } @override @@ -36,7 +58,8 @@ class ConnectSignedPreKeyStore extends SignedPreKeyStore { final store = await getStore(); if (!store.containsKey(signedPreKeyId)) { throw InvalidKeyIdException( - 'No such signedprekeyrecord! $signedPreKeyId'); + 'No such signed prekey record! $signedPreKeyId', + ); } return SignedPreKeyRecord.fromSerialized(store[signedPreKeyId]!); } @@ -53,7 +76,9 @@ class ConnectSignedPreKeyStore extends SignedPreKeyStore { @override Future storeSignedPreKey( - int signedPreKeyId, SignedPreKeyRecord record) async { + int signedPreKeyId, + SignedPreKeyRecord record, + ) async { final store = await getStore(); store[signedPreKeyId] = record.serialize(); await safeStore(store); diff --git a/lib/src/model/json/userdata.dart b/lib/src/model/json/userdata.dart index 999a717..24da2d7 100644 --- a/lib/src/model/json/userdata.dart +++ b/lib/src/model/json/userdata.dart @@ -36,6 +36,8 @@ class UserData { int? myBestFriendContactId; + DateTime? signalLastSignedPreKeyUpdated; + final int userId; factory UserData.fromJson(Map json) => diff --git a/lib/src/model/json/userdata.g.dart b/lib/src/model/json/userdata.g.dart index 371c8fc..2ebfae2 100644 --- a/lib/src/model/json/userdata.g.dart +++ b/lib/src/model/json/userdata.g.dart @@ -36,8 +36,11 @@ UserData _$UserDataFromJson(Map json) => UserData( ? null : DateTime.parse(json['lastImageSend'] as String) ..todaysImageCounter = (json['todaysImageCounter'] as num?)?.toInt() - ..myBestFriendContactId = - (json['myBestFriendContactId'] as num?)?.toInt(); + ..myBestFriendContactId = (json['myBestFriendContactId'] as num?)?.toInt() + ..signalLastSignedPreKeyUpdated = + json['signalLastSignedPreKeyUpdated'] == null + ? null + : DateTime.parse(json['signalLastSignedPreKeyUpdated'] as String); Map _$UserDataToJson(UserData instance) => { 'username': instance.username, @@ -58,6 +61,8 @@ Map _$UserDataToJson(UserData instance) => { 'lastImageSend': instance.lastImageSend?.toIso8601String(), 'todaysImageCounter': instance.todaysImageCounter, 'myBestFriendContactId': instance.myBestFriendContactId, + 'signalLastSignedPreKeyUpdated': + instance.signalLastSignedPreKeyUpdated?.toIso8601String(), 'userId': instance.userId, }; diff --git a/lib/src/model/protobuf/api/client_to_server.pb.dart b/lib/src/model/protobuf/api/client_to_server.pb.dart index 441d73f..e1560e0 100644 --- a/lib/src/model/protobuf/api/client_to_server.pb.dart +++ b/lib/src/model/protobuf/api/client_to_server.pb.dart @@ -1403,6 +1403,134 @@ class ApplicationData_GetPrekeysByUserId extends $pb.GeneratedMessage { void clearUserId() => clearField(1); } +class ApplicationData_GetSignedPreKeyByUserId extends $pb.GeneratedMessage { + factory ApplicationData_GetSignedPreKeyByUserId({ + $fixnum.Int64? userId, + }) { + final $result = create(); + if (userId != null) { + $result.userId = userId; + } + return $result; + } + ApplicationData_GetSignedPreKeyByUserId._() : super(); + factory ApplicationData_GetSignedPreKeyByUserId.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ApplicationData_GetSignedPreKeyByUserId.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData.GetSignedPreKeyByUserId', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create) + ..aInt64(1, _omitFieldNames ? '' : 'userId') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ApplicationData_GetSignedPreKeyByUserId clone() => ApplicationData_GetSignedPreKeyByUserId()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ApplicationData_GetSignedPreKeyByUserId copyWith(void Function(ApplicationData_GetSignedPreKeyByUserId) updates) => super.copyWith((message) => updates(message as ApplicationData_GetSignedPreKeyByUserId)) as ApplicationData_GetSignedPreKeyByUserId; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ApplicationData_GetSignedPreKeyByUserId create() => ApplicationData_GetSignedPreKeyByUserId._(); + ApplicationData_GetSignedPreKeyByUserId createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ApplicationData_GetSignedPreKeyByUserId getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ApplicationData_GetSignedPreKeyByUserId? _defaultInstance; + + @$pb.TagNumber(1) + $fixnum.Int64 get userId => $_getI64(0); + @$pb.TagNumber(1) + set userId($fixnum.Int64 v) { $_setInt64(0, v); } + @$pb.TagNumber(1) + $core.bool hasUserId() => $_has(0); + @$pb.TagNumber(1) + void clearUserId() => clearField(1); +} + +class ApplicationData_UpdateSignedPreKey extends $pb.GeneratedMessage { + factory ApplicationData_UpdateSignedPreKey({ + $fixnum.Int64? signedPrekeyId, + $core.List<$core.int>? signedPrekey, + $core.List<$core.int>? signedPrekeySignature, + }) { + final $result = create(); + if (signedPrekeyId != null) { + $result.signedPrekeyId = signedPrekeyId; + } + if (signedPrekey != null) { + $result.signedPrekey = signedPrekey; + } + if (signedPrekeySignature != null) { + $result.signedPrekeySignature = signedPrekeySignature; + } + return $result; + } + ApplicationData_UpdateSignedPreKey._() : super(); + factory ApplicationData_UpdateSignedPreKey.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ApplicationData_UpdateSignedPreKey.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData.UpdateSignedPreKey', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create) + ..aInt64(1, _omitFieldNames ? '' : 'signedPrekeyId') + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'signedPrekey', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'signedPrekeySignature', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ApplicationData_UpdateSignedPreKey clone() => ApplicationData_UpdateSignedPreKey()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ApplicationData_UpdateSignedPreKey copyWith(void Function(ApplicationData_UpdateSignedPreKey) updates) => super.copyWith((message) => updates(message as ApplicationData_UpdateSignedPreKey)) as ApplicationData_UpdateSignedPreKey; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ApplicationData_UpdateSignedPreKey create() => ApplicationData_UpdateSignedPreKey._(); + ApplicationData_UpdateSignedPreKey createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ApplicationData_UpdateSignedPreKey getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ApplicationData_UpdateSignedPreKey? _defaultInstance; + + @$pb.TagNumber(1) + $fixnum.Int64 get signedPrekeyId => $_getI64(0); + @$pb.TagNumber(1) + set signedPrekeyId($fixnum.Int64 v) { $_setInt64(0, v); } + @$pb.TagNumber(1) + $core.bool hasSignedPrekeyId() => $_has(0); + @$pb.TagNumber(1) + void clearSignedPrekeyId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get signedPrekey => $_getN(1); + @$pb.TagNumber(2) + set signedPrekey($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasSignedPrekey() => $_has(1); + @$pb.TagNumber(2) + void clearSignedPrekey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get signedPrekeySignature => $_getN(2); + @$pb.TagNumber(3) + set signedPrekeySignature($core.List<$core.int> v) { $_setBytes(2, v); } + @$pb.TagNumber(3) + $core.bool hasSignedPrekeySignature() => $_has(2); + @$pb.TagNumber(3) + void clearSignedPrekeySignature() => clearField(3); +} + class ApplicationData_GetUploadToken extends $pb.GeneratedMessage { factory ApplicationData_GetUploadToken({ $core.int? recipientsCount, @@ -1745,6 +1873,8 @@ enum ApplicationData_ApplicationData { updateplanoptions, downloaddone, uploaddone, + getsignedprekeybyuserid, + updatesignedprekey, notSet } @@ -1771,6 +1901,8 @@ class ApplicationData extends $pb.GeneratedMessage { ApplicationData_UpdatePlanOptions? updateplanoptions, ApplicationData_DownloadDone? downloaddone, ApplicationData_UploadDone? uploaddone, + ApplicationData_GetSignedPreKeyByUserId? getsignedprekeybyuserid, + ApplicationData_UpdateSignedPreKey? updatesignedprekey, }) { final $result = create(); if (textmessage != null) { @@ -1836,6 +1968,12 @@ class ApplicationData extends $pb.GeneratedMessage { if (uploaddone != null) { $result.uploaddone = uploaddone; } + if (getsignedprekeybyuserid != null) { + $result.getsignedprekeybyuserid = getsignedprekeybyuserid; + } + if (updatesignedprekey != null) { + $result.updatesignedprekey = updatesignedprekey; + } return $result; } ApplicationData._() : super(); @@ -1864,10 +2002,12 @@ class ApplicationData extends $pb.GeneratedMessage { 19 : ApplicationData_ApplicationData.updateplanoptions, 20 : ApplicationData_ApplicationData.downloaddone, 21 : ApplicationData_ApplicationData.uploaddone, + 22 : ApplicationData_ApplicationData.getsignedprekeybyuserid, + 23 : ApplicationData_ApplicationData.updatesignedprekey, 0 : ApplicationData_ApplicationData.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create) - ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]) ..aOM(1, _omitFieldNames ? '' : 'textmessage', subBuilder: ApplicationData_TextMessage.create) ..aOM(2, _omitFieldNames ? '' : 'getuserbyusername', subBuilder: ApplicationData_GetUserByUsername.create) ..aOM(3, _omitFieldNames ? '' : 'getprekeysbyuserid', subBuilder: ApplicationData_GetPrekeysByUserId.create) @@ -1889,6 +2029,8 @@ class ApplicationData extends $pb.GeneratedMessage { ..aOM(19, _omitFieldNames ? '' : 'updateplanoptions', subBuilder: ApplicationData_UpdatePlanOptions.create) ..aOM(20, _omitFieldNames ? '' : 'downloaddone', subBuilder: ApplicationData_DownloadDone.create) ..aOM(21, _omitFieldNames ? '' : 'uploaddone', subBuilder: ApplicationData_UploadDone.create) + ..aOM(22, _omitFieldNames ? '' : 'getsignedprekeybyuserid', subBuilder: ApplicationData_GetSignedPreKeyByUserId.create) + ..aOM(23, _omitFieldNames ? '' : 'updatesignedprekey', subBuilder: ApplicationData_UpdateSignedPreKey.create) ..hasRequiredFields = false ; @@ -2146,6 +2288,28 @@ class ApplicationData extends $pb.GeneratedMessage { void clearUploaddone() => clearField(21); @$pb.TagNumber(21) ApplicationData_UploadDone ensureUploaddone() => $_ensure(20); + + @$pb.TagNumber(22) + ApplicationData_GetSignedPreKeyByUserId get getsignedprekeybyuserid => $_getN(21); + @$pb.TagNumber(22) + set getsignedprekeybyuserid(ApplicationData_GetSignedPreKeyByUserId v) { setField(22, v); } + @$pb.TagNumber(22) + $core.bool hasGetsignedprekeybyuserid() => $_has(21); + @$pb.TagNumber(22) + void clearGetsignedprekeybyuserid() => clearField(22); + @$pb.TagNumber(22) + ApplicationData_GetSignedPreKeyByUserId ensureGetsignedprekeybyuserid() => $_ensure(21); + + @$pb.TagNumber(23) + ApplicationData_UpdateSignedPreKey get updatesignedprekey => $_getN(22); + @$pb.TagNumber(23) + set updatesignedprekey(ApplicationData_UpdateSignedPreKey v) { setField(23, v); } + @$pb.TagNumber(23) + $core.bool hasUpdatesignedprekey() => $_has(22); + @$pb.TagNumber(23) + void clearUpdatesignedprekey() => clearField(23); + @$pb.TagNumber(23) + ApplicationData_UpdateSignedPreKey ensureUpdatesignedprekey() => $_ensure(22); } class Response_PreKey extends $pb.GeneratedMessage { diff --git a/lib/src/model/protobuf/api/client_to_server.pbjson.dart b/lib/src/model/protobuf/api/client_to_server.pbjson.dart index 8c4a5d0..2211b82 100644 --- a/lib/src/model/protobuf/api/client_to_server.pbjson.dart +++ b/lib/src/model/protobuf/api/client_to_server.pbjson.dart @@ -157,8 +157,10 @@ const ApplicationData$json = { {'1': 'updateplanoptions', '3': 19, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UpdatePlanOptions', '9': 0, '10': 'updateplanoptions'}, {'1': 'downloaddone', '3': 20, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.DownloadDone', '9': 0, '10': 'downloaddone'}, {'1': 'uploaddone', '3': 21, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UploadDone', '9': 0, '10': 'uploaddone'}, + {'1': 'getsignedprekeybyuserid', '3': 22, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.GetSignedPreKeyByUserId', '9': 0, '10': 'getsignedprekeybyuserid'}, + {'1': 'updatesignedprekey', '3': 23, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UpdateSignedPreKey', '9': 0, '10': 'updatesignedprekey'}, ], - '3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_UpdateGoogleFcmToken$json, ApplicationData_GetUserById$json, ApplicationData_RedeemVoucher$json, ApplicationData_SwitchToPayedPlan$json, ApplicationData_UpdatePlanOptions$json, ApplicationData_CreateVoucher$json, ApplicationData_GetLocation$json, ApplicationData_GetVouchers$json, ApplicationData_GetAvailablePlans$json, ApplicationData_GetAddAccountsInvites$json, ApplicationData_GetCurrentPlanInfos$json, ApplicationData_RedeemAdditionalCode$json, ApplicationData_RemoveAdditionalUser$json, ApplicationData_GetPrekeysByUserId$json, ApplicationData_GetUploadToken$json, ApplicationData_UploadData$json, ApplicationData_UploadDone$json, ApplicationData_DownloadData$json, ApplicationData_DownloadDone$json], + '3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_UpdateGoogleFcmToken$json, ApplicationData_GetUserById$json, ApplicationData_RedeemVoucher$json, ApplicationData_SwitchToPayedPlan$json, ApplicationData_UpdatePlanOptions$json, ApplicationData_CreateVoucher$json, ApplicationData_GetLocation$json, ApplicationData_GetVouchers$json, ApplicationData_GetAvailablePlans$json, ApplicationData_GetAddAccountsInvites$json, ApplicationData_GetCurrentPlanInfos$json, ApplicationData_RedeemAdditionalCode$json, ApplicationData_RemoveAdditionalUser$json, ApplicationData_GetPrekeysByUserId$json, ApplicationData_GetSignedPreKeyByUserId$json, ApplicationData_UpdateSignedPreKey$json, ApplicationData_GetUploadToken$json, ApplicationData_UploadData$json, ApplicationData_UploadDone$json, ApplicationData_DownloadData$json, ApplicationData_DownloadDone$json], '8': [ {'1': 'ApplicationData'}, ], @@ -284,6 +286,24 @@ const ApplicationData_GetPrekeysByUserId$json = { ], }; +@$core.Deprecated('Use applicationDataDescriptor instead') +const ApplicationData_GetSignedPreKeyByUserId$json = { + '1': 'GetSignedPreKeyByUserId', + '2': [ + {'1': 'user_id', '3': 1, '4': 1, '5': 3, '10': 'userId'}, + ], +}; + +@$core.Deprecated('Use applicationDataDescriptor instead') +const ApplicationData_UpdateSignedPreKey$json = { + '1': 'UpdateSignedPreKey', + '2': [ + {'1': 'signed_prekey_id', '3': 1, '4': 1, '5': 3, '10': 'signedPrekeyId'}, + {'1': 'signed_prekey', '3': 2, '4': 1, '5': 12, '10': 'signedPrekey'}, + {'1': 'signed_prekey_signature', '3': 3, '4': 1, '5': 12, '10': 'signedPrekeySignature'}, + ], +}; + @$core.Deprecated('Use applicationDataDescriptor instead') const ApplicationData_GetUploadToken$json = { '1': 'GetUploadToken', @@ -370,29 +390,36 @@ final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode( 'VwbGFub3B0aW9ucxJUCgxkb3dubG9hZGRvbmUYFCABKAsyLi5jbGllbnRfdG9fc2VydmVyLkFw' 'cGxpY2F0aW9uRGF0YS5Eb3dubG9hZERvbmVIAFIMZG93bmxvYWRkb25lEk4KCnVwbG9hZGRvbm' 'UYFSABKAsyLC5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5VcGxvYWREb25lSABS' - 'CnVwbG9hZGRvbmUaagoLVGV4dE1lc3NhZ2USFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkEhIKBG' - 'JvZHkYAyABKAxSBGJvZHkSIAoJcHVzaF9kYXRhGAQgASgMSABSCHB1c2hEYXRhiAEBQgwKCl9w' - 'dXNoX2RhdGEaLwoRR2V0VXNlckJ5VXNlcm5hbWUSGgoIdXNlcm5hbWUYASABKAlSCHVzZXJuYW' - '1lGjUKFFVwZGF0ZUdvb2dsZUZjbVRva2VuEh0KCmdvb2dsZV9mY20YASABKAlSCWdvb2dsZUZj' - 'bRomCgtHZXRVc2VyQnlJZBIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQaKQoNUmVkZWVtVm91Y2' - 'hlchIYCgd2b3VjaGVyGAEgASgJUgd2b3VjaGVyGnAKEVN3aXRjaFRvUGF5ZWRQbGFuEhcKB3Bs' - 'YW5faWQYASABKAlSBnBsYW5JZBIfCgtwYXlfbW9udGhseRgCIAEoCFIKcGF5TW9udGhseRIhCg' - 'xhdXRvX3JlbmV3YWwYAyABKAhSC2F1dG9SZW5ld2FsGjYKEVVwZGF0ZVBsYW5PcHRpb25zEiEK' - 'DGF1dG9fcmVuZXdhbBgBIAEoCFILYXV0b1JlbmV3YWwaMAoNQ3JlYXRlVm91Y2hlchIfCgt2YW' - 'x1ZV9jZW50cxgBIAEoDVIKdmFsdWVDZW50cxoNCgtHZXRMb2NhdGlvbhoNCgtHZXRWb3VjaGVy' - 'cxoTChFHZXRBdmFpbGFibGVQbGFucxoXChVHZXRBZGRBY2NvdW50c0ludml0ZXMaFQoTR2V0Q3' - 'VycmVudFBsYW5JbmZvcxo3ChRSZWRlZW1BZGRpdGlvbmFsQ29kZRIfCgtpbnZpdGVfY29kZRgC' - 'IAEoCVIKaW52aXRlQ29kZRovChRSZW1vdmVBZGRpdGlvbmFsVXNlchIXCgd1c2VyX2lkGAEgAS' - 'gDUgZ1c2VySWQaLQoSR2V0UHJla2V5c0J5VXNlcklkEhcKB3VzZXJfaWQYASABKANSBnVzZXJJ' - 'ZBo7Cg5HZXRVcGxvYWRUb2tlbhIpChByZWNpcGllbnRzX2NvdW50GAEgASgNUg9yZWNpcGllbn' - 'RzQ291bnQaiQEKClVwbG9hZERhdGESIQoMdXBsb2FkX3Rva2VuGAEgASgMUgt1cGxvYWRUb2tl' - 'bhIWCgZvZmZzZXQYAiABKA1SBm9mZnNldBISCgRkYXRhGAMgASgMUgRkYXRhEh8KCGNoZWNrc3' - 'VtGAQgASgMSABSCGNoZWNrc3VtiAEBQgsKCV9jaGVja3N1bRpaCgpVcGxvYWREb25lEiEKDHVw' - 'bG9hZF90b2tlbhgBIAEoDFILdXBsb2FkVG9rZW4SKQoQcmVjaXBpZW50c19jb3VudBgCIAEoDV' - 'IPcmVjaXBpZW50c0NvdW50Gk0KDERvd25sb2FkRGF0YRIlCg5kb3dubG9hZF90b2tlbhgBIAEo' - 'DFINZG93bmxvYWRUb2tlbhIWCgZvZmZzZXQYAiABKA1SBm9mZnNldBo1CgxEb3dubG9hZERvbm' - 'USJQoOZG93bmxvYWRfdG9rZW4YASABKAxSDWRvd25sb2FkVG9rZW5CEQoPQXBwbGljYXRpb25E' - 'YXRh'); + 'CnVwbG9hZGRvbmUSdQoXZ2V0c2lnbmVkcHJla2V5Ynl1c2VyaWQYFiABKAsyOS5jbGllbnRfdG' + '9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRTaWduZWRQcmVLZXlCeVVzZXJJZEgAUhdnZXRz' + 'aWduZWRwcmVrZXlieXVzZXJpZBJmChJ1cGRhdGVzaWduZWRwcmVrZXkYFyABKAsyNC5jbGllbn' + 'RfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5VcGRhdGVTaWduZWRQcmVLZXlIAFISdXBkYXRl' + 'c2lnbmVkcHJla2V5GmoKC1RleHRNZXNzYWdlEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBISCg' + 'Rib2R5GAMgASgMUgRib2R5EiAKCXB1c2hfZGF0YRgEIAEoDEgAUghwdXNoRGF0YYgBAUIMCgpf' + 'cHVzaF9kYXRhGi8KEUdldFVzZXJCeVVzZXJuYW1lEhoKCHVzZXJuYW1lGAEgASgJUgh1c2Vybm' + 'FtZRo1ChRVcGRhdGVHb29nbGVGY21Ub2tlbhIdCgpnb29nbGVfZmNtGAEgASgJUglnb29nbGVG' + 'Y20aJgoLR2V0VXNlckJ5SWQSFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkGikKDVJlZGVlbVZvdW' + 'NoZXISGAoHdm91Y2hlchgBIAEoCVIHdm91Y2hlchpwChFTd2l0Y2hUb1BheWVkUGxhbhIXCgdw' + 'bGFuX2lkGAEgASgJUgZwbGFuSWQSHwoLcGF5X21vbnRobHkYAiABKAhSCnBheU1vbnRobHkSIQ' + 'oMYXV0b19yZW5ld2FsGAMgASgIUgthdXRvUmVuZXdhbBo2ChFVcGRhdGVQbGFuT3B0aW9ucxIh' + 'CgxhdXRvX3JlbmV3YWwYASABKAhSC2F1dG9SZW5ld2FsGjAKDUNyZWF0ZVZvdWNoZXISHwoLdm' + 'FsdWVfY2VudHMYASABKA1SCnZhbHVlQ2VudHMaDQoLR2V0TG9jYXRpb24aDQoLR2V0Vm91Y2hl' + 'cnMaEwoRR2V0QXZhaWxhYmxlUGxhbnMaFwoVR2V0QWRkQWNjb3VudHNJbnZpdGVzGhUKE0dldE' + 'N1cnJlbnRQbGFuSW5mb3MaNwoUUmVkZWVtQWRkaXRpb25hbENvZGUSHwoLaW52aXRlX2NvZGUY' + 'AiABKAlSCmludml0ZUNvZGUaLwoUUmVtb3ZlQWRkaXRpb25hbFVzZXISFwoHdXNlcl9pZBgBIA' + 'EoA1IGdXNlcklkGi0KEkdldFByZWtleXNCeVVzZXJJZBIXCgd1c2VyX2lkGAEgASgDUgZ1c2Vy' + 'SWQaMgoXR2V0U2lnbmVkUHJlS2V5QnlVc2VySWQSFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkGp' + 'sBChJVcGRhdGVTaWduZWRQcmVLZXkSKAoQc2lnbmVkX3ByZWtleV9pZBgBIAEoA1IOc2lnbmVk' + 'UHJla2V5SWQSIwoNc2lnbmVkX3ByZWtleRgCIAEoDFIMc2lnbmVkUHJla2V5EjYKF3NpZ25lZF' + '9wcmVrZXlfc2lnbmF0dXJlGAMgASgMUhVzaWduZWRQcmVrZXlTaWduYXR1cmUaOwoOR2V0VXBs' + 'b2FkVG9rZW4SKQoQcmVjaXBpZW50c19jb3VudBgBIAEoDVIPcmVjaXBpZW50c0NvdW50GokBCg' + 'pVcGxvYWREYXRhEiEKDHVwbG9hZF90b2tlbhgBIAEoDFILdXBsb2FkVG9rZW4SFgoGb2Zmc2V0' + 'GAIgASgNUgZvZmZzZXQSEgoEZGF0YRgDIAEoDFIEZGF0YRIfCghjaGVja3N1bRgEIAEoDEgAUg' + 'hjaGVja3N1bYgBAUILCglfY2hlY2tzdW0aWgoKVXBsb2FkRG9uZRIhCgx1cGxvYWRfdG9rZW4Y' + 'ASABKAxSC3VwbG9hZFRva2VuEikKEHJlY2lwaWVudHNfY291bnQYAiABKA1SD3JlY2lwaWVudH' + 'NDb3VudBpNCgxEb3dubG9hZERhdGESJQoOZG93bmxvYWRfdG9rZW4YASABKAxSDWRvd25sb2Fk' + 'VG9rZW4SFgoGb2Zmc2V0GAIgASgNUgZvZmZzZXQaNQoMRG93bmxvYWREb25lEiUKDmRvd25sb2' + 'FkX3Rva2VuGAEgASgMUg1kb3dubG9hZFRva2VuQhEKD0FwcGxpY2F0aW9uRGF0YQ=='); @$core.Deprecated('Use responseDescriptor instead') const Response$json = { diff --git a/lib/src/model/protobuf/api/error.pbenum.dart b/lib/src/model/protobuf/api/error.pbenum.dart index 4052c31..972085a 100644 --- a/lib/src/model/protobuf/api/error.pbenum.dart +++ b/lib/src/model/protobuf/api/error.pbenum.dart @@ -43,6 +43,7 @@ class ErrorCode extends $pb.ProtobufEnum { static const ErrorCode NotEnoughCredit = ErrorCode._(1024, _omitEnumNames ? '' : 'NotEnoughCredit'); static const ErrorCode PlanDowngrade = ErrorCode._(1025, _omitEnumNames ? '' : 'PlanDowngrade'); static const ErrorCode PlanUpgradeNotYearly = ErrorCode._(1026, _omitEnumNames ? '' : 'PlanUpgradeNotYearly'); + static const ErrorCode InvalidSignedPreKey = ErrorCode._(1027, _omitEnumNames ? '' : 'InvalidSignedPreKey'); static const $core.List values = [ Unknown, @@ -74,6 +75,7 @@ class ErrorCode extends $pb.ProtobufEnum { NotEnoughCredit, PlanDowngrade, PlanUpgradeNotYearly, + InvalidSignedPreKey, ]; static final $core.Map<$core.int, ErrorCode> _byValue = $pb.ProtobufEnum.initByValue(values); diff --git a/lib/src/model/protobuf/api/error.pbjson.dart b/lib/src/model/protobuf/api/error.pbjson.dart index 1923e25..c721fc6 100644 --- a/lib/src/model/protobuf/api/error.pbjson.dart +++ b/lib/src/model/protobuf/api/error.pbjson.dart @@ -46,6 +46,7 @@ const ErrorCode$json = { {'1': 'NotEnoughCredit', '2': 1024}, {'1': 'PlanDowngrade', '2': 1025}, {'1': 'PlanUpgradeNotYearly', '2': 1026}, + {'1': 'InvalidSignedPreKey', '2': 1027}, ], }; @@ -63,5 +64,6 @@ final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode( '4Q+QcSGAoTQXBpRW5kcG9pbnROb3RGb3VuZBD6BxIWChFBdXRoVG9rZW5Ob3RWYWxpZBD7BxIT' 'Cg5JbnZhbGlkUHJlS2V5cxD8BxITCg5Wb3VjaGVySW5WYWxpZBD9BxITCg5QbGFuTm90QWxsb3' 'dlZBD+BxIVChBQbGFuTGltaXRSZWFjaGVkEP8HEhQKD05vdEVub3VnaENyZWRpdBCACBISCg1Q' - 'bGFuRG93bmdyYWRlEIEIEhkKFFBsYW5VcGdyYWRlTm90WWVhcmx5EIII'); + 'bGFuRG93bmdyYWRlEIEIEhkKFFBsYW5VcGdyYWRlTm90WWVhcmx5EIIIEhgKE0ludmFsaWRTaW' + 'duZWRQcmVLZXkQgwg='); diff --git a/lib/src/model/protobuf/api/server_to_client.pb.dart b/lib/src/model/protobuf/api/server_to_client.pb.dart index 6443955..df6db0f 100644 --- a/lib/src/model/protobuf/api/server_to_client.pb.dart +++ b/lib/src/model/protobuf/api/server_to_client.pb.dart @@ -1338,6 +1338,84 @@ class Response_PreKey extends $pb.GeneratedMessage { void clearPrekey() => clearField(2); } +class Response_SignedPreKey extends $pb.GeneratedMessage { + factory Response_SignedPreKey({ + $fixnum.Int64? signedPrekeyId, + $core.List<$core.int>? signedPrekey, + $core.List<$core.int>? signedPrekeySignature, + }) { + final $result = create(); + if (signedPrekeyId != null) { + $result.signedPrekeyId = signedPrekeyId; + } + if (signedPrekey != null) { + $result.signedPrekey = signedPrekey; + } + if (signedPrekeySignature != null) { + $result.signedPrekeySignature = signedPrekeySignature; + } + return $result; + } + Response_SignedPreKey._() : super(); + factory Response_SignedPreKey.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Response_SignedPreKey.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.SignedPreKey', package: const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'), createEmptyInstance: create) + ..aInt64(1, _omitFieldNames ? '' : 'signedPrekeyId') + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'signedPrekey', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'signedPrekeySignature', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Response_SignedPreKey clone() => Response_SignedPreKey()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Response_SignedPreKey copyWith(void Function(Response_SignedPreKey) updates) => super.copyWith((message) => updates(message as Response_SignedPreKey)) as Response_SignedPreKey; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Response_SignedPreKey create() => Response_SignedPreKey._(); + Response_SignedPreKey createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Response_SignedPreKey getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Response_SignedPreKey? _defaultInstance; + + @$pb.TagNumber(1) + $fixnum.Int64 get signedPrekeyId => $_getI64(0); + @$pb.TagNumber(1) + set signedPrekeyId($fixnum.Int64 v) { $_setInt64(0, v); } + @$pb.TagNumber(1) + $core.bool hasSignedPrekeyId() => $_has(0); + @$pb.TagNumber(1) + void clearSignedPrekeyId() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get signedPrekey => $_getN(1); + @$pb.TagNumber(2) + set signedPrekey($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasSignedPrekey() => $_has(1); + @$pb.TagNumber(2) + void clearSignedPrekey() => clearField(2); + + @$pb.TagNumber(3) + $core.List<$core.int> get signedPrekeySignature => $_getN(2); + @$pb.TagNumber(3) + set signedPrekeySignature($core.List<$core.int> v) { $_setBytes(2, v); } + @$pb.TagNumber(3) + $core.bool hasSignedPrekeySignature() => $_has(2); + @$pb.TagNumber(3) + void clearSignedPrekeySignature() => clearField(3); +} + class Response_UserData extends $pb.GeneratedMessage { factory Response_UserData({ $fixnum.Int64? userId, @@ -1582,6 +1660,7 @@ enum Response_Ok_Ok { vouchers, addaccountsinvites, downloadtokens, + signedprekey, notSet } @@ -1600,6 +1679,7 @@ class Response_Ok extends $pb.GeneratedMessage { Response_Vouchers? vouchers, Response_AddAccountsInvites? addaccountsinvites, Response_DownloadTokens? downloadtokens, + Response_SignedPreKey? signedprekey, }) { final $result = create(); if (none != null) { @@ -1641,6 +1721,9 @@ class Response_Ok extends $pb.GeneratedMessage { if (downloadtokens != null) { $result.downloadtokens = downloadtokens; } + if (signedprekey != null) { + $result.signedprekey = signedprekey; + } return $result; } Response_Ok._() : super(); @@ -1661,10 +1744,11 @@ class Response_Ok extends $pb.GeneratedMessage { 11 : Response_Ok_Ok.vouchers, 12 : Response_Ok_Ok.addaccountsinvites, 13 : Response_Ok_Ok.downloadtokens, + 14 : Response_Ok_Ok.signedprekey, 0 : Response_Ok_Ok.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.Ok', package: const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'), createEmptyInstance: create) - ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) ..aOB(1, _omitFieldNames ? '' : 'None', protoName: 'None') ..aInt64(2, _omitFieldNames ? '' : 'userid') ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'authchallenge', $pb.PbFieldType.OY) @@ -1678,6 +1762,7 @@ class Response_Ok extends $pb.GeneratedMessage { ..aOM(11, _omitFieldNames ? '' : 'vouchers', subBuilder: Response_Vouchers.create) ..aOM(12, _omitFieldNames ? '' : 'addaccountsinvites', subBuilder: Response_AddAccountsInvites.create) ..aOM(13, _omitFieldNames ? '' : 'downloadtokens', subBuilder: Response_DownloadTokens.create) + ..aOM(14, _omitFieldNames ? '' : 'signedprekey', subBuilder: Response_SignedPreKey.create) ..hasRequiredFields = false ; @@ -1839,6 +1924,17 @@ class Response_Ok extends $pb.GeneratedMessage { void clearDownloadtokens() => clearField(13); @$pb.TagNumber(13) Response_DownloadTokens ensureDownloadtokens() => $_ensure(12); + + @$pb.TagNumber(14) + Response_SignedPreKey get signedprekey => $_getN(13); + @$pb.TagNumber(14) + set signedprekey(Response_SignedPreKey v) { setField(14, v); } + @$pb.TagNumber(14) + $core.bool hasSignedprekey() => $_has(13); + @$pb.TagNumber(14) + void clearSignedprekey() => clearField(14); + @$pb.TagNumber(14) + Response_SignedPreKey ensureSignedprekey() => $_ensure(13); } enum Response_Response { diff --git a/lib/src/model/protobuf/api/server_to_client.pbjson.dart b/lib/src/model/protobuf/api/server_to_client.pbjson.dart index bd7ae35..2fe535a 100644 --- a/lib/src/model/protobuf/api/server_to_client.pbjson.dart +++ b/lib/src/model/protobuf/api/server_to_client.pbjson.dart @@ -92,7 +92,7 @@ const Response$json = { {'1': 'ok', '3': 1, '4': 1, '5': 11, '6': '.server_to_client.Response.Ok', '9': 0, '10': 'ok'}, {'1': 'error', '3': 2, '4': 1, '5': 14, '6': '.error.ErrorCode', '9': 0, '10': 'error'}, ], - '3': [Response_Authenticated$json, Response_Plan$json, Response_Plans$json, Response_AddAccountsInvite$json, Response_AddAccountsInvites$json, Response_Transaction$json, Response_AdditionalAccount$json, Response_Voucher$json, Response_Vouchers$json, Response_PlanBallance$json, Response_Location$json, Response_PreKey$json, Response_UserData$json, Response_UploadToken$json, Response_DownloadTokens$json, Response_Ok$json], + '3': [Response_Authenticated$json, Response_Plan$json, Response_Plans$json, Response_AddAccountsInvite$json, Response_AddAccountsInvites$json, Response_Transaction$json, Response_AdditionalAccount$json, Response_Voucher$json, Response_Vouchers$json, Response_PlanBallance$json, Response_Location$json, Response_PreKey$json, Response_SignedPreKey$json, Response_UserData$json, Response_UploadToken$json, Response_DownloadTokens$json, Response_Ok$json], '4': [Response_TransactionTypes$json], '8': [ {'1': 'Response'}, @@ -228,6 +228,16 @@ const Response_PreKey$json = { ], }; +@$core.Deprecated('Use responseDescriptor instead') +const Response_SignedPreKey$json = { + '1': 'SignedPreKey', + '2': [ + {'1': 'signed_prekey_id', '3': 1, '4': 1, '5': 3, '10': 'signedPrekeyId'}, + {'1': 'signed_prekey', '3': 2, '4': 1, '5': 12, '10': 'signedPrekey'}, + {'1': 'signed_prekey_signature', '3': 3, '4': 1, '5': 12, '10': 'signedPrekeySignature'}, + ], +}; + @$core.Deprecated('Use responseDescriptor instead') const Response_UserData$json = { '1': 'UserData', @@ -283,6 +293,7 @@ const Response_Ok$json = { {'1': 'vouchers', '3': 11, '4': 1, '5': 11, '6': '.server_to_client.Response.Vouchers', '9': 0, '10': 'vouchers'}, {'1': 'addaccountsinvites', '3': 12, '4': 1, '5': 11, '6': '.server_to_client.Response.AddAccountsInvites', '9': 0, '10': 'addaccountsinvites'}, {'1': 'downloadtokens', '3': 13, '4': 1, '5': 11, '6': '.server_to_client.Response.DownloadTokens', '9': 0, '10': 'downloadtokens'}, + {'1': 'signedprekey', '3': 14, '4': 1, '5': 11, '6': '.server_to_client.Response.SignedPreKey', '9': 0, '10': 'signedprekey'}, ], '8': [ {'1': 'Ok'}, @@ -346,33 +357,38 @@ final $typed_data.Uint8List responseDescriptor = $convert.base64Decode( '1lbnRfZG9uZV91bml4X3RpbWVzdGFtcEIPCg1fYXV0b19yZW5ld2FsQh4KHF9hZGRpdGlvbmFs' 'X2FjY291bnRfb3duZXJfaWQaTgoITG9jYXRpb24SFgoGY291bnR5GAEgASgJUgZjb3VudHkSFg' 'oGcmVnaW9uGAIgASgJUgZyZWdpb24SEgoEY2l0eRgDIAEoCVIEY2l0eRowCgZQcmVLZXkSDgoC' - 'aWQYASABKANSAmlkEhYKBnByZWtleRgCIAEoDFIGcHJla2V5GrQDCghVc2VyRGF0YRIXCgd1c2' - 'VyX2lkGAEgASgDUgZ1c2VySWQSOwoHcHJla2V5cxgCIAMoCzIhLnNlcnZlcl90b19jbGllbnQu' - 'UmVzcG9uc2UuUHJlS2V5UgdwcmVrZXlzEh8KCHVzZXJuYW1lGAcgASgMSABSCHVzZXJuYW1liA' - 'EBEjMKE3B1YmxpY19pZGVudGl0eV9rZXkYAyABKAxIAVIRcHVibGljSWRlbnRpdHlLZXmIAQES' - 'KAoNc2lnbmVkX3ByZWtleRgEIAEoDEgCUgxzaWduZWRQcmVrZXmIAQESOwoXc2lnbmVkX3ByZW' - 'tleV9zaWduYXR1cmUYBSABKAxIA1IVc2lnbmVkUHJla2V5U2lnbmF0dXJliAEBEi0KEHNpZ25l' - 'ZF9wcmVrZXlfaWQYBiABKANIBFIOc2lnbmVkUHJla2V5SWSIAQFCCwoJX3VzZXJuYW1lQhYKFF' - '9wdWJsaWNfaWRlbnRpdHlfa2V5QhAKDl9zaWduZWRfcHJla2V5QhoKGF9zaWduZWRfcHJla2V5' - 'X3NpZ25hdHVyZUITChFfc2lnbmVkX3ByZWtleV9pZBpZCgtVcGxvYWRUb2tlbhIhCgx1cGxvYW' - 'RfdG9rZW4YASABKAxSC3VwbG9hZFRva2VuEicKD2Rvd25sb2FkX3Rva2VucxgCIAMoDFIOZG93' - 'bmxvYWRUb2tlbnMaOQoORG93bmxvYWRUb2tlbnMSJwoPZG93bmxvYWRfdG9rZW5zGAEgAygMUg' - '5kb3dubG9hZFRva2VucxqoBgoCT2sSFAoETm9uZRgBIAEoCEgAUgROb25lEhgKBnVzZXJpZBgC' - 'IAEoA0gAUgZ1c2VyaWQSJgoNYXV0aGNoYWxsZW5nZRgDIAEoDEgAUg1hdXRoY2hhbGxlbmdlEk' - 'oKC3VwbG9hZHRva2VuGAQgASgLMiYuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5VcGxvYWRU' - 'b2tlbkgAUgt1cGxvYWR0b2tlbhJBCgh1c2VyZGF0YRgFIAEoCzIjLnNlcnZlcl90b19jbGllbn' - 'QuUmVzcG9uc2UuVXNlckRhdGFIAFIIdXNlcmRhdGESHgoJYXV0aHRva2VuGAYgASgMSABSCWF1' - 'dGh0b2tlbhJBCghsb2NhdGlvbhgHIAEoCzIjLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuTG' - '9jYXRpb25IAFIIbG9jYXRpb24SUAoNYXV0aGVudGljYXRlZBgIIAEoCzIoLnNlcnZlcl90b19j' - 'bGllbnQuUmVzcG9uc2UuQXV0aGVudGljYXRlZEgAUg1hdXRoZW50aWNhdGVkEjgKBXBsYW5zGA' - 'kgASgLMiAuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5QbGFuc0gAUgVwbGFucxJNCgxwbGFu' - 'YmFsbGFuY2UYCiABKAsyJy5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlBsYW5CYWxsYW5jZU' - 'gAUgxwbGFuYmFsbGFuY2USQQoIdm91Y2hlcnMYCyABKAsyIy5zZXJ2ZXJfdG9fY2xpZW50LlJl' - 'c3BvbnNlLlZvdWNoZXJzSABSCHZvdWNoZXJzEl8KEmFkZGFjY291bnRzaW52aXRlcxgMIAEoCz' - 'ItLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuQWRkQWNjb3VudHNJbnZpdGVzSABSEmFkZGFj' - 'Y291bnRzaW52aXRlcxJTCg5kb3dubG9hZHRva2VucxgNIAEoCzIpLnNlcnZlcl90b19jbGllbn' - 'QuUmVzcG9uc2UuRG93bmxvYWRUb2tlbnNIAFIOZG93bmxvYWR0b2tlbnNCBAoCT2silgEKEFRy' - 'YW5zYWN0aW9uVHlwZXMSCgoGUmVmdW5kEAASEwoPVm91Y2hlclJlZGVlbWVkEAESEgoOVm91Y2' - 'hlckNyZWF0ZWQQAhIICgRDYXNoEAMSDwoLUGxhblVwZ3JhZGUQBBILCgdVbmtub3duEAUSFAoQ' - 'VGhhbmtzRm9yVGVzdGluZxAGEg8KC0F1dG9SZW5ld2FsEAdCCgoIUmVzcG9uc2U='); + 'aWQYASABKANSAmlkEhYKBnByZWtleRgCIAEoDFIGcHJla2V5GpUBCgxTaWduZWRQcmVLZXkSKA' + 'oQc2lnbmVkX3ByZWtleV9pZBgBIAEoA1IOc2lnbmVkUHJla2V5SWQSIwoNc2lnbmVkX3ByZWtl' + 'eRgCIAEoDFIMc2lnbmVkUHJla2V5EjYKF3NpZ25lZF9wcmVrZXlfc2lnbmF0dXJlGAMgASgMUh' + 'VzaWduZWRQcmVrZXlTaWduYXR1cmUatAMKCFVzZXJEYXRhEhcKB3VzZXJfaWQYASABKANSBnVz' + 'ZXJJZBI7CgdwcmVrZXlzGAIgAygLMiEuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5QcmVLZX' + 'lSB3ByZWtleXMSHwoIdXNlcm5hbWUYByABKAxIAFIIdXNlcm5hbWWIAQESMwoTcHVibGljX2lk' + 'ZW50aXR5X2tleRgDIAEoDEgBUhFwdWJsaWNJZGVudGl0eUtleYgBARIoCg1zaWduZWRfcHJla2' + 'V5GAQgASgMSAJSDHNpZ25lZFByZWtleYgBARI7ChdzaWduZWRfcHJla2V5X3NpZ25hdHVyZRgF' + 'IAEoDEgDUhVzaWduZWRQcmVrZXlTaWduYXR1cmWIAQESLQoQc2lnbmVkX3ByZWtleV9pZBgGIA' + 'EoA0gEUg5zaWduZWRQcmVrZXlJZIgBAUILCglfdXNlcm5hbWVCFgoUX3B1YmxpY19pZGVudGl0' + 'eV9rZXlCEAoOX3NpZ25lZF9wcmVrZXlCGgoYX3NpZ25lZF9wcmVrZXlfc2lnbmF0dXJlQhMKEV' + '9zaWduZWRfcHJla2V5X2lkGlkKC1VwbG9hZFRva2VuEiEKDHVwbG9hZF90b2tlbhgBIAEoDFIL' + 'dXBsb2FkVG9rZW4SJwoPZG93bmxvYWRfdG9rZW5zGAIgAygMUg5kb3dubG9hZFRva2Vucxo5Cg' + '5Eb3dubG9hZFRva2VucxInCg9kb3dubG9hZF90b2tlbnMYASADKAxSDmRvd25sb2FkVG9rZW5z' + 'GvcGCgJPaxIUCgROb25lGAEgASgISABSBE5vbmUSGAoGdXNlcmlkGAIgASgDSABSBnVzZXJpZB' + 'ImCg1hdXRoY2hhbGxlbmdlGAMgASgMSABSDWF1dGhjaGFsbGVuZ2USSgoLdXBsb2FkdG9rZW4Y' + 'BCABKAsyJi5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlVwbG9hZFRva2VuSABSC3VwbG9hZH' + 'Rva2VuEkEKCHVzZXJkYXRhGAUgASgLMiMuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5Vc2Vy' + 'RGF0YUgAUgh1c2VyZGF0YRIeCglhdXRodG9rZW4YBiABKAxIAFIJYXV0aHRva2VuEkEKCGxvY2' + 'F0aW9uGAcgASgLMiMuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5Mb2NhdGlvbkgAUghsb2Nh' + 'dGlvbhJQCg1hdXRoZW50aWNhdGVkGAggASgLMiguc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS' + '5BdXRoZW50aWNhdGVkSABSDWF1dGhlbnRpY2F0ZWQSOAoFcGxhbnMYCSABKAsyIC5zZXJ2ZXJf' + 'dG9fY2xpZW50LlJlc3BvbnNlLlBsYW5zSABSBXBsYW5zEk0KDHBsYW5iYWxsYW5jZRgKIAEoCz' + 'InLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuUGxhbkJhbGxhbmNlSABSDHBsYW5iYWxsYW5j' + 'ZRJBCgh2b3VjaGVycxgLIAEoCzIjLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuVm91Y2hlcn' + 'NIAFIIdm91Y2hlcnMSXwoSYWRkYWNjb3VudHNpbnZpdGVzGAwgASgLMi0uc2VydmVyX3RvX2Ns' + 'aWVudC5SZXNwb25zZS5BZGRBY2NvdW50c0ludml0ZXNIAFISYWRkYWNjb3VudHNpbnZpdGVzEl' + 'MKDmRvd25sb2FkdG9rZW5zGA0gASgLMikuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5Eb3du' + 'bG9hZFRva2Vuc0gAUg5kb3dubG9hZHRva2VucxJNCgxzaWduZWRwcmVrZXkYDiABKAsyJy5zZX' + 'J2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlNpZ25lZFByZUtleUgAUgxzaWduZWRwcmVrZXlCBAoC' + 'T2silgEKEFRyYW5zYWN0aW9uVHlwZXMSCgoGUmVmdW5kEAASEwoPVm91Y2hlclJlZGVlbWVkEA' + 'ESEgoOVm91Y2hlckNyZWF0ZWQQAhIICgRDYXNoEAMSDwoLUGxhblVwZ3JhZGUQBBILCgdVbmtu' + 'b3duEAUSFAoQVGhhbmtzRm9yVGVzdGluZxAGEg8KC0F1dG9SZW5ld2FsEAdCCgoIUmVzcG9uc2' + 'U='); diff --git a/lib/src/services/api.service.dart b/lib/src/services/api.service.dart index ec18240..78385df 100644 --- a/lib/src/services/api.service.dart +++ b/lib/src/services/api.service.dart @@ -83,6 +83,7 @@ class ApiService { notifyContactsAboutProfileChange(); twonlyDB.markUpdated(); syncFlameCounters(); + signalHandleNewServerConnection(); } } @@ -329,7 +330,7 @@ class ApiService { final challenge = result.value.authchallenge; - final privKey = await getSignalPrivateIdentityKey(); + final privKey = (await getSignalIdentityKeyPair())?.getPrivateKey(); if (privKey == null) return; final random = getRandomUint8List(32); final signature = sign(privKey.serialize(), challenge, random); @@ -544,6 +545,20 @@ class ApiService { return await sendRequestSync(req); } + Future updateSignedPreKey( + int signedPreKeyId, + Uint8List signedPreKey, + Uint8List signedPreKeySignature, + ) async { + var get = ApplicationData_UpdateSignedPreKey() + ..signedPrekeyId = Int64(signedPreKeyId) + ..signedPrekey = signedPreKey + ..signedPrekeySignature = signedPreKeySignature; + var appData = ApplicationData()..updatesignedprekey = get; + var req = createClientToServerFromApplicationData(appData); + return await sendRequestSync(req); + } + Future sendTextMessage( int target, Uint8List msg, List? pushData) async { var testMessage = ApplicationData_TextMessage() diff --git a/lib/src/services/api/server_messages.dart b/lib/src/services/api/server_messages.dart index ebfba91..f727d5b 100644 --- a/lib/src/services/api/server_messages.dart +++ b/lib/src/services/api/server_messages.dart @@ -19,7 +19,7 @@ import 'package:twonly/src/services/api/utils.dart'; import 'package:twonly/src/services/api/media_received.dart'; import 'package:twonly/src/services/notification.service.dart'; import 'package:twonly/src/services/signal/encryption.signal.dart'; -import 'package:twonly/src/services/signal/utils.signal.dart'; +import 'package:twonly/src/services/signal/identity.signal.dart'; import 'package:twonly/src/utils/misc.dart'; final lockHandleServerMessage = Mutex(); diff --git a/lib/src/services/signal/consts.signal.dart b/lib/src/services/signal/consts.signal.dart new file mode 100644 index 0000000..5b85d35 --- /dev/null +++ b/lib/src/services/signal/consts.signal.dart @@ -0,0 +1,2 @@ +// multi device support is not planned, so just set this to one +const int defaultDeviceId = 1; diff --git a/lib/src/services/signal/encryption.signal.dart b/lib/src/services/signal/encryption.signal.dart index 43719f4..f5d0ea6 100644 --- a/lib/src/services/signal/encryption.signal.dart +++ b/lib/src/services/signal/encryption.signal.dart @@ -4,19 +4,85 @@ import 'dart:typed_data'; import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; import 'package:twonly/src/model/json/message.dart'; import 'package:twonly/src/database/signal/connect_signal_protocol_store.dart'; +import 'package:twonly/src/services/signal/consts.signal.dart'; import 'package:twonly/src/services/signal/utils.signal.dart'; import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/misc.dart'; +// Future deleteSession(String userId) async { +// await mixinSignalProtocolStore.sessionStore.sessionDao +// .deleteSessionsByAddress(userId); +// } + +// Future processSession(String userId, PreKeyBundle preKeyBundle) async { +// final signalProtocolAddress = SignalProtocolAddress( +// userId, +// preKeyBundle.getDeviceId(), +// ); +// final sessionBuilder = SessionBuilder.fromSignalStore( +// mixinSignalProtocolStore, +// signalProtocolAddress, +// ); +// try { +// await sessionBuilder.processPreKeyBundle(preKeyBundle); +// } on UntrustedIdentityException { +// await mixinSignalProtocolStore.removeIdentity(signalProtocolAddress); +// await sessionBuilder.processPreKeyBundle(preKeyBundle); +// } +// } + +// Future checkSignalSession(String recipientId, String sessionId) async { +// final contains = await signalProtocol.containsSession( +// recipientId, +// deviceId: sessionId.getDeviceId(), +// ); +// if (!contains) { +// final requestKeys = [ +// BlazeMessageParamSession(userId: recipientId, sessionId: sessionId), +// ]; +// final blazeMessage = createConsumeSessionSignalKeys( +// createConsumeSignalKeysParam(requestKeys), +// ); +// final data = (await signalKeysChannel(blazeMessage))?.data; +// if (data == null) { +// return false; +// } +// final keys = List.from( +// (data as List).map( +// (e) => SignalKey.fromJson(e as Map), +// ), +// ); +// if (keys.isNotEmpty) { +// final preKeyBundle = keys.first.createPreKeyBundle(); +// await signalProtocol.processSession(recipientId, preKeyBundle); +// } else { +// return false; +// } +// } +// return true; +// } + Future signalEncryptMessage(int target, MessageJson msg) async { try { ConnectSignalProtocolStore signalStore = (await getSignalStore())!; + final address = SignalProtocolAddress(target.toString(), defaultDeviceId); - SessionCipher session = SessionCipher.fromStore( - signalStore, SignalProtocolAddress(target.toString(), defaultDeviceId)); + SessionCipher session = SessionCipher.fromStore(signalStore, address); + + final SessionRecord sessionRecord = + await signalStore.sessionStore.loadSession(address); + + if (!sessionRecord.sessionState.hasUnacknowledgedPreKeyMessage()) { + Log.info("There are now pre keys any more... load new..."); + } + + // sessionRecord.sessionState.sign + + // session. final ciphertext = await session.encrypt( - Uint8List.fromList(gzip.encode(utf8.encode(jsonEncode(msg.toJson()))))); + Uint8List.fromList(gzip.encode(utf8.encode(jsonEncode(msg.toJson())))), + ); var b = BytesBuilder(); b.add(ciphertext.serialize()); diff --git a/lib/src/services/signal/identity.signal.dart b/lib/src/services/signal/identity.signal.dart index f7c1eca..e3eed5c 100644 --- a/lib/src/services/signal/identity.signal.dart +++ b/lib/src/services/signal/identity.signal.dart @@ -1,34 +1,81 @@ import 'dart:convert'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; -import 'package:logging/logging.dart'; +import 'package:twonly/globals.dart'; +import 'package:twonly/src/constants/secure_storage_keys.dart'; import 'package:twonly/src/model/json/signal_identity.dart'; import 'package:twonly/src/database/signal/connect_signal_protocol_store.dart'; +import 'package:twonly/src/model/json/userdata.dart'; +import 'package:twonly/src/services/api/utils.dart'; +import 'package:twonly/src/services/signal/consts.signal.dart'; +import 'package:twonly/src/services/signal/utils.signal.dart'; +import 'package:twonly/src/utils/log.dart'; +import 'package:twonly/src/utils/storage.dart'; -const int defaultDeviceId = 1; - -Future getSignalPrivateIdentityKey() async { +Future getSignalIdentityKeyPair() async { final signalIdentity = await getSignalIdentity(); - if (signalIdentity == null) { - return null; + if (signalIdentity == null) return null; + return IdentityKeyPair.fromSerialized(signalIdentity.identityKeyPairU8List); +} + +// This function runs after the clients authenticated with the server. +// It then checks if it should update a new session key +Future signalHandleNewServerConnection() async { + final UserData? user = await getUser(); + if (user == null) return; + if (user.signalLastSignedPreKeyUpdated != null) { + DateTime fortyEightHoursAgo = DateTime.now().subtract(Duration(hours: 48)); + bool isYoungerThan48Hours = + (user.signalLastSignedPreKeyUpdated!).isAfter(fortyEightHoursAgo); + if (isYoungerThan48Hours) { + // The key does live for 48 hours then it expires and a new key is generated. + return; + } } + SignedPreKeyRecord? signedPreKey = await _getNewSignalSignedPreKey(); + if (signedPreKey == null) { + Log.error("could not generate a new signed pre key!"); + return; + } + user.signalLastSignedPreKeyUpdated = DateTime.now(); + await updateUser(user); + Result res = await apiService.updateSignedPreKey( + signedPreKey.id, + signedPreKey.getKeyPair().publicKey.serialize(), + signedPreKey.signature, + ); + if (res.isError) { + Log.error("could not update the signed pre key: ${res.error}"); + final UserData? user = await getUser(); + if (user == null) return; + user.signalLastSignedPreKeyUpdated = null; + await updateUser(user); + } else { + Log.info("updated signed pre key"); + } +} - final IdentityKeyPair identityKeyPair = - IdentityKeyPair.fromSerialized(signalIdentity.identityKeyPairU8List); - - return identityKeyPair.getPrivateKey(); +Future> signalGetPreKeys() async { + final preKeys = generatePreKeys(0, 200); + final signalStore = await getSignalStore(); + if (signalStore == null) return []; + for (final p in preKeys) { + await signalStore.preKeyStore.storePreKey(p.id, p); + } + return preKeys; } Future getSignalIdentity() async { try { final storage = FlutterSecureStorage(); - final signalIdentityJson = await storage.read(key: "signal_identity"); + final signalIdentityJson = + await storage.read(key: SecureStorageKeys.signalIdentity); if (signalIdentityJson == null) { return null; } return SignalIdentity.fromJson(jsonDecode(signalIdentityJson)); } catch (e) { - Logger("signal.dart/getSignalIdentity").shout(e); + Log.error("could not load signal identity: $e"); return null; } } @@ -36,7 +83,10 @@ Future getSignalIdentity() async { Future createIfNotExistsSignalIdentity() async { final storage = FlutterSecureStorage(); - final signalIdentity = await storage.read(key: "signal_identity"); + final signalIdentity = await storage.read( + key: SecureStorageKeys.signalIdentity, + ); + if (signalIdentity != null) { return; } @@ -58,5 +108,25 @@ Future createIfNotExistsSignalIdentity() async { ); await storage.write( - key: "signal_identity", value: jsonEncode(storedSignalIdentity)); + key: SecureStorageKeys.signalIdentity, + value: jsonEncode(storedSignalIdentity), + ); +} + +Future _getNewSignalSignedPreKey() async { + final identityKeyPair = await getSignalIdentityKeyPair(); + if (identityKeyPair == null) return null; + final signalStore = await getSignalStore(); + if (signalStore == null) return null; + + int signedPreKeyId = await signalStore.signedPreKeyStore.getNextKeyId(); + + final SignedPreKeyRecord signedPreKey = generateSignedPreKey( + identityKeyPair, + signedPreKeyId, + ); + + await signalStore.storeSignedPreKey(signedPreKeyId, signedPreKey); + + return signedPreKey; } diff --git a/lib/src/services/signal/session.signal.dart b/lib/src/services/signal/session.signal.dart index bd0c863..9824240 100644 --- a/lib/src/services/signal/session.signal.dart +++ b/lib/src/services/signal/session.signal.dart @@ -3,52 +3,63 @@ import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; import 'package:twonly/src/model/json/userdata.dart'; import 'package:twonly/src/model/protobuf/api/server_to_client.pb.dart'; import 'package:twonly/src/database/signal/connect_signal_protocol_store.dart'; +import 'package:twonly/src/services/signal/consts.signal.dart'; import 'package:twonly/src/services/signal/utils.signal.dart'; import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/storage.dart'; -const int defaultDeviceId = 1; - Future createNewSignalSession(Response_UserData userData) async { - final int userId = userData.userId.toInt(); - - SignalProtocolAddress targetAddress = - SignalProtocolAddress(userId.toString(), defaultDeviceId); - SignalProtocolStore? signalStore = await getSignalStore(); + if (signalStore == null) { return false; } - SessionBuilder sessionBuilder = - SessionBuilder.fromSignalStore(signalStore, targetAddress); + SignalProtocolAddress targetAddress = SignalProtocolAddress( + userData.userId.toString(), + defaultDeviceId, + ); + + SessionBuilder sessionBuilder = SessionBuilder.fromSignalStore( + signalStore, + targetAddress, + ); ECPublicKey? tempPrePublicKey; int? tempPreKeyId; + if (userData.prekeys.isNotEmpty) { tempPrePublicKey = Curve.decodePoint( - DjbECPublicKey(Uint8List.fromList(userData.prekeys.first.prekey)) - .serialize(), - 1); + DjbECPublicKey( + Uint8List.fromList(userData.prekeys.first.prekey), + ).serialize(), + 1, + ); tempPreKeyId = userData.prekeys.first.id.toInt(); } int tempSignedPreKeyId = userData.signedPrekeyId.toInt(); ECPublicKey? tempSignedPreKeyPublic = Curve.decodePoint( - DjbECPublicKey(Uint8List.fromList(userData.signedPrekey)).serialize(), 1); + DjbECPublicKey(Uint8List.fromList(userData.signedPrekey)).serialize(), + 1, + ); - Uint8List? tempSignedPreKeySignature = - Uint8List.fromList(userData.signedPrekeySignature); + Uint8List? tempSignedPreKeySignature = Uint8List.fromList( + userData.signedPrekeySignature, + ); - IdentityKey tempIdentityKey = IdentityKey(Curve.decodePoint( + IdentityKey tempIdentityKey = IdentityKey( + Curve.decodePoint( DjbECPublicKey(Uint8List.fromList(userData.publicIdentityKey)) .serialize(), - 1)); + 1, + ), + ); PreKeyBundle preKeyBundle = PreKeyBundle( userData.userId.toInt(), - 1, + defaultDeviceId, tempPreKeyId, tempPrePublicKey, tempSignedPreKeyId, diff --git a/lib/src/services/signal/utils.signal.dart b/lib/src/services/signal/utils.signal.dart index 6c83c1a..a1885cd 100644 --- a/lib/src/services/signal/utils.signal.dart +++ b/lib/src/services/signal/utils.signal.dart @@ -3,8 +3,6 @@ import 'package:twonly/src/model/json/signal_identity.dart'; import 'package:twonly/src/database/signal/connect_signal_protocol_store.dart'; import 'package:twonly/src/services/signal/identity.signal.dart'; -const int defaultDeviceId = 1; - Future getSignalStore() async { return await getSignalStoreFromIdentity((await getSignalIdentity())!); } @@ -17,13 +15,3 @@ Future getSignalStoreFromIdentity( return ConnectSignalProtocolStore( identityKeyPair, signalIdentity.registrationId.toInt()); } - -Future> signalGetPreKeys() async { - final preKeys = generatePreKeys(0, 200); - final signalStore = await getSignalStore(); - if (signalStore == null) return []; - for (final p in preKeys) { - await signalStore.preKeyStore.storePreKey(p.id, p); - } - return preKeys; -}