Skip to content

Commit d74fdcf

Browse files
committed
feat: cleanup
1 parent ea970eb commit d74fdcf

File tree

10 files changed

+108
-138
lines changed

10 files changed

+108
-138
lines changed

lib/client/signal_client.dart

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ abstract class SignalClient with _$SignalClient {
2626
required IdentityKeyStore identityStore,
2727
required SenderKeyStore groupSenderKeyStore,
2828
}) = _SignalClient;
29-
29+
3030
// Track which groups we've sent distribution messages to (simple PoC approach)
3131
static final Map<String, Map<String, bool>> _distributedKeys = {};
3232

@@ -66,7 +66,7 @@ abstract class SignalClient with _$SignalClient {
6666
Future<void> deliver(final String userName, final String message, final Server server) async {
6767
final recipientAddresses = server.getUserAddressesByName(userName);
6868
if (recipientAddresses.isEmpty) {
69-
print('No addresses for user $userName !!!');
69+
Logger.client(protocolAddress.getName(), 'No addresses for user $userName !!!', type: LogType.error);
7070
return;
7171
}
7272

@@ -84,7 +84,11 @@ abstract class SignalClient with _$SignalClient {
8484
remoteAddress,
8585
);
8686
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+
);
8892
}
8993

9094
final sessionCipher = SessionCipher(sessionStore, preKeyStore, signedPreKeyStore, identityStore, remoteAddress);
@@ -100,7 +104,7 @@ abstract class SignalClient with _$SignalClient {
100104
final messages = server.receive(protocolAddress);
101105
final List<String> decryptedMessages = [];
102106
Logger.client(protocolAddress.getName(), 'Checking for messages: ${messages.length} found');
103-
107+
104108
for (var message in messages) {
105109
Logger.client(protocolAddress.getName(), 'Processing message from ${message.from}');
106110
final sessionCipher = SessionCipher(sessionStore, preKeyStore, signedPreKeyStore, identityStore, message.from);
@@ -111,7 +115,11 @@ abstract class SignalClient with _$SignalClient {
111115
plainText = await sessionCipher.decrypt(PreKeySignalMessage(message.ciphertext));
112116
final decryptedMessage = utf8.decode(plainText);
113117
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+
);
115123
Logger.client(protocolAddress.getName(), 'Session established with ${message.from}', type: LogType.success);
116124
} else if (message.keyType == MessageKeyType.whisper) {
117125
Logger.client(protocolAddress.getName(), 'Message is regular Signal message');
@@ -129,7 +137,7 @@ abstract class SignalClient with _$SignalClient {
129137
final preKeyRecords = await Future.wait(
130138
(preKeyStore as InMemoryPreKeyStore).store.keys.map((id) => preKeyStore.loadPreKey(id)),
131139
);
132-
140+
133141
return UserKeys(
134142
registrationId: await identityStore.getLocalRegistrationId(),
135143
identityKey: (await identityStore.getIdentityKeyPair()).getPublicKey(),
@@ -143,17 +151,14 @@ abstract class SignalClient with _$SignalClient {
143151
final sessionBuilder = GroupSessionBuilder(groupSenderKeyStore);
144152
final groupCipher = GroupCipher(groupSenderKeyStore, groupSender);
145153

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
149154
final userKey = protocolAddress.toString();
150155
_distributedKeys[userKey] ??= {};
151-
156+
152157
if (_distributedKeys[userKey]![groupId] != true) {
153158
_distributedKeys[userKey]![groupId] = true;
154159
Logger.client(protocolAddress.getName(), 'Creating new sender key for group $groupId', type: LogType.keyExchange);
155160
final distributionMessage = await sessionBuilder.create(groupSender);
156-
161+
157162
final distributionGroupMessage = GroupMessage(
158163
groupId: groupId,
159164
from: protocolAddress,
@@ -167,42 +172,56 @@ abstract class SignalClient with _$SignalClient {
167172
}
168173

169174
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+
172181
final groupMessage = GroupMessage(
173182
groupId: groupId,
174183
from: protocolAddress,
175184
messageType: GroupMessageType.regular,
176185
ciphertext: encryptedMessage,
177186
);
178-
187+
179188
server.deliverGroupMessage(groupMessage);
180189
Logger.client(protocolAddress.getName(), 'Message sent to server');
181190
}
182191

183192
Future<List<String>> receiveGroupMessages(final Server server) async {
184193
final groupMessages = server.receiveGroupMessages(protocolAddress);
185194
final List<String> decryptedMessages = [];
186-
195+
187196
for (var message in groupMessages) {
188197
final groupSender = SenderKeyName(message.groupId, message.from);
189-
198+
190199
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+
);
192204
final sessionBuilder = GroupSessionBuilder(groupSenderKeyStore);
193205
final distributionMessage = SenderKeyDistributionMessageWrapper.fromSerialized(message.ciphertext);
194206
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+
);
196212
} 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+
);
198217
final groupCipher = GroupCipher(groupSenderKeyStore, groupSender);
199218
final plaintext = await groupCipher.decrypt(message.ciphertext);
200219
final decryptedMessage = utf8.decode(plaintext);
201220
decryptedMessages.add(decryptedMessage);
202221
Logger.client(protocolAddress.getName(), 'Decrypted: "$decryptedMessage"', type: LogType.decryption);
203222
}
204223
}
205-
224+
206225
return decryptedMessages;
207226
}
208227
}

lib/common/models/group_message.dart

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,13 @@ import 'dart:typed_data';
22

33
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
44

5-
enum GroupMessageType {
6-
distribution,
7-
regular,
8-
}
5+
enum GroupMessageType { distribution, regular }
96

107
class GroupMessage {
118
final String groupId;
129
final SignalProtocolAddress from;
1310
final GroupMessageType messageType;
1411
final Uint8List ciphertext;
1512

16-
GroupMessage({
17-
required this.groupId,
18-
required this.from,
19-
required this.messageType,
20-
required this.ciphertext,
21-
});
22-
}
13+
GroupMessage({required this.groupId, required this.from, required this.messageType, required this.ciphertext});
14+
}

lib/common/models/message.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ enum MessageKeyType {
77
whisper(CiphertextMessage.whisperType);
88

99
final int value;
10+
1011
const MessageKeyType(this.value);
1112

1213
static MessageKeyType fromValue(int value) {

lib/server/models/public_prekey.dart

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,12 @@
1-
import 'dart:typed_data';
2-
31
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
42

5-
/// Public prekey information that can be safely shared with the server
63
class PublicPreKey {
74
final int id;
85
final ECPublicKey publicKey;
96

10-
PublicPreKey({
11-
required this.id,
12-
required this.publicKey,
13-
});
7+
PublicPreKey({required this.id, required this.publicKey});
148

159
static PublicPreKey fromPreKeyRecord(PreKeyRecord record) {
16-
return PublicPreKey(
17-
id: record.id,
18-
publicKey: record.getKeyPair().publicKey,
19-
);
10+
return PublicPreKey(id: record.id, publicKey: record.getKeyPair().publicKey);
2011
}
21-
}
12+
}

lib/server/models/public_signed_prekey.dart

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,14 @@ import 'dart:typed_data';
22

33
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
44

5-
/// Public signed prekey information that can be safely shared with the server
65
class PublicSignedPreKey {
76
final int id;
87
final ECPublicKey publicKey;
98
final Uint8List signature;
109

11-
PublicSignedPreKey({
12-
required this.id,
13-
required this.publicKey,
14-
required this.signature,
15-
});
10+
PublicSignedPreKey({required this.id, required this.publicKey, required this.signature});
1611

1712
static PublicSignedPreKey fromSignedPreKeyRecord(SignedPreKeyRecord record) {
18-
return PublicSignedPreKey(
19-
id: record.id,
20-
publicKey: record.getKeyPair().publicKey,
21-
signature: record.signature,
22-
);
13+
return PublicSignedPreKey(id: record.id, publicKey: record.getKeyPair().publicKey, signature: record.signature);
2314
}
24-
}
15+
}

lib/server/models/user_keys.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
33
import 'public_prekey.dart';
44
import 'public_signed_prekey.dart';
55

6-
/// Public key bundle that can be safely uploaded to the server.
7-
/// Contains only public key material, no private keys.
86
class UserKeys {
97
final int registrationId;
108
final IdentityKey identityKey;
@@ -17,4 +15,4 @@ class UserKeys {
1715
required this.signedPreKey,
1816
required this.oneTimePreKeys,
1917
});
20-
}
18+
}

lib/server/server.dart

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ class Server {
4444
}
4545

4646
void deliver(final SignalProtocolAddress from, final SignalProtocolAddress to, final CiphertextMessage ciphertext) {
47-
_messageQueue.add(Message(
48-
from: from,
49-
to: to,
50-
keyType: MessageKeyType.fromValue(ciphertext.getType()),
51-
ciphertext: ciphertext.serialize(),
52-
));
47+
_messageQueue.add(
48+
Message(
49+
from: from,
50+
to: to,
51+
keyType: MessageKeyType.fromValue(ciphertext.getType()),
52+
ciphertext: ciphertext.serialize(),
53+
),
54+
);
5355
}
5456

5557
List<Message> receive(final SignalProtocolAddress receiverAddress) {
@@ -71,17 +73,19 @@ class Server {
7173
}
7274

7375
List<GroupMessage> receiveGroupMessages(final SignalProtocolAddress receiverAddress) {
74-
final groupIds = _groupMembers.entries
75-
.where((entry) => entry.value.contains(receiverAddress))
76-
.map((entry) => entry.key)
77-
.toList();
76+
final groupIds =
77+
_groupMembers.entries
78+
.where((entry) => entry.value.contains(receiverAddress))
79+
.map((entry) => entry.key)
80+
.toList();
7881

79-
final messages = _groupMessageQueue
80-
.where((message) => groupIds.contains(message.groupId) && message.from != receiverAddress)
81-
.toList();
82+
final messages =
83+
_groupMessageQueue
84+
.where((message) => groupIds.contains(message.groupId) && message.from != receiverAddress)
85+
.toList();
8286

8387
// Don't remove messages - others might need them
84-
// In real implementation, you'd track delivery status per recipient
88+
// In real implementation, we'd track delivery status per recipient
8589
return messages;
8690
}
8791
}

lib/utils/logger.dart

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,25 @@ class Logger {
77
static const String _magenta = '\x1B[35m';
88
static const String _cyan = '\x1B[36m';
99
static const String _bold = '\x1B[1m';
10-
10+
1111
static String? _lastSource;
12-
12+
1313
static void log(String source, String message, {LogType type = LogType.info}) {
14-
// Add newline if source changes
1514
if (_lastSource != null && _lastSource != source) {
15+
// ignore: avoid_print
1616
print('');
1717
}
1818
_lastSource = source;
19-
20-
// Color based on source and type
19+
2120
String coloredSource;
2221
String coloredMessage;
23-
22+
2423
if (source.toLowerCase().contains('server')) {
2524
coloredSource = '$_yellow$_bold[SERVER]$_reset';
2625
} else {
2726
coloredSource = '$_cyan$_bold[$source]$_reset';
2827
}
29-
28+
3029
switch (type) {
3130
case LogType.encryption:
3231
coloredMessage = '$_green$message$_reset';
@@ -46,24 +45,18 @@ class Logger {
4645
default:
4746
coloredMessage = message;
4847
}
49-
48+
49+
// ignore: avoid_print
5050
print('$coloredSource $coloredMessage');
5151
}
52-
52+
5353
static void server(String message) {
5454
log('SERVER', message);
5555
}
56-
56+
5757
static void client(String clientName, String message, {LogType type = LogType.info}) {
5858
log(clientName, message, type: type);
5959
}
6060
}
6161

62-
enum LogType {
63-
info,
64-
encryption,
65-
decryption,
66-
keyExchange,
67-
error,
68-
success,
69-
}
62+
enum LogType { info, encryption, decryption, keyExchange, error, success }

0 commit comments

Comments
 (0)