@@ -26,7 +26,7 @@ abstract class SignalClient with _$SignalClient {
26
26
required IdentityKeyStore identityStore,
27
27
required SenderKeyStore groupSenderKeyStore,
28
28
}) = _SignalClient ;
29
-
29
+
30
30
// Track which groups we've sent distribution messages to (simple PoC approach)
31
31
static final Map <String , Map <String , bool >> _distributedKeys = {};
32
32
@@ -66,7 +66,7 @@ abstract class SignalClient with _$SignalClient {
66
66
Future <void > deliver (final String userName, final String message, final Server server) async {
67
67
final recipientAddresses = server.getUserAddressesByName (userName);
68
68
if (recipientAddresses.isEmpty) {
69
- print ( 'No addresses for user $userName !!!' );
69
+ Logger . client (protocolAddress. getName (), 'No addresses for user $userName !!!' , type : LogType .error );
70
70
return ;
71
71
}
72
72
@@ -84,7 +84,11 @@ abstract class SignalClient with _$SignalClient {
84
84
remoteAddress,
85
85
);
86
86
await sessionBuilder.processPreKeyBundle (deviceBundle);
87
- Logger .client (protocolAddress.getName (), 'X3DH key agreement completed with $remoteAddress ' , type: LogType .keyExchange);
87
+ Logger .client (
88
+ protocolAddress.getName (),
89
+ 'X3DH key agreement completed with $remoteAddress ' ,
90
+ type: LogType .keyExchange,
91
+ );
88
92
}
89
93
90
94
final sessionCipher = SessionCipher (sessionStore, preKeyStore, signedPreKeyStore, identityStore, remoteAddress);
@@ -100,7 +104,7 @@ abstract class SignalClient with _$SignalClient {
100
104
final messages = server.receive (protocolAddress);
101
105
final List <String > decryptedMessages = [];
102
106
Logger .client (protocolAddress.getName (), 'Checking for messages: ${messages .length } found' );
103
-
107
+
104
108
for (var message in messages) {
105
109
Logger .client (protocolAddress.getName (), 'Processing message from ${message .from }' );
106
110
final sessionCipher = SessionCipher (sessionStore, preKeyStore, signedPreKeyStore, identityStore, message.from);
@@ -111,7 +115,11 @@ abstract class SignalClient with _$SignalClient {
111
115
plainText = await sessionCipher.decrypt (PreKeySignalMessage (message.ciphertext));
112
116
final decryptedMessage = utf8.decode (plainText);
113
117
decryptedMessages.add (decryptedMessage);
114
- Logger .client (protocolAddress.getName (), 'Decrypted initial message: "$decryptedMessage "' , type: LogType .decryption);
118
+ Logger .client (
119
+ protocolAddress.getName (),
120
+ 'Decrypted initial message: "$decryptedMessage "' ,
121
+ type: LogType .decryption,
122
+ );
115
123
Logger .client (protocolAddress.getName (), 'Session established with ${message .from }' , type: LogType .success);
116
124
} else if (message.keyType == MessageKeyType .whisper) {
117
125
Logger .client (protocolAddress.getName (), 'Message is regular Signal message' );
@@ -129,7 +137,7 @@ abstract class SignalClient with _$SignalClient {
129
137
final preKeyRecords = await Future .wait (
130
138
(preKeyStore as InMemoryPreKeyStore ).store.keys.map ((id) => preKeyStore.loadPreKey (id)),
131
139
);
132
-
140
+
133
141
return UserKeys (
134
142
registrationId: await identityStore.getLocalRegistrationId (),
135
143
identityKey: (await identityStore.getIdentityKeyPair ()).getPublicKey (),
@@ -143,17 +151,14 @@ abstract class SignalClient with _$SignalClient {
143
151
final sessionBuilder = GroupSessionBuilder (groupSenderKeyStore);
144
152
final groupCipher = GroupCipher (groupSenderKeyStore, groupSender);
145
153
146
- // Check if we need to create and distribute a new sender key
147
- final senderKeyStore = groupSenderKeyStore as InMemorySenderKeyStore ;
148
- // Simple tracking: use a map to remember which groups we've sent keys to
149
154
final userKey = protocolAddress.toString ();
150
155
_distributedKeys[userKey] ?? = {};
151
-
156
+
152
157
if (_distributedKeys[userKey]! [groupId] != true ) {
153
158
_distributedKeys[userKey]! [groupId] = true ;
154
159
Logger .client (protocolAddress.getName (), 'Creating new sender key for group $groupId ' , type: LogType .keyExchange);
155
160
final distributionMessage = await sessionBuilder.create (groupSender);
156
-
161
+
157
162
final distributionGroupMessage = GroupMessage (
158
163
groupId: groupId,
159
164
from: protocolAddress,
@@ -167,42 +172,56 @@ abstract class SignalClient with _$SignalClient {
167
172
}
168
173
169
174
final encryptedMessage = await groupCipher.encrypt (Uint8List .fromList (utf8.encode (message)));
170
- Logger .client (protocolAddress.getName (), 'Encrypted message "$message " for group $groupId ' , type: LogType .encryption);
171
-
175
+ Logger .client (
176
+ protocolAddress.getName (),
177
+ 'Encrypted message "$message " for group $groupId ' ,
178
+ type: LogType .encryption,
179
+ );
180
+
172
181
final groupMessage = GroupMessage (
173
182
groupId: groupId,
174
183
from: protocolAddress,
175
184
messageType: GroupMessageType .regular,
176
185
ciphertext: encryptedMessage,
177
186
);
178
-
187
+
179
188
server.deliverGroupMessage (groupMessage);
180
189
Logger .client (protocolAddress.getName (), 'Message sent to server' );
181
190
}
182
191
183
192
Future <List <String >> receiveGroupMessages (final Server server) async {
184
193
final groupMessages = server.receiveGroupMessages (protocolAddress);
185
194
final List <String > decryptedMessages = [];
186
-
195
+
187
196
for (var message in groupMessages) {
188
197
final groupSender = SenderKeyName (message.groupId, message.from);
189
-
198
+
190
199
if (message.messageType == GroupMessageType .distribution) {
191
- Logger .client (protocolAddress.getName (), 'Processing distribution message from ${message .from .getName ()} for group ${message .groupId }' );
200
+ Logger .client (
201
+ protocolAddress.getName (),
202
+ 'Processing distribution message from ${message .from .getName ()} for group ${message .groupId }' ,
203
+ );
192
204
final sessionBuilder = GroupSessionBuilder (groupSenderKeyStore);
193
205
final distributionMessage = SenderKeyDistributionMessageWrapper .fromSerialized (message.ciphertext);
194
206
await sessionBuilder.process (groupSender, distributionMessage);
195
- Logger .client (protocolAddress.getName (), 'Stored sender key from ${message .from .getName ()} for group ${message .groupId }' , type: LogType .keyExchange);
207
+ Logger .client (
208
+ protocolAddress.getName (),
209
+ 'Stored sender key from ${message .from .getName ()} for group ${message .groupId }' ,
210
+ type: LogType .keyExchange,
211
+ );
196
212
} else {
197
- Logger .client (protocolAddress.getName (), 'Decrypting message from ${message .from .getName ()} in group ${message .groupId }' );
213
+ Logger .client (
214
+ protocolAddress.getName (),
215
+ 'Decrypting message from ${message .from .getName ()} in group ${message .groupId }' ,
216
+ );
198
217
final groupCipher = GroupCipher (groupSenderKeyStore, groupSender);
199
218
final plaintext = await groupCipher.decrypt (message.ciphertext);
200
219
final decryptedMessage = utf8.decode (plaintext);
201
220
decryptedMessages.add (decryptedMessage);
202
221
Logger .client (protocolAddress.getName (), 'Decrypted: "$decryptedMessage "' , type: LogType .decryption);
203
222
}
204
223
}
205
-
224
+
206
225
return decryptedMessages;
207
226
}
208
227
}
0 commit comments