add user to signal database

This commit is contained in:
otsmr 2025-01-23 19:52:22 +01:00
parent b856859061
commit e8e1061926
14 changed files with 643 additions and 157 deletions

View file

@ -1,5 +1,3 @@
import 'dart:typed_data';
import 'package:cv/cv.dart';
class DbMessages extends CvModelBase {
@ -8,6 +6,9 @@ class DbMessages extends CvModelBase {
static const columnMessageId = "messageId";
final messageId = CvField<int>(columnMessageId);
static const columnBody = "body";
final messageBody = CvField<int>(columnBody);
static const columnCreatedAt = "created_at";
final createdAt = CvField<DateTime>(columnCreatedAt);

View file

@ -1,4 +1,4 @@
const String dbName = 'connect.db';
const String dbName = 'twonly.db';
const int kVersion1 = 1;

View file

@ -204,6 +204,7 @@ class Handshake_Register extends $pb.GeneratedMessage {
$core.List<$core.int>? signedPrekey,
$core.List<$core.int>? signedPrekeySignature,
$fixnum.Int64? signedPrekeyId,
$fixnum.Int64? registrationId,
}) {
final $result = create();
if (username != null) {
@ -224,6 +225,9 @@ class Handshake_Register extends $pb.GeneratedMessage {
if (signedPrekeyId != null) {
$result.signedPrekeyId = signedPrekeyId;
}
if (registrationId != null) {
$result.registrationId = registrationId;
}
return $result;
}
Handshake_Register._() : super();
@ -237,6 +241,7 @@ class Handshake_Register extends $pb.GeneratedMessage {
..a<$core.List<$core.int>>(4, _omitFieldNames ? '' : 'signedPrekey', $pb.PbFieldType.OY)
..a<$core.List<$core.int>>(5, _omitFieldNames ? '' : 'signedPrekeySignature', $pb.PbFieldType.OY)
..aInt64(6, _omitFieldNames ? '' : 'signedPrekeyId')
..aInt64(7, _omitFieldNames ? '' : 'registrationId')
..hasRequiredFields = false
;
@ -314,6 +319,15 @@ class Handshake_Register extends $pb.GeneratedMessage {
$core.bool hasSignedPrekeyId() => $_has(5);
@$pb.TagNumber(6)
void clearSignedPrekeyId() => clearField(6);
@$pb.TagNumber(7)
$fixnum.Int64 get registrationId => $_getI64(6);
@$pb.TagNumber(7)
set registrationId($fixnum.Int64 v) { $_setInt64(6, v); }
@$pb.TagNumber(7)
$core.bool hasRegistrationId() => $_has(6);
@$pb.TagNumber(7)
void clearRegistrationId() => clearField(7);
}
class Handshake_GetChallenge extends $pb.GeneratedMessage {
@ -677,10 +691,140 @@ class ApplicationData_GetPrekeysByUserId extends $pb.GeneratedMessage {
void clearUserId() => clearField(1);
}
class ApplicationData_GetUploadToken extends $pb.GeneratedMessage {
factory ApplicationData_GetUploadToken({
$core.int? len,
}) {
final $result = create();
if (len != null) {
$result.len = len;
}
return $result;
}
ApplicationData_GetUploadToken._() : super();
factory ApplicationData_GetUploadToken.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory ApplicationData_GetUploadToken.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData.GetUploadToken', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create)
..a<$core.int>(1, _omitFieldNames ? '' : 'len', $pb.PbFieldType.OU3)
..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_GetUploadToken clone() => ApplicationData_GetUploadToken()..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_GetUploadToken copyWith(void Function(ApplicationData_GetUploadToken) updates) => super.copyWith((message) => updates(message as ApplicationData_GetUploadToken)) as ApplicationData_GetUploadToken;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ApplicationData_GetUploadToken create() => ApplicationData_GetUploadToken._();
ApplicationData_GetUploadToken createEmptyInstance() => create();
static $pb.PbList<ApplicationData_GetUploadToken> createRepeated() => $pb.PbList<ApplicationData_GetUploadToken>();
@$core.pragma('dart2js:noInline')
static ApplicationData_GetUploadToken getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ApplicationData_GetUploadToken>(create);
static ApplicationData_GetUploadToken? _defaultInstance;
@$pb.TagNumber(1)
$core.int get len => $_getIZ(0);
@$pb.TagNumber(1)
set len($core.int v) { $_setUnsignedInt32(0, v); }
@$pb.TagNumber(1)
$core.bool hasLen() => $_has(0);
@$pb.TagNumber(1)
void clearLen() => clearField(1);
}
class ApplicationData_UploadData extends $pb.GeneratedMessage {
factory ApplicationData_UploadData({
$core.List<$core.int>? uploadToken,
$core.int? offset,
$core.List<$core.int>? data,
}) {
final $result = create();
if (uploadToken != null) {
$result.uploadToken = uploadToken;
}
if (offset != null) {
$result.offset = offset;
}
if (data != null) {
$result.data = data;
}
return $result;
}
ApplicationData_UploadData._() : super();
factory ApplicationData_UploadData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory ApplicationData_UploadData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData.UploadData', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create)
..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'uploadToken', $pb.PbFieldType.OY)
..a<$core.int>(2, _omitFieldNames ? '' : 'offset', $pb.PbFieldType.OU3)
..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'data', $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_UploadData clone() => ApplicationData_UploadData()..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_UploadData copyWith(void Function(ApplicationData_UploadData) updates) => super.copyWith((message) => updates(message as ApplicationData_UploadData)) as ApplicationData_UploadData;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ApplicationData_UploadData create() => ApplicationData_UploadData._();
ApplicationData_UploadData createEmptyInstance() => create();
static $pb.PbList<ApplicationData_UploadData> createRepeated() => $pb.PbList<ApplicationData_UploadData>();
@$core.pragma('dart2js:noInline')
static ApplicationData_UploadData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ApplicationData_UploadData>(create);
static ApplicationData_UploadData? _defaultInstance;
@$pb.TagNumber(1)
$core.List<$core.int> get uploadToken => $_getN(0);
@$pb.TagNumber(1)
set uploadToken($core.List<$core.int> v) { $_setBytes(0, v); }
@$pb.TagNumber(1)
$core.bool hasUploadToken() => $_has(0);
@$pb.TagNumber(1)
void clearUploadToken() => clearField(1);
@$pb.TagNumber(2)
$core.int get offset => $_getIZ(1);
@$pb.TagNumber(2)
set offset($core.int v) { $_setUnsignedInt32(1, v); }
@$pb.TagNumber(2)
$core.bool hasOffset() => $_has(1);
@$pb.TagNumber(2)
void clearOffset() => clearField(2);
@$pb.TagNumber(3)
$core.List<$core.int> get data => $_getN(2);
@$pb.TagNumber(3)
set data($core.List<$core.int> v) { $_setBytes(2, v); }
@$pb.TagNumber(3)
$core.bool hasData() => $_has(2);
@$pb.TagNumber(3)
void clearData() => clearField(3);
}
enum ApplicationData_ApplicationData {
textmessage,
getuserbyusername,
getprekeysbyuserid,
getuploadtoken,
uploaddata,
notSet
}
@ -689,6 +833,8 @@ class ApplicationData extends $pb.GeneratedMessage {
ApplicationData_TextMessage? textmessage,
ApplicationData_GetUserByUsername? getuserbyusername,
ApplicationData_GetPrekeysByUserId? getprekeysbyuserid,
ApplicationData_GetUploadToken? getuploadtoken,
ApplicationData_UploadData? uploaddata,
}) {
final $result = create();
if (textmessage != null) {
@ -700,6 +846,12 @@ class ApplicationData extends $pb.GeneratedMessage {
if (getprekeysbyuserid != null) {
$result.getprekeysbyuserid = getprekeysbyuserid;
}
if (getuploadtoken != null) {
$result.getuploadtoken = getuploadtoken;
}
if (uploaddata != null) {
$result.uploaddata = uploaddata;
}
return $result;
}
ApplicationData._() : super();
@ -710,13 +862,17 @@ class ApplicationData extends $pb.GeneratedMessage {
1 : ApplicationData_ApplicationData.textmessage,
2 : ApplicationData_ApplicationData.getuserbyusername,
3 : ApplicationData_ApplicationData.getprekeysbyuserid,
4 : ApplicationData_ApplicationData.getuploadtoken,
5 : ApplicationData_ApplicationData.uploaddata,
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])
..oo(0, [1, 2, 3, 4, 5])
..aOM<ApplicationData_TextMessage>(1, _omitFieldNames ? '' : 'textmessage', subBuilder: ApplicationData_TextMessage.create)
..aOM<ApplicationData_GetUserByUsername>(2, _omitFieldNames ? '' : 'getuserbyusername', subBuilder: ApplicationData_GetUserByUsername.create)
..aOM<ApplicationData_GetPrekeysByUserId>(3, _omitFieldNames ? '' : 'getprekeysbyuserid', subBuilder: ApplicationData_GetPrekeysByUserId.create)
..aOM<ApplicationData_GetUploadToken>(4, _omitFieldNames ? '' : 'getuploadtoken', subBuilder: ApplicationData_GetUploadToken.create)
..aOM<ApplicationData_UploadData>(5, _omitFieldNames ? '' : 'uploaddata', subBuilder: ApplicationData_UploadData.create)
..hasRequiredFields = false
;
@ -776,11 +932,97 @@ class ApplicationData extends $pb.GeneratedMessage {
void clearGetprekeysbyuserid() => clearField(3);
@$pb.TagNumber(3)
ApplicationData_GetPrekeysByUserId ensureGetprekeysbyuserid() => $_ensure(2);
@$pb.TagNumber(4)
ApplicationData_GetUploadToken get getuploadtoken => $_getN(3);
@$pb.TagNumber(4)
set getuploadtoken(ApplicationData_GetUploadToken v) { setField(4, v); }
@$pb.TagNumber(4)
$core.bool hasGetuploadtoken() => $_has(3);
@$pb.TagNumber(4)
void clearGetuploadtoken() => clearField(4);
@$pb.TagNumber(4)
ApplicationData_GetUploadToken ensureGetuploadtoken() => $_ensure(3);
@$pb.TagNumber(5)
ApplicationData_UploadData get uploaddata => $_getN(4);
@$pb.TagNumber(5)
set uploaddata(ApplicationData_UploadData v) { setField(5, v); }
@$pb.TagNumber(5)
$core.bool hasUploaddata() => $_has(4);
@$pb.TagNumber(5)
void clearUploaddata() => clearField(5);
@$pb.TagNumber(5)
ApplicationData_UploadData ensureUploaddata() => $_ensure(4);
}
class Response_PreKey extends $pb.GeneratedMessage {
factory Response_PreKey({
$fixnum.Int64? id,
$core.List<$core.int>? prekey,
}) {
final $result = create();
if (id != null) {
$result.id = id;
}
if (prekey != null) {
$result.prekey = prekey;
}
return $result;
}
Response_PreKey._() : super();
factory Response_PreKey.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory Response_PreKey.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.PreKey', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create)
..aInt64(1, _omitFieldNames ? '' : 'id')
..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'prekey', $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_PreKey clone() => Response_PreKey()..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_PreKey copyWith(void Function(Response_PreKey) updates) => super.copyWith((message) => updates(message as Response_PreKey)) as Response_PreKey;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Response_PreKey create() => Response_PreKey._();
Response_PreKey createEmptyInstance() => create();
static $pb.PbList<Response_PreKey> createRepeated() => $pb.PbList<Response_PreKey>();
@$core.pragma('dart2js:noInline')
static Response_PreKey getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Response_PreKey>(create);
static Response_PreKey? _defaultInstance;
@$pb.TagNumber(1)
$fixnum.Int64 get id => $_getI64(0);
@$pb.TagNumber(1)
set id($fixnum.Int64 v) { $_setInt64(0, v); }
@$pb.TagNumber(1)
$core.bool hasId() => $_has(0);
@$pb.TagNumber(1)
void clearId() => clearField(1);
@$pb.TagNumber(2)
$core.List<$core.int> get prekey => $_getN(1);
@$pb.TagNumber(2)
set prekey($core.List<$core.int> v) { $_setBytes(1, v); }
@$pb.TagNumber(2)
$core.bool hasPrekey() => $_has(1);
@$pb.TagNumber(2)
void clearPrekey() => clearField(2);
}
class Response_Prekeys extends $pb.GeneratedMessage {
factory Response_Prekeys({
$core.Iterable<$core.List<$core.int>>? prekeys,
$core.Iterable<Response_PreKey>? prekeys,
}) {
final $result = create();
if (prekeys != null) {
@ -793,7 +1035,7 @@ class Response_Prekeys extends $pb.GeneratedMessage {
factory Response_Prekeys.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.Prekeys', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create)
..p<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'prekeys', $pb.PbFieldType.PY)
..pc<Response_PreKey>(1, _omitFieldNames ? '' : 'prekeys', $pb.PbFieldType.PM, subBuilder: Response_PreKey.create)
..hasRequiredFields = false
;
@ -819,7 +1061,7 @@ class Response_Prekeys extends $pb.GeneratedMessage {
static Response_Prekeys? _defaultInstance;
@$pb.TagNumber(1)
$core.List<$core.List<$core.int>> get prekeys => $_getList(0);
$core.List<Response_PreKey> get prekeys => $_getList(0);
}
enum Response_Ok_Ok {

View file

@ -75,6 +75,7 @@ const Handshake_Register$json = {
{'1': 'signed_prekey', '3': 4, '4': 1, '5': 12, '10': 'signedPrekey'},
{'1': 'signed_prekey_signature', '3': 5, '4': 1, '5': 12, '10': 'signedPrekeySignature'},
{'1': 'signed_prekey_id', '3': 6, '4': 1, '5': 3, '10': 'signedPrekeyId'},
{'1': 'registration_id', '3': 7, '4': 1, '5': 3, '10': 'registrationId'},
],
'8': [
{'1': '_invite_code'},
@ -101,14 +102,14 @@ final $typed_data.Uint8List handshakeDescriptor = $convert.base64Decode(
'FrZS5SZWdpc3RlckgAUghyZWdpc3RlchJOCgxnZXRjaGFsbGVuZ2UYAiABKAsyKC5jbGllbnRf'
'dG9fc2VydmVyLkhhbmRzaGFrZS5HZXRDaGFsbGVuZ2VIAFIMZ2V0Y2hhbGxlbmdlEksKC29wZW'
'5zZXNzaW9uGAMgASgLMicuY2xpZW50X3RvX3NlcnZlci5IYW5kc2hha2UuT3BlblNlc3Npb25I'
'AFILb3BlbnNlc3Npb24akwIKCFJlZ2lzdGVyEhoKCHVzZXJuYW1lGAEgASgJUgh1c2VybmFtZR'
'AFILb3BlbnNlc3Npb24avAIKCFJlZ2lzdGVyEhoKCHVzZXJuYW1lGAEgASgJUgh1c2VybmFtZR'
'IkCgtpbnZpdGVfY29kZRgCIAEoCUgAUgppbnZpdGVDb2RliAEBEi4KE3B1YmxpY19pZGVudGl0'
'eV9rZXkYAyABKAxSEXB1YmxpY0lkZW50aXR5S2V5EiMKDXNpZ25lZF9wcmVrZXkYBCABKAxSDH'
'NpZ25lZFByZWtleRI2ChdzaWduZWRfcHJla2V5X3NpZ25hdHVyZRgFIAEoDFIVc2lnbmVkUHJl'
'a2V5U2lnbmF0dXJlEigKEHNpZ25lZF9wcmVrZXlfaWQYBiABKANSDnNpZ25lZFByZWtleUlkQg'
'4KDF9pbnZpdGVfY29kZRoOCgxHZXRDaGFsbGVuZ2UaQgoLT3BlblNlc3Npb24SFwoHdXNlcl9p'
'ZBgBIAEoDFIGdXNlcklkEhoKCHJlc3BvbnNlGAIgASgMUghyZXNwb25zZUILCglIYW5kc2hha2'
'U=');
'a2V5U2lnbmF0dXJlEigKEHNpZ25lZF9wcmVrZXlfaWQYBiABKANSDnNpZ25lZFByZWtleUlkEi'
'cKD3JlZ2lzdHJhdGlvbl9pZBgHIAEoA1IOcmVnaXN0cmF0aW9uSWRCDgoMX2ludml0ZV9jb2Rl'
'Gg4KDEdldENoYWxsZW5nZRpCCgtPcGVuU2Vzc2lvbhIXCgd1c2VyX2lkGAEgASgMUgZ1c2VySW'
'QSGgoIcmVzcG9uc2UYAiABKAxSCHJlc3BvbnNlQgsKCUhhbmRzaGFrZQ==');
@$core.Deprecated('Use applicationDataDescriptor instead')
const ApplicationData$json = {
@ -117,8 +118,10 @@ const ApplicationData$json = {
{'1': 'textmessage', '3': 1, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.TextMessage', '9': 0, '10': 'textmessage'},
{'1': 'getuserbyusername', '3': 2, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.GetUserByUsername', '9': 0, '10': 'getuserbyusername'},
{'1': 'getprekeysbyuserid', '3': 3, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.GetPrekeysByUserId', '9': 0, '10': 'getprekeysbyuserid'},
{'1': 'getuploadtoken', '3': 4, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.GetUploadToken', '9': 0, '10': 'getuploadtoken'},
{'1': 'uploaddata', '3': 5, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UploadData', '9': 0, '10': 'uploaddata'},
],
'3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_GetPrekeysByUserId$json],
'3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_GetPrekeysByUserId$json, ApplicationData_GetUploadToken$json, ApplicationData_UploadData$json],
'8': [
{'1': 'ApplicationData'},
],
@ -149,6 +152,24 @@ const ApplicationData_GetPrekeysByUserId$json = {
],
};
@$core.Deprecated('Use applicationDataDescriptor instead')
const ApplicationData_GetUploadToken$json = {
'1': 'GetUploadToken',
'2': [
{'1': 'len', '3': 1, '4': 1, '5': 13, '10': 'len'},
],
};
@$core.Deprecated('Use applicationDataDescriptor instead')
const ApplicationData_UploadData$json = {
'1': 'UploadData',
'2': [
{'1': 'upload_token', '3': 1, '4': 1, '5': 12, '10': 'uploadToken'},
{'1': 'offset', '3': 2, '4': 1, '5': 13, '10': 'offset'},
{'1': 'data', '3': 3, '4': 1, '5': 12, '10': 'data'},
],
};
/// Descriptor for `ApplicationData`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
'Cg9BcHBsaWNhdGlvbkRhdGESUQoLdGV4dG1lc3NhZ2UYASABKAsyLS5jbGllbnRfdG9fc2Vydm'
@ -156,10 +177,16 @@ final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
'Ynl1c2VybmFtZRgCIAEoCzIzLmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkdldF'
'VzZXJCeVVzZXJuYW1lSABSEWdldHVzZXJieXVzZXJuYW1lEmYKEmdldHByZWtleXNieXVzZXJp'
'ZBgDIAEoCzI0LmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkdldFByZWtleXNCeV'
'VzZXJJZEgAUhJnZXRwcmVrZXlzYnl1c2VyaWQaOgoLVGV4dE1lc3NhZ2USFwoHdXNlcl9pZBgB'
'IAEoDFIGdXNlcklkEhIKBGJvZHkYAyABKAxSBGJvZHkaLwoRR2V0VXNlckJ5VXNlcm5hbWUSGg'
'oIdXNlcm5hbWUYASABKAlSCHVzZXJuYW1lGi0KEkdldFByZWtleXNCeVVzZXJJZBIXCgd1c2Vy'
'X2lkGAEgASgMUgZ1c2VySWRCEQoPQXBwbGljYXRpb25EYXRh');
'VzZXJJZEgAUhJnZXRwcmVrZXlzYnl1c2VyaWQSWgoOZ2V0dXBsb2FkdG9rZW4YBCABKAsyMC5j'
'bGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRVcGxvYWRUb2tlbkgAUg5nZXR1cG'
'xvYWR0b2tlbhJOCgp1cGxvYWRkYXRhGAUgASgLMiwuY2xpZW50X3RvX3NlcnZlci5BcHBsaWNh'
'dGlvbkRhdGEuVXBsb2FkRGF0YUgAUgp1cGxvYWRkYXRhGjoKC1RleHRNZXNzYWdlEhcKB3VzZX'
'JfaWQYASABKAxSBnVzZXJJZBISCgRib2R5GAMgASgMUgRib2R5Gi8KEUdldFVzZXJCeVVzZXJu'
'YW1lEhoKCHVzZXJuYW1lGAEgASgJUgh1c2VybmFtZRotChJHZXRQcmVrZXlzQnlVc2VySWQSFw'
'oHdXNlcl9pZBgBIAEoDFIGdXNlcklkGiIKDkdldFVwbG9hZFRva2VuEhAKA2xlbhgBIAEoDVID'
'bGVuGlsKClVwbG9hZERhdGESIQoMdXBsb2FkX3Rva2VuGAEgASgMUgt1cGxvYWRUb2tlbhIWCg'
'ZvZmZzZXQYAiABKA1SBm9mZnNldBISCgRkYXRhGAMgASgMUgRkYXRhQhEKD0FwcGxpY2F0aW9u'
'RGF0YQ==');
@$core.Deprecated('Use responseDescriptor instead')
const Response$json = {
@ -168,17 +195,26 @@ const Response$json = {
{'1': 'ok', '3': 1, '4': 1, '5': 11, '6': '.client_to_server.Response.Ok', '9': 0, '10': 'ok'},
{'1': 'error', '3': 2, '4': 1, '5': 14, '6': '.error.ErrorCode', '9': 0, '10': 'error'},
],
'3': [Response_Prekeys$json, Response_Ok$json],
'3': [Response_PreKey$json, Response_Prekeys$json, Response_Ok$json],
'8': [
{'1': 'Response'},
],
};
@$core.Deprecated('Use responseDescriptor instead')
const Response_PreKey$json = {
'1': 'PreKey',
'2': [
{'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},
{'1': 'prekey', '3': 2, '4': 1, '5': 12, '10': 'prekey'},
],
};
@$core.Deprecated('Use responseDescriptor instead')
const Response_Prekeys$json = {
'1': 'Prekeys',
'2': [
{'1': 'prekeys', '3': 1, '4': 3, '5': 12, '10': 'prekeys'},
{'1': 'prekeys', '3': 1, '4': 3, '5': 11, '6': '.client_to_server.Response.PreKey', '10': 'prekeys'},
],
};
@ -197,8 +233,9 @@ const Response_Ok$json = {
/// Descriptor for `Response`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List responseDescriptor = $convert.base64Decode(
'CghSZXNwb25zZRIvCgJvaxgBIAEoCzIdLmNsaWVudF90b19zZXJ2ZXIuUmVzcG9uc2UuT2tIAF'
'ICb2sSKAoFZXJyb3IYAiABKA4yEC5lcnJvci5FcnJvckNvZGVIAFIFZXJyb3IaIwoHUHJla2V5'
'cxIYCgdwcmVrZXlzGAEgAygMUgdwcmVrZXlzGmAKAk9rEhQKBE5vbmUYASABKAhIAFIETm9uZR'
'I+CgdwcmVrZXlzGAIgASgLMiIuY2xpZW50X3RvX3NlcnZlci5SZXNwb25zZS5QcmVrZXlzSABS'
'B3ByZWtleXNCBAoCT2tCCgoIUmVzcG9uc2U=');
'ICb2sSKAoFZXJyb3IYAiABKA4yEC5lcnJvci5FcnJvckNvZGVIAFIFZXJyb3IaMAoGUHJlS2V5'
'Eg4KAmlkGAEgASgDUgJpZBIWCgZwcmVrZXkYAiABKAxSBnByZWtleRpGCgdQcmVrZXlzEjsKB3'
'ByZWtleXMYASADKAsyIS5jbGllbnRfdG9fc2VydmVyLlJlc3BvbnNlLlByZUtleVIHcHJla2V5'
'cxpgCgJPaxIUCgROb25lGAEgASgISABSBE5vbmUSPgoHcHJla2V5cxgCIAEoCzIiLmNsaWVudF'
'90b19zZXJ2ZXIuUmVzcG9uc2UuUHJla2V5c0gAUgdwcmVrZXlzQgQKAk9rQgoKCFJlc3BvbnNl');

View file

@ -27,6 +27,8 @@ class ErrorCode extends $pb.ProtobufEnum {
static const ErrorCode SessionAlreadyAuthenticated = ErrorCode._(1008, _omitEnumNames ? '' : 'SessionAlreadyAuthenticated');
static const ErrorCode SessionNotAuthenticated = ErrorCode._(1009, _omitEnumNames ? '' : 'SessionNotAuthenticated');
static const ErrorCode OnlyOneSessionAllowed = ErrorCode._(1010, _omitEnumNames ? '' : 'OnlyOneSessionAllowed');
static const ErrorCode UploadLimitReached = ErrorCode._(1011, _omitEnumNames ? '' : 'UploadLimitReached');
static const ErrorCode InvalidUpdateToken = ErrorCode._(1012, _omitEnumNames ? '' : 'InvalidUpdateToken');
static const $core.List<ErrorCode> values = <ErrorCode> [
Unknown,
@ -42,6 +44,8 @@ class ErrorCode extends $pb.ProtobufEnum {
SessionAlreadyAuthenticated,
SessionNotAuthenticated,
OnlyOneSessionAllowed,
UploadLimitReached,
InvalidUpdateToken,
];
static final $core.Map<$core.int, ErrorCode> _byValue = $pb.ProtobufEnum.initByValue(values);

View file

@ -30,6 +30,8 @@ const ErrorCode$json = {
{'1': 'SessionAlreadyAuthenticated', '2': 1008},
{'1': 'SessionNotAuthenticated', '2': 1009},
{'1': 'OnlyOneSessionAllowed', '2': 1010},
{'1': 'UploadLimitReached', '2': 1011},
{'1': 'InvalidUpdateToken', '2': 1012},
],
};
@ -40,5 +42,6 @@ final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode(
'EhkKFFVzZXJuYW1lQWxyZWFkeVRha2VuEOsHEhYKEVNpZ25hdHVyZU5vdFZhbGlkEOwHEhUKEF'
'VzZXJuYW1lTm90Rm91bmQQ7QcSFQoQVXNlcm5hbWVOb3RWYWxpZBDuBxIVChBJbnZhbGlkUHVi'
'bGljS2V5EO8HEiAKG1Nlc3Npb25BbHJlYWR5QXV0aGVudGljYXRlZBDwBxIcChdTZXNzaW9uTm'
'90QXV0aGVudGljYXRlZBDxBxIaChVPbmx5T25lU2Vzc2lvbkFsbG93ZWQQ8gc=');
'90QXV0aGVudGljYXRlZBDxBxIaChVPbmx5T25lU2Vzc2lvbkFsbG93ZWQQ8gcSFwoSVXBsb2Fk'
'TGltaXRSZWFjaGVkEPMHEhcKEkludmFsaWRVcGRhdGVUb2tlbhD0Bw==');

View file

@ -244,14 +244,79 @@ class NewMessage extends $pb.GeneratedMessage {
void clearBody() => clearField(1);
}
class Response_PreKey extends $pb.GeneratedMessage {
factory Response_PreKey({
$fixnum.Int64? id,
$core.List<$core.int>? prekey,
}) {
final $result = create();
if (id != null) {
$result.id = id;
}
if (prekey != null) {
$result.prekey = prekey;
}
return $result;
}
Response_PreKey._() : super();
factory Response_PreKey.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory Response_PreKey.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.PreKey', package: const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'), createEmptyInstance: create)
..aInt64(1, _omitFieldNames ? '' : 'id')
..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'prekey', $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_PreKey clone() => Response_PreKey()..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_PreKey copyWith(void Function(Response_PreKey) updates) => super.copyWith((message) => updates(message as Response_PreKey)) as Response_PreKey;
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static Response_PreKey create() => Response_PreKey._();
Response_PreKey createEmptyInstance() => create();
static $pb.PbList<Response_PreKey> createRepeated() => $pb.PbList<Response_PreKey>();
@$core.pragma('dart2js:noInline')
static Response_PreKey getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Response_PreKey>(create);
static Response_PreKey? _defaultInstance;
@$pb.TagNumber(1)
$fixnum.Int64 get id => $_getI64(0);
@$pb.TagNumber(1)
set id($fixnum.Int64 v) { $_setInt64(0, v); }
@$pb.TagNumber(1)
$core.bool hasId() => $_has(0);
@$pb.TagNumber(1)
void clearId() => clearField(1);
@$pb.TagNumber(2)
$core.List<$core.int> get prekey => $_getN(1);
@$pb.TagNumber(2)
set prekey($core.List<$core.int> v) { $_setBytes(1, v); }
@$pb.TagNumber(2)
$core.bool hasPrekey() => $_has(1);
@$pb.TagNumber(2)
void clearPrekey() => clearField(2);
}
class Response_UserData extends $pb.GeneratedMessage {
factory Response_UserData({
$core.List<$core.int>? userId,
$core.Iterable<$core.List<$core.int>>? prekeys,
$core.Iterable<Response_PreKey>? prekeys,
$core.List<$core.int>? publicIdentityKey,
$core.List<$core.int>? signedPrekey,
$core.List<$core.int>? signedPrekeySignature,
$fixnum.Int64? signedPrekeyId,
$fixnum.Int64? registrationId,
}) {
final $result = create();
if (userId != null) {
@ -272,6 +337,9 @@ class Response_UserData extends $pb.GeneratedMessage {
if (signedPrekeyId != null) {
$result.signedPrekeyId = signedPrekeyId;
}
if (registrationId != null) {
$result.registrationId = registrationId;
}
return $result;
}
Response_UserData._() : super();
@ -280,11 +348,12 @@ class Response_UserData extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.UserData', package: const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'), createEmptyInstance: create)
..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'userId', $pb.PbFieldType.OY)
..p<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'prekeys', $pb.PbFieldType.PY)
..pc<Response_PreKey>(2, _omitFieldNames ? '' : 'prekeys', $pb.PbFieldType.PM, subBuilder: Response_PreKey.create)
..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'publicIdentityKey', $pb.PbFieldType.OY)
..a<$core.List<$core.int>>(4, _omitFieldNames ? '' : 'signedPrekey', $pb.PbFieldType.OY)
..a<$core.List<$core.int>>(5, _omitFieldNames ? '' : 'signedPrekeySignature', $pb.PbFieldType.OY)
..aInt64(6, _omitFieldNames ? '' : 'signedPrekeyId')
..aInt64(7, _omitFieldNames ? '' : 'registrationId')
..hasRequiredFields = false
;
@ -319,7 +388,7 @@ class Response_UserData extends $pb.GeneratedMessage {
void clearUserId() => clearField(1);
@$pb.TagNumber(2)
$core.List<$core.List<$core.int>> get prekeys => $_getList(1);
$core.List<Response_PreKey> get prekeys => $_getList(1);
@$pb.TagNumber(3)
$core.List<$core.int> get publicIdentityKey => $_getN(2);
@ -356,12 +425,22 @@ class Response_UserData extends $pb.GeneratedMessage {
$core.bool hasSignedPrekeyId() => $_has(5);
@$pb.TagNumber(6)
void clearSignedPrekeyId() => clearField(6);
@$pb.TagNumber(7)
$fixnum.Int64 get registrationId => $_getI64(6);
@$pb.TagNumber(7)
set registrationId($fixnum.Int64 v) { $_setInt64(6, v); }
@$pb.TagNumber(7)
$core.bool hasRegistrationId() => $_has(6);
@$pb.TagNumber(7)
void clearRegistrationId() => clearField(7);
}
enum Response_Ok_Ok {
none,
userid,
challenge,
uploadtoken,
userdata,
notSet
}
@ -371,6 +450,7 @@ class Response_Ok extends $pb.GeneratedMessage {
$core.bool? none,
$core.List<$core.int>? userid,
$core.List<$core.int>? challenge,
$core.List<$core.int>? uploadtoken,
Response_UserData? userdata,
}) {
final $result = create();
@ -383,6 +463,9 @@ class Response_Ok extends $pb.GeneratedMessage {
if (challenge != null) {
$result.challenge = challenge;
}
if (uploadtoken != null) {
$result.uploadtoken = uploadtoken;
}
if (userdata != null) {
$result.userdata = userdata;
}
@ -396,15 +479,17 @@ class Response_Ok extends $pb.GeneratedMessage {
1 : Response_Ok_Ok.none,
2 : Response_Ok_Ok.userid,
3 : Response_Ok_Ok.challenge,
4 : Response_Ok_Ok.userdata,
4 : Response_Ok_Ok.uploadtoken,
5 : Response_Ok_Ok.userdata,
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])
..oo(0, [1, 2, 3, 4, 5])
..aOB(1, _omitFieldNames ? '' : 'None', protoName: 'None')
..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'userid', $pb.PbFieldType.OY)
..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'challenge', $pb.PbFieldType.OY)
..aOM<Response_UserData>(4, _omitFieldNames ? '' : 'userdata', subBuilder: Response_UserData.create)
..a<$core.List<$core.int>>(4, _omitFieldNames ? '' : 'uploadtoken', $pb.PbFieldType.OY)
..aOM<Response_UserData>(5, _omitFieldNames ? '' : 'userdata', subBuilder: Response_UserData.create)
..hasRequiredFields = false
;
@ -460,15 +545,24 @@ class Response_Ok extends $pb.GeneratedMessage {
void clearChallenge() => clearField(3);
@$pb.TagNumber(4)
Response_UserData get userdata => $_getN(3);
$core.List<$core.int> get uploadtoken => $_getN(3);
@$pb.TagNumber(4)
set userdata(Response_UserData v) { setField(4, v); }
set uploadtoken($core.List<$core.int> v) { $_setBytes(3, v); }
@$pb.TagNumber(4)
$core.bool hasUserdata() => $_has(3);
$core.bool hasUploadtoken() => $_has(3);
@$pb.TagNumber(4)
void clearUserdata() => clearField(4);
@$pb.TagNumber(4)
Response_UserData ensureUserdata() => $_ensure(3);
void clearUploadtoken() => clearField(4);
@$pb.TagNumber(5)
Response_UserData get userdata => $_getN(4);
@$pb.TagNumber(5)
set userdata(Response_UserData v) { setField(5, v); }
@$pb.TagNumber(5)
$core.bool hasUserdata() => $_has(4);
@$pb.TagNumber(5)
void clearUserdata() => clearField(5);
@$pb.TagNumber(5)
Response_UserData ensureUserdata() => $_ensure(4);
}
enum Response_Response {

View file

@ -69,27 +69,38 @@ 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_UserData$json, Response_Ok$json],
'3': [Response_PreKey$json, Response_UserData$json, Response_Ok$json],
'8': [
{'1': 'Response'},
],
};
@$core.Deprecated('Use responseDescriptor instead')
const Response_PreKey$json = {
'1': 'PreKey',
'2': [
{'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},
{'1': 'prekey', '3': 2, '4': 1, '5': 12, '10': 'prekey'},
],
};
@$core.Deprecated('Use responseDescriptor instead')
const Response_UserData$json = {
'1': 'UserData',
'2': [
{'1': 'user_id', '3': 1, '4': 1, '5': 12, '10': 'userId'},
{'1': 'prekeys', '3': 2, '4': 3, '5': 12, '10': 'prekeys'},
{'1': 'prekeys', '3': 2, '4': 3, '5': 11, '6': '.server_to_client.Response.PreKey', '10': 'prekeys'},
{'1': 'public_identity_key', '3': 3, '4': 1, '5': 12, '9': 0, '10': 'publicIdentityKey', '17': true},
{'1': 'signed_prekey', '3': 4, '4': 1, '5': 12, '9': 1, '10': 'signedPrekey', '17': true},
{'1': 'signed_prekey_signature', '3': 5, '4': 1, '5': 12, '9': 2, '10': 'signedPrekeySignature', '17': true},
{'1': 'signed_prekey_id', '3': 6, '4': 1, '5': 3, '9': 3, '10': 'signedPrekeyId', '17': true},
{'1': 'registration_id', '3': 7, '4': 1, '5': 3, '9': 3, '10': 'registrationId', '17': true},
{'1': 'signed_prekey_id', '3': 6, '4': 1, '5': 3, '9': 4, '10': 'signedPrekeyId', '17': true},
],
'8': [
{'1': '_public_identity_key'},
{'1': '_signed_prekey'},
{'1': '_signed_prekey_signature'},
{'1': '_registration_id'},
{'1': '_signed_prekey_id'},
],
};
@ -101,7 +112,8 @@ const Response_Ok$json = {
{'1': 'None', '3': 1, '4': 1, '5': 8, '9': 0, '10': 'None'},
{'1': 'userid', '3': 2, '4': 1, '5': 12, '9': 0, '10': 'userid'},
{'1': 'challenge', '3': 3, '4': 1, '5': 12, '9': 0, '10': 'challenge'},
{'1': 'userdata', '3': 4, '4': 1, '5': 11, '6': '.server_to_client.Response.UserData', '9': 0, '10': 'userdata'},
{'1': 'uploadtoken', '3': 4, '4': 1, '5': 12, '9': 0, '10': 'uploadtoken'},
{'1': 'userdata', '3': 5, '4': 1, '5': 11, '6': '.server_to_client.Response.UserData', '9': 0, '10': 'userdata'},
],
'8': [
{'1': 'Ok'},
@ -111,15 +123,18 @@ const Response_Ok$json = {
/// Descriptor for `Response`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List responseDescriptor = $convert.base64Decode(
'CghSZXNwb25zZRIvCgJvaxgBIAEoCzIdLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuT2tIAF'
'ICb2sSKAoFZXJyb3IYAiABKA4yEC5lcnJvci5FcnJvckNvZGVIAFIFZXJyb3Ia4wIKCFVzZXJE'
'YXRhEhcKB3VzZXJfaWQYASABKAxSBnVzZXJJZBIYCgdwcmVrZXlzGAIgAygMUgdwcmVrZXlzEj'
'MKE3B1YmxpY19pZGVudGl0eV9rZXkYAyABKAxIAFIRcHVibGljSWRlbnRpdHlLZXmIAQESKAoN'
'c2lnbmVkX3ByZWtleRgEIAEoDEgBUgxzaWduZWRQcmVrZXmIAQESOwoXc2lnbmVkX3ByZWtleV'
'9zaWduYXR1cmUYBSABKAxIAlIVc2lnbmVkUHJla2V5U2lnbmF0dXJliAEBEi0KEHNpZ25lZF9w'
'cmVrZXlfaWQYBiABKANIA1IOc2lnbmVkUHJla2V5SWSIAQFCFgoUX3B1YmxpY19pZGVudGl0eV'
'9rZXlCEAoOX3NpZ25lZF9wcmVrZXlCGgoYX3NpZ25lZF9wcmVrZXlfc2lnbmF0dXJlQhMKEV9z'
'aWduZWRfcHJla2V5X2lkGp0BCgJPaxIUCgROb25lGAEgASgISABSBE5vbmUSGAoGdXNlcmlkGA'
'IgASgMSABSBnVzZXJpZBIeCgljaGFsbGVuZ2UYAyABKAxIAFIJY2hhbGxlbmdlEkEKCHVzZXJk'
'YXRhGAQgASgLMiMuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5Vc2VyRGF0YUgAUgh1c2VyZG'
'F0YUIECgJPa0IKCghSZXNwb25zZQ==');
'ICb2sSKAoFZXJyb3IYAiABKA4yEC5lcnJvci5FcnJvckNvZGVIAFIFZXJyb3IaMAoGUHJlS2V5'
'Eg4KAmlkGAEgASgDUgJpZBIWCgZwcmVrZXkYAiABKAxSBnByZWtleRrIAwoIVXNlckRhdGESFw'
'oHdXNlcl9pZBgBIAEoDFIGdXNlcklkEjsKB3ByZWtleXMYAiADKAsyIS5zZXJ2ZXJfdG9fY2xp'
'ZW50LlJlc3BvbnNlLlByZUtleVIHcHJla2V5cxIzChNwdWJsaWNfaWRlbnRpdHlfa2V5GAMgAS'
'gMSABSEXB1YmxpY0lkZW50aXR5S2V5iAEBEigKDXNpZ25lZF9wcmVrZXkYBCABKAxIAVIMc2ln'
'bmVkUHJla2V5iAEBEjsKF3NpZ25lZF9wcmVrZXlfc2lnbmF0dXJlGAUgASgMSAJSFXNpZ25lZF'
'ByZWtleVNpZ25hdHVyZYgBARIsCg9yZWdpc3RyYXRpb25faWQYByABKANIA1IOcmVnaXN0cmF0'
'aW9uSWSIAQESLQoQc2lnbmVkX3ByZWtleV9pZBgGIAEoA0gEUg5zaWduZWRQcmVrZXlJZIgBAU'
'IWChRfcHVibGljX2lkZW50aXR5X2tleUIQCg5fc2lnbmVkX3ByZWtleUIaChhfc2lnbmVkX3By'
'ZWtleV9zaWduYXR1cmVCEgoQX3JlZ2lzdHJhdGlvbl9pZEITChFfc2lnbmVkX3ByZWtleV9pZB'
'rBAQoCT2sSFAoETm9uZRgBIAEoCEgAUgROb25lEhgKBnVzZXJpZBgCIAEoDEgAUgZ1c2VyaWQS'
'HgoJY2hhbGxlbmdlGAMgASgMSABSCWNoYWxsZW5nZRIiCgt1cGxvYWR0b2tlbhgEIAEoDEgAUg'
't1cGxvYWR0b2tlbhJBCgh1c2VyZGF0YRgFIAEoCzIjLnNlcnZlcl90b19jbGllbnQuUmVzcG9u'
'c2UuVXNlckRhdGFIAFIIdXNlcmRhdGFCBAoCT2tCCgoIUmVzcG9uc2U=');

View file

@ -2,11 +2,14 @@ import 'dart:collection';
import 'dart:math';
import 'package:fixnum/fixnum.dart';
import 'package:flutter/material.dart';
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
import 'package:logging/logging.dart';
import 'package:twonly/src/proto/api/client_to_server.pb.dart';
import 'package:twonly/src/proto/api/client_to_server.pb.dart' as client;
import 'package:twonly/src/proto/api/client_to_server.pbserver.dart';
import 'package:twonly/src/proto/api/error.pb.dart';
import 'package:twonly/src/proto/api/server_to_client.pb.dart' as server;
import 'package:twonly/src/proto/api/server_to_client.pbserver.dart';
import 'package:twonly/src/signal/signal_helper.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:twonly/src/utils.dart';
@ -103,9 +106,9 @@ class ApiProvider {
void tryToReconnect() {
Future.delayed(Duration(seconds: _reconnectionDelay)).then(
(value) async {
_reconnectionDelay = _reconnectionDelay * 2;
if (_reconnectionDelay > 60 * 5) {
_reconnectionDelay = 60 * 5;
_reconnectionDelay = _reconnectionDelay + 2;
if (_reconnectionDelay > 20) {
_reconnectionDelay = 20;
}
await connect();
},
@ -118,6 +121,7 @@ class ApiProvider {
if (msg.v0.hasResponse()) {
messagesV0[msg.v0.seq] = msg;
} else {
_handleServerMessage(msg);
log.shout("Got a new message from the server: $msg");
}
} catch (e) {
@ -125,6 +129,34 @@ class ApiProvider {
}
}
Future _handleServerMessage(server.ServerToClient msg) async {
client.Response? response;
if (msg.v0.requestNewPreKeys) {
List<PreKeyRecord> localPreKeys = await SignalHelper.getPreKeys();
List<client.Response_PreKey> prekeysList = [];
for (int i = 0; i < localPreKeys.length; i++) {
prekeysList.add(client.Response_PreKey()
..id = Int64(localPreKeys[i].id)
..prekey = localPreKeys[i].getKeyPair().publicKey.serialize());
}
var prekeys = client.Response_Prekeys(prekeys: prekeysList);
var ok = client.Response_Ok()..prekeys = prekeys;
response = client.Response()..ok = ok;
}
if (response == null) return;
var v0 = client.V0()
..seq = msg.v0.seq
..response = response;
var res = ClientToServer()..v0 = v0;
final resBytes = res.writeToBuffer();
_channel!.sink.add(resBytes);
}
Future<server.ServerToClient?> _waitForResponse(Int64 seq) async {
final startTime = DateTime.now();
@ -162,7 +194,7 @@ class ApiProvider {
}
ClientToServer createClientToServerFromHandshake(Handshake handshake) {
var v0 = V0()
var v0 = client.V0()
..seq = Int64(0)
..handshake = handshake;
return ClientToServer()..v0 = v0;
@ -170,7 +202,7 @@ class ApiProvider {
ClientToServer createClientToServerFromApplicationData(
ApplicationData applicationData) {
var v0 = V0()
var v0 = client.V0()
..seq = Int64(0)
..applicationdata = applicationData;
return ClientToServer()..v0 = v0;
@ -218,9 +250,7 @@ class ApiProvider {
}
Future authenticate() async {
final reqSignal = await SignalHelper.getRegisterData();
if (reqSignal == null) {
if (await SignalHelper.getSignalIdentity() == null) {
return;
}
@ -271,19 +301,26 @@ class ApiProvider {
}
Future<Result> register(String username, String? inviteCode) async {
final reqSignal = await SignalHelper.getRegisterData();
if (reqSignal == null) {
final signalIdentity = await SignalHelper.getSignalIdentity();
if (signalIdentity == null) {
return Result.error(
"There was an fatal error. Try reinstalling the app.");
}
final signalStore =
await SignalHelper.getSignalStoreFromIdentity(signalIdentity);
final signedPreKey = (await signalStore.loadSignedPreKeys())[0];
log.shout("handle registrationId", signalIdentity.registrationId);
var register = Handshake_Register()
..username = username
..publicIdentityKey = reqSignal["identityKey"]
..signedPrekey = reqSignal["signedPreKey"]?["key"]
..signedPrekeySignature = reqSignal["signedPreKey"]?["signature"]
..signedPrekeyId = Int64(reqSignal["signedPreKey"]?["id"]);
..publicIdentityKey =
(await signalStore.getIdentityKeyPair()).getPublicKey().serialize()
..registrationId = Int64(signalIdentity.registrationId)
..signedPrekey = signedPreKey.getKeyPair().publicKey.serialize()
..signedPrekeySignature = signedPreKey.signature
..signedPrekeyId = Int64(signedPreKey.id);
if (inviteCode != null && inviteCode != "") {
register.inviteCode = inviteCode;

View file

@ -1,5 +1,7 @@
import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'package:logging/logging.dart';
import 'package:twonly/src/model/identity_key_store_model.dart';
import 'package:twonly/src/model/model_constants.dart';
import 'package:twonly/src/model/pre_key_model.dart';
@ -71,6 +73,10 @@ class DbProvider {
await openPath(await fixPath(dbName));
}
Future remove() async {
await _createDb(db!);
}
Future<String> fixPath(String path) async => path;
Future close() async {

View file

@ -16,6 +16,7 @@ class ConnectSignedPreKeyStore extends SignedPreKeyStore {
return store;
}
final storeHashMap = json.decode(storeSerialized);
print(storeHashMap);
for (final item in storeHashMap) {
store[item[0]] = base64Decode(item[1]);
}

View file

@ -3,6 +3,7 @@ import 'dart:developer';
import 'dart:typed_data';
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
import 'package:twonly/src/model/signal_identity_json.dart';
import 'package:twonly/src/proto/api/server_to_client.pb.dart';
import 'package:twonly/src/utils.dart';
import 'connect_sender_key_store.dart';
@ -39,58 +40,9 @@ class SignalDataModel {
}
}
// one to one implementation
Future<void> buildSession(
String target,
Map<String, dynamic> remoteBundle,
) async {
SignalProtocolAddress targetAddress =
SignalProtocolAddress(target, SignalHelper.defaultDeviceId);
SessionBuilder sessionBuilder =
SessionBuilder.fromSignalStore(signalStore, targetAddress);
PreKeyBundle temp = preKeyBundleFromJson(remoteBundle);
await sessionBuilder.processPreKeyBundle(temp);
}
// PreKeyBundle preKeyBundleFromJson(Map<String, dynamic> remoteBundle) {
PreKeyBundle preKeyBundleFromJson(Map<String, dynamic> remoteBundle) {
// One time pre key calculation
List tempPreKeys = remoteBundle["preKeys"];
ECPublicKey? tempPrePublicKey;
int? tempPreKeyId;
if (tempPreKeys.isNotEmpty) {
tempPrePublicKey = Curve.decodePoint(
DjbECPublicKey(base64Decode(tempPreKeys.first['key'])).serialize(),
1);
tempPreKeyId = remoteBundle["preKeys"].first['id'];
}
// Signed pre key calculation
int tempSignedPreKeyId = remoteBundle["signedPreKey"]['id'];
Map? tempSignedPreKey = remoteBundle["signedPreKey"];
ECPublicKey? tempSignedPreKeyPublic;
Uint8List? tempSignedPreKeySignature;
if (tempSignedPreKey != null) {
tempSignedPreKeyPublic = Curve.decodePoint(
DjbECPublicKey(base64Decode(remoteBundle["signedPreKey"]['key']))
.serialize(),
1);
tempSignedPreKeySignature =
base64Decode(remoteBundle["signedPreKey"]['signature']);
}
// Identity key calculation
IdentityKey tempIdentityKey = IdentityKey(Curve.decodePoint(
DjbECPublicKey(base64Decode(remoteBundle["identityKey"])).serialize(),
1));
return PreKeyBundle(
remoteBundle['registrationId'],
1,
tempPreKeyId,
tempPrePublicKey,
tempSignedPreKeyId,
tempSignedPreKeyPublic,
tempSignedPreKeySignature,
tempIdentityKey,
);
}
// }
Future<String?> getEncryptedText(String text, String target) async {
try {
@ -136,62 +88,124 @@ class SignalDataModel {
}
}
int userIdToRegistrationId(List<int> userId) {
int result = 0;
for (int i = 8; i < 16; i++) {
result = (result << 8) | userId[i];
}
return result;
}
String uint8ListToHex(List<int> list) {
final StringBuffer hexBuffer = StringBuffer();
for (int byte in list) {
hexBuffer.write(byte.toRadixString(16).padLeft(2, '0'));
}
return hexBuffer.toString().toUpperCase();
}
class SignalHelper {
static const int defaultDeviceId = 1;
static Future<ECPrivateKey?> getPrivateKey() async {
final storage = getSecureStorage();
final signalIdentityJson = await storage.read(key: "signal_identity");
if (signalIdentityJson == null) {
final signalIdentity = await getSignalIdentity();
if (signalIdentity == null) {
return null;
}
final SignalIdentity signalIdentity =
SignalIdentity.fromJson(jsonDecode(signalIdentityJson));
final IdentityKeyPair identityKeyPair =
IdentityKeyPair.fromSerialized(signalIdentity.identityKeyPairU8List);
return identityKeyPair.getPrivateKey();
}
static Future<Map<String, dynamic>?> getRegisterData() async {
// final publicKey = identityKeyPair.getPublicKey().serialize();
static Future<bool> addNewContact(Response_UserData userData) async {
final List<int> userId = userData.userId;
SignalProtocolAddress targetAddress = SignalProtocolAddress(
uint8ListToHex(userId), SignalHelper.defaultDeviceId);
SignalProtocolStore? signalStore = await SignalHelper.getSignalStore();
if (signalStore == null) {
return false;
}
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);
tempPreKeyId = userData.prekeys.first.id.toInt();
}
// Signed pre key calculation
int tempSignedPreKeyId = userData.signedPrekeyId.toInt();
// Map? tempSignedPreKey = remoteBundle["signedPreKey"];
ECPublicKey? tempSignedPreKeyPublic;
Uint8List? tempSignedPreKeySignature;
// if (tempSignedPreKey != null) {
tempSignedPreKeyPublic = Curve.decodePoint(
DjbECPublicKey(Uint8List.fromList(userData.signedPrekey)).serialize(),
1);
tempSignedPreKeySignature =
Uint8List.fromList(userData.signedPrekeySignature);
// }
// Identity key calculation
IdentityKey tempIdentityKey = IdentityKey(Curve.decodePoint(
DjbECPublicKey(Uint8List.fromList(userData.publicIdentityKey))
.serialize(),
1));
PreKeyBundle preKeyBundle = PreKeyBundle(
userData.registrationId.toInt(),
1,
tempPreKeyId,
tempPrePublicKey,
tempSignedPreKeyId,
tempSignedPreKeyPublic,
tempSignedPreKeySignature,
tempIdentityKey,
);
await sessionBuilder.processPreKeyBundle(preKeyBundle);
return true;
}
static Future<ConnectSignalProtocolStore?> getSignalStore() async {
return await getSignalStoreFromIdentity((await getSignalIdentity())!);
}
static Future<SignalIdentity?> getSignalIdentity() async {
final storage = getSecureStorage();
final signalIdentityJson = await storage.read(key: "signal_identity");
if (signalIdentityJson == null) {
return null;
}
final SignalIdentity signalIdentity =
SignalIdentity.fromJson(jsonDecode(signalIdentityJson));
return SignalIdentity.fromJson(jsonDecode(signalIdentityJson));
}
static Future<ConnectSignalProtocolStore> getSignalStoreFromIdentity(
SignalIdentity signalIdentity) async {
final IdentityKeyPair identityKeyPair =
IdentityKeyPair.fromSerialized(signalIdentity.identityKeyPairU8List);
ConnectSignalProtocolStore signalStore = ConnectSignalProtocolStore(
return ConnectSignalProtocolStore(
identityKeyPair, signalIdentity.registrationId);
}
final signedPreKey = (await signalStore.loadSignedPreKeys())[0];
final Map<String, dynamic> req = {};
req['registrationId'] = signalIdentity.registrationId;
req['identityKey'] =
(await signalStore.getIdentityKeyPair()).getPublicKey().serialize();
req['signedPreKey'] = {
'id': signedPreKey.id,
'signature': signedPreKey.signature,
'key': signedPreKey.getKeyPair().publicKey.serialize(),
};
// List pKeysList = [];
// for (PreKeyRecord pKey in preKeys) {
// Map<String, dynamic> pKeys = {};
// pKeys['id'] = pKey.id;
// pKeys['key'] = base64Encode(pKey.getKeyPair().publicKey.serialize());
// pKeysList.add(pKeys);
// }
// req['preKeys'] = pKeysList;
return req;
static Future<List<PreKeyRecord>> getPreKeys() 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;
}
static Future createIfNotExistsSignalIdentity() async {
@ -208,14 +222,9 @@ class SignalHelper {
ConnectSignalProtocolStore signalStore =
ConnectSignalProtocolStore(identityKeyPair, registrationId);
final preKeys = generatePreKeys(0, 100);
final signedPreKey =
generateSignedPreKey(identityKeyPair, SignalHelper.defaultDeviceId);
for (final p in preKeys) {
await signalStore.preKeyStore.storePreKey(p.id, p);
}
await signalStore.signedPreKeyStore
.storeSignedPreKey(signedPreKey.id, signedPreKey);

View file

@ -2,7 +2,9 @@ import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';
import 'dart:ui';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
import 'package:logging/logging.dart';
import 'package:twonly/main.dart';
import 'package:twonly/src/signal/signal_helper.dart';
@ -45,8 +47,10 @@ Future<UserData?> getUser() async {
Future<bool> deleteLocalUserData() async {
final storage = getSecureStorage();
await storage.delete(key: "user_data");
await storage.delete(key: "signal_identity");
var password = await storage.read(key: "sqflite_database_password");
await dbProvider.remove();
await storage.write(key: "sqflite_database_password", value: password);
await storage.deleteAll();
return true;
}
@ -61,11 +65,42 @@ Uint8List getRandomUint8List(int length) {
return randomBytes;
}
int userIdToRegistrationId(Uint8List userId) {
int result = 0;
for (int i = 8; i < 16; i++) {
result = (result << 8) | userId[i];
}
return result;
}
String uint8ListToHex(Uint8List list) {
final StringBuffer hexBuffer = StringBuffer();
for (int byte in list) {
hexBuffer.write(byte.toRadixString(16).padLeft(2, '0'));
}
return hexBuffer.toString().toUpperCase();
}
Future<bool> addNewUser(String username) async {
final res = await apiProvider.getUserData(username);
if (res.isSuccess) {
print("Found user: ${res.value}");
print(res.value);
print(res.value.userdata.userId);
await SignalHelper.addNewContact(res.value.userdata);
// final Map<String, dynamic> req = {};
// req['identityKey'] =
// (await signalStore.getIdentityKeyPair()).getPublicKey().serialize();
// req['signedPreKey'] = {
// 'id': signedPreKey.id,
// 'signature': signedPreKey.signature,
// 'key': signedPreKey.getKeyPair().publicKey.serialize(),
// };
print("Add new user: ${res}");
}
return res.isSuccess;

View file

@ -1,3 +1,4 @@
import 'package:twonly/main.dart';
import 'package:twonly/src/providers/api_provider.dart';
import '../utils.dart';
import 'package:flutter/material.dart';
@ -123,6 +124,7 @@ class _RegisterViewState extends State<RegisterView> {
usernameController.text, inviteCodeController.text);
setState(() {
_isTryingToRegister = false;
apiProvider.authenticate();
});
if (res.isSuccess) {
widget.callbackOnSuccess();