/* * Famedly Matrix SDK * Copyright (C) 2019, 2020 Famedly GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import 'dart:convert'; import 'package:olm/olm.dart' as olm; import '../../famedlysdk.dart'; import '../../src/database/database.dart' show DbInboundGroupSession; import '../../src/utils/logs.dart'; class SessionKey { Map content; Map indexes; olm.InboundGroupSession inboundGroupSession; final String key; List get forwardingCurve25519KeyChain => (content['forwarding_curve25519_key_chain'] != null ? List.from(content['forwarding_curve25519_key_chain']) : null) ?? []; Map senderClaimedKeys; String senderKey; bool get isValid => inboundGroupSession != null; SessionKey( {this.content, this.inboundGroupSession, this.key, this.indexes, String senderKey, Map senderClaimedKeys}) { _setSenderKey(senderKey); _setSenderClaimedKeys(senderClaimedKeys); } SessionKey.fromDb(DbInboundGroupSession dbEntry, String key) : key = key { final parsedContent = Event.getMapFromPayload(dbEntry.content); final parsedIndexes = Event.getMapFromPayload(dbEntry.indexes); final parsedSenderClaimedKeys = Event.getMapFromPayload(dbEntry.senderClaimedKeys); content = parsedContent != null ? Map.from(parsedContent) : null; indexes = parsedIndexes != null ? Map.from(parsedIndexes) : {}; _setSenderKey(dbEntry.senderKey); _setSenderClaimedKeys(Map.from(parsedSenderClaimedKeys)); inboundGroupSession = olm.InboundGroupSession(); try { inboundGroupSession.unpickle(key, dbEntry.pickle); } catch (e, s) { dispose(); Logs.error( '[LibOlm] Unable to unpickle inboundGroupSession: ' + e.toString(), s); } } void _setSenderKey(String key) { senderKey = key ?? content['sender_key'] ?? ''; } void _setSenderClaimedKeys(Map keys) { senderClaimedKeys = (keys != null && keys.isNotEmpty) ? keys : (content['sender_claimed_keys'] is Map ? Map.from(content['sender_claimed_keys']) : (content['sender_claimed_ed25519_key'] is String ? { 'ed25519': content['sender_claimed_ed25519_key'] } : {})); } Map toJson() { final data = {}; if (content != null) { data['content'] = content; } if (indexes != null) { data['indexes'] = indexes; } data['inboundGroupSession'] = inboundGroupSession.pickle(key); return data; } void dispose() { inboundGroupSession?.free(); inboundGroupSession = null; } @override String toString() => json.encode(toJson()); }