refactor: high-level loops
This commit is contained in:
parent
c248de0d04
commit
08043c06f4
|
|
@ -121,10 +121,7 @@ class SSSS {
|
||||||
static Uint8List decodeRecoveryKey(String recoveryKey) {
|
static Uint8List decodeRecoveryKey(String recoveryKey) {
|
||||||
final result = base58.decode(recoveryKey.replaceAll(' ', ''));
|
final result = base58.decode(recoveryKey.replaceAll(' ', ''));
|
||||||
|
|
||||||
var parity = 0;
|
final parity = result.fold(0, (a, b) => a ^ b);
|
||||||
for (final b in result) {
|
|
||||||
parity ^= b;
|
|
||||||
}
|
|
||||||
if (parity != 0) {
|
if (parity != 0) {
|
||||||
throw Exception('Incorrect parity');
|
throw Exception('Incorrect parity');
|
||||||
}
|
}
|
||||||
|
|
@ -144,15 +141,8 @@ class SSSS {
|
||||||
}
|
}
|
||||||
|
|
||||||
static String encodeRecoveryKey(Uint8List recoveryKey) {
|
static String encodeRecoveryKey(Uint8List recoveryKey) {
|
||||||
final keyToEncode = <int>[];
|
final keyToEncode = <int>[...olmRecoveryKeyPrefix, ...recoveryKey];
|
||||||
for (final b in olmRecoveryKeyPrefix) {
|
final parity = keyToEncode.fold(0, (a, b) => a ^ b);
|
||||||
keyToEncode.add(b);
|
|
||||||
}
|
|
||||||
keyToEncode.addAll(recoveryKey);
|
|
||||||
var parity = 0;
|
|
||||||
for (final b in keyToEncode) {
|
|
||||||
parity ^= b;
|
|
||||||
}
|
|
||||||
keyToEncode.add(parity);
|
keyToEncode.add(parity);
|
||||||
// base58-encode and add a space every four chars
|
// base58-encode and add a space every four chars
|
||||||
return base58
|
return base58
|
||||||
|
|
@ -233,10 +223,12 @@ class SSSS {
|
||||||
const keyidByteLength = 24;
|
const keyidByteLength = 24;
|
||||||
|
|
||||||
// make sure we generate a unique key id
|
// make sure we generate a unique key id
|
||||||
var keyId = base64.encode(SecureRandom(keyidByteLength).bytes);
|
final keyId = () sync* {
|
||||||
while (getKey(keyId) != null) {
|
for (;;) {
|
||||||
keyId = base64.encode(SecureRandom(keyidByteLength).bytes);
|
yield base64.encode(SecureRandom(keyidByteLength).bytes);
|
||||||
}
|
}
|
||||||
|
}()
|
||||||
|
.firstWhere((keyId) => getKey(keyId) == null);
|
||||||
|
|
||||||
final accountDataType = EventTypes.secretStorageKey(keyId);
|
final accountDataType = EventTypes.secretStorageKey(keyId);
|
||||||
// noooow we set the account data
|
// noooow we set the account data
|
||||||
|
|
@ -553,11 +545,7 @@ class SSSS {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (data.content['encrypted'] is Map) {
|
if (data.content['encrypted'] is Map) {
|
||||||
final Set keys = <String>{};
|
return data.content['encrypted'].keys.toSet();
|
||||||
for (final key in data.content['encrypted'].keys) {
|
|
||||||
keys.add(key);
|
|
||||||
}
|
|
||||||
return keys;
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -227,15 +227,15 @@ class Client extends MatrixApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
Room getRoomByAlias(String alias) {
|
Room getRoomByAlias(String alias) {
|
||||||
for (var i = 0; i < rooms.length; i++) {
|
for (final room in rooms) {
|
||||||
if (rooms[i].canonicalAlias == alias) return rooms[i];
|
if (room.canonicalAlias == alias) return room;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Room getRoomById(String id) {
|
Room getRoomById(String id) {
|
||||||
for (var j = 0; j < rooms.length; j++) {
|
for (final room in rooms) {
|
||||||
if (rooms[j].id == id) return rooms[j];
|
if (room.id == id) return room;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -269,15 +269,12 @@ class Client extends MatrixApi {
|
||||||
.id;
|
.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (var i = 0; i < rooms.length; i++) {
|
for (final room in rooms) {
|
||||||
if (rooms[i].membership == Membership.invite &&
|
if (room.membership == Membership.invite &&
|
||||||
rooms[i].getState(EventTypes.RoomMember, userID)?.senderId ==
|
room.getState(EventTypes.RoomMember, userID)?.senderId == userId &&
|
||||||
userId &&
|
room.getState(EventTypes.RoomMember, userID).content['is_direct'] ==
|
||||||
rooms[i]
|
|
||||||
.getState(EventTypes.RoomMember, userID)
|
|
||||||
.content['is_direct'] ==
|
|
||||||
true) {
|
true) {
|
||||||
return rooms[i].id;
|
return room.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1216,23 +1213,23 @@ class Client extends MatrixApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _handleEphemerals(String id, List<dynamic> events) async {
|
Future<void> _handleEphemerals(String id, List<dynamic> events) async {
|
||||||
for (num i = 0; i < events.length; i++) {
|
for (final event in events) {
|
||||||
await _handleEvent(events[i], id, EventUpdateType.ephemeral);
|
await _handleEvent(event, id, EventUpdateType.ephemeral);
|
||||||
|
|
||||||
// Receipt events are deltas between two states. We will create a
|
// Receipt events are deltas between two states. We will create a
|
||||||
// fake room account data event for this and store the difference
|
// fake room account data event for this and store the difference
|
||||||
// there.
|
// there.
|
||||||
if (events[i]['type'] == 'm.receipt') {
|
if (event['type'] == 'm.receipt') {
|
||||||
var room = getRoomById(id);
|
var room = getRoomById(id);
|
||||||
room ??= Room(id: id);
|
room ??= Room(id: id);
|
||||||
|
|
||||||
var receiptStateContent =
|
var receiptStateContent =
|
||||||
room.roomAccountData['m.receipt']?.content ?? {};
|
room.roomAccountData['m.receipt']?.content ?? {};
|
||||||
for (var eventEntry in events[i]['content'].entries) {
|
for (var eventEntry in event['content'].entries) {
|
||||||
final String eventID = eventEntry.key;
|
final String eventID = eventEntry.key;
|
||||||
if (events[i]['content'][eventID]['m.read'] != null) {
|
if (event['content'][eventID]['m.read'] != null) {
|
||||||
final Map<String, dynamic> userTimestampMap =
|
final Map<String, dynamic> userTimestampMap =
|
||||||
events[i]['content'][eventID]['m.read'];
|
event['content'][eventID]['m.read'];
|
||||||
for (var userTimestampMapEntry in userTimestampMap.entries) {
|
for (var userTimestampMapEntry in userTimestampMap.entries) {
|
||||||
final mxid = userTimestampMapEntry.key;
|
final mxid = userTimestampMapEntry.key;
|
||||||
|
|
||||||
|
|
@ -1253,8 +1250,8 @@ class Client extends MatrixApi {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
events[i]['content'] = receiptStateContent;
|
event['content'] = receiptStateContent;
|
||||||
await _handleEvent(events[i], id, EventUpdateType.accountData);
|
await _handleEvent(event, id, EventUpdateType.accountData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1262,8 +1259,8 @@ class Client extends MatrixApi {
|
||||||
Future<void> _handleRoomEvents(
|
Future<void> _handleRoomEvents(
|
||||||
String chat_id, List<dynamic> events, EventUpdateType type,
|
String chat_id, List<dynamic> events, EventUpdateType type,
|
||||||
{bool sortAtTheEnd = false}) async {
|
{bool sortAtTheEnd = false}) async {
|
||||||
for (num i = 0; i < events.length; i++) {
|
for (final event in events) {
|
||||||
await _handleEvent(events[i], chat_id, type, sortAtTheEnd: sortAtTheEnd);
|
await _handleEvent(event, chat_id, type, sortAtTheEnd: sortAtTheEnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1490,10 +1487,10 @@ sort order of ${prevState.sortOrder}. This should never happen...''');
|
||||||
|
|
||||||
Future<Set<String>> _getUserIdsInEncryptedRooms() async {
|
Future<Set<String>> _getUserIdsInEncryptedRooms() async {
|
||||||
var userIds = <String>{};
|
var userIds = <String>{};
|
||||||
for (var i = 0; i < rooms.length; i++) {
|
for (final room in rooms) {
|
||||||
if (rooms[i].encrypted) {
|
if (room.encrypted) {
|
||||||
try {
|
try {
|
||||||
var userList = await rooms[i].requestParticipants();
|
var userList = await room.requestParticipants();
|
||||||
for (var user in userList) {
|
for (var user in userList) {
|
||||||
if ([Membership.join, Membership.invite]
|
if ([Membership.join, Membership.invite]
|
||||||
.contains(user.membership)) {
|
.contains(user.membership)) {
|
||||||
|
|
@ -1872,9 +1869,9 @@ sort order of ${prevState.sortOrder}. This should never happen...''');
|
||||||
if (globalPushRules == null) return false;
|
if (globalPushRules == null) return false;
|
||||||
|
|
||||||
if (globalPushRules['override'] is List) {
|
if (globalPushRules['override'] is List) {
|
||||||
for (var i = 0; i < globalPushRules['override'].length; i++) {
|
for (final pushRule in globalPushRules['override']) {
|
||||||
if (globalPushRules['override'][i]['rule_id'] == '.m.rule.master') {
|
if (pushRule['rule_id'] == '.m.rule.master') {
|
||||||
return globalPushRules['override'][i]['enabled'];
|
return pushRule['enabled'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -679,20 +679,12 @@ class Database extends _$Database {
|
||||||
|
|
||||||
Future<List<sdk.User>> getUsers(int clientId, sdk.Room room) async {
|
Future<List<sdk.User>> getUsers(int clientId, sdk.Room room) async {
|
||||||
final res = await dbGetUsers(clientId, room.id).get();
|
final res = await dbGetUsers(clientId, room.id).get();
|
||||||
final ret = <sdk.User>[];
|
return res.map((r) => sdk.Event.fromDb(r, room).asUser).toList();
|
||||||
for (final r in res) {
|
|
||||||
ret.add(sdk.Event.fromDb(r, room).asUser);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<sdk.Event>> getEventList(int clientId, sdk.Room room) async {
|
Future<List<sdk.Event>> getEventList(int clientId, sdk.Room room) async {
|
||||||
final res = await dbGetEventList(clientId, room.id).get();
|
final res = await dbGetEventList(clientId, room.id).get();
|
||||||
final eventList = <sdk.Event>[];
|
return res.map((r) => sdk.Event.fromDb(r, room)).toList();
|
||||||
for (final r in res) {
|
|
||||||
eventList.add(sdk.Event.fromDb(r, room));
|
|
||||||
}
|
|
||||||
return eventList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Uint8List> getFile(String mxcUri) async {
|
Future<Uint8List> getFile(String mxcUri) async {
|
||||||
|
|
|
||||||
|
|
@ -274,13 +274,7 @@ class Event extends MatrixEvent {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var toRemoveList = <String>[];
|
content.removeWhere((k, v) => !contentKeyWhiteList.contains(k));
|
||||||
for (var entry in content.entries) {
|
|
||||||
if (!contentKeyWhiteList.contains(entry.key)) {
|
|
||||||
toRemoveList.add(entry.key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
toRemoveList.forEach((s) => content.remove(s));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the body of this event if it has a body.
|
/// Returns the body of this event if it has a body.
|
||||||
|
|
|
||||||
|
|
@ -262,13 +262,8 @@ class Room {
|
||||||
}
|
}
|
||||||
if (client.directChats is Map<String, dynamic>) {
|
if (client.directChats is Map<String, dynamic>) {
|
||||||
client.directChats.forEach((String userId, dynamic roomIds) {
|
client.directChats.forEach((String userId, dynamic roomIds) {
|
||||||
if (roomIds is List<dynamic>) {
|
if (roomIds is List<dynamic> && roomIds.contains(id)) {
|
||||||
for (var i = 0; i < roomIds.length; i++) {
|
returnUserId = userId;
|
||||||
if (roomIds[i] == id) {
|
|
||||||
returnUserId = userId;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -323,11 +318,7 @@ class Room {
|
||||||
List<User> get typingUsers {
|
List<User> get typingUsers {
|
||||||
if (!ephemerals.containsKey('m.typing')) return [];
|
if (!ephemerals.containsKey('m.typing')) return [];
|
||||||
List<dynamic> typingMxid = ephemerals['m.typing'].content['user_ids'];
|
List<dynamic> typingMxid = ephemerals['m.typing'].content['user_ids'];
|
||||||
var typingUsers = <User>[];
|
return typingMxid.cast<String>().map(getUserByMXIDSync).toList();
|
||||||
for (var i = 0; i < typingMxid.length; i++) {
|
|
||||||
typingUsers.add(getUserByMXIDSync(typingMxid[i]));
|
|
||||||
}
|
|
||||||
return typingUsers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Your current client instance.
|
/// Your current client instance.
|
||||||
|
|
@ -384,9 +375,9 @@ class Room {
|
||||||
}
|
}
|
||||||
if (heroes.isNotEmpty) {
|
if (heroes.isNotEmpty) {
|
||||||
var displayname = '';
|
var displayname = '';
|
||||||
for (var i = 0; i < heroes.length; i++) {
|
for (final hero in heroes) {
|
||||||
if (heroes[i].isEmpty) continue;
|
if (hero.isEmpty) continue;
|
||||||
displayname += getUserByMXIDSync(heroes[i]).calcDisplayname() + ', ';
|
displayname += getUserByMXIDSync(hero).calcDisplayname() + ', ';
|
||||||
}
|
}
|
||||||
return displayname.substring(0, displayname.length - 2);
|
return displayname.substring(0, displayname.length - 2);
|
||||||
}
|
}
|
||||||
|
|
@ -781,11 +772,7 @@ class Room {
|
||||||
|
|
||||||
if (inReplyTo != null) {
|
if (inReplyTo != null) {
|
||||||
var replyText = '<${inReplyTo.senderId}> ' + inReplyTo.body;
|
var replyText = '<${inReplyTo.senderId}> ' + inReplyTo.body;
|
||||||
var replyTextLines = replyText.split('\n');
|
replyText = replyText.split('\n').map((line) => '> $line').join('\n');
|
||||||
for (var i = 0; i < replyTextLines.length; i++) {
|
|
||||||
replyTextLines[i] = '> ' + replyTextLines[i];
|
|
||||||
}
|
|
||||||
replyText = replyTextLines.join('\n');
|
|
||||||
content['format'] = 'org.matrix.custom.html';
|
content['format'] = 'org.matrix.custom.html';
|
||||||
// be sure that we strip any previous reply fallbacks
|
// be sure that we strip any previous reply fallbacks
|
||||||
final replyHtml = (inReplyTo.formattedText.isNotEmpty
|
final replyHtml = (inReplyTo.formattedText.isNotEmpty
|
||||||
|
|
@ -1465,11 +1452,9 @@ class Room {
|
||||||
if (globalPushRules == null) return PushRuleState.notify;
|
if (globalPushRules == null) return PushRuleState.notify;
|
||||||
|
|
||||||
if (globalPushRules['override'] is List) {
|
if (globalPushRules['override'] is List) {
|
||||||
for (var i = 0; i < globalPushRules['override'].length; i++) {
|
for (final pushRule in globalPushRules['override']) {
|
||||||
if (globalPushRules['override'][i]['rule_id'] == id) {
|
if (pushRule['rule_id'] == id) {
|
||||||
if (globalPushRules['override'][i]['actions']
|
if (pushRule['actions'].indexOf('dont_notify') != -1) {
|
||||||
.indexOf('dont_notify') !=
|
|
||||||
-1) {
|
|
||||||
return PushRuleState.dontNotify;
|
return PushRuleState.dontNotify;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -1478,10 +1463,9 @@ class Room {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (globalPushRules['room'] is List) {
|
if (globalPushRules['room'] is List) {
|
||||||
for (var i = 0; i < globalPushRules['room'].length; i++) {
|
for (final pushRule in globalPushRules['room']) {
|
||||||
if (globalPushRules['room'][i]['rule_id'] == id) {
|
if (pushRule['rule_id'] == id) {
|
||||||
if (globalPushRules['room'][i]['actions'].indexOf('dont_notify') !=
|
if (pushRule['actions'].indexOf('dont_notify') != -1) {
|
||||||
-1) {
|
|
||||||
return PushRuleState.mentionsOnly;
|
return PushRuleState.mentionsOnly;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -51,8 +51,8 @@ class Timeline {
|
||||||
/// found, requests from the server. Requested events
|
/// found, requests from the server. Requested events
|
||||||
/// are cached.
|
/// are cached.
|
||||||
Future<Event> getEventById(String id) async {
|
Future<Event> getEventById(String id) async {
|
||||||
for (var i = 0; i < events.length; i++) {
|
for (final event in events) {
|
||||||
if (events[i].eventId == id) return events[i];
|
if (event.eventId == id) return event;
|
||||||
}
|
}
|
||||||
if (_eventCache.containsKey(id)) return _eventCache[id];
|
if (_eventCache.containsKey(id)) return _eventCache[id];
|
||||||
final requestedEvent = await room.getEventById(id);
|
final requestedEvent = await room.getEventById(id);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue