use of org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent in project matrix-android-sdk by matrix-org.
the class MXMegolmDecryption method addEventToPendingList.
/**
* Add an event to the list of those we couldn't decrypt the first time we
* saw them.
*
* @param event the event to try to decrypt later
* @param timelineId the timeline identifier
*/
private void addEventToPendingList(CryptoEvent event, String timelineId) {
EncryptedEventContent encryptedEventContent = event.toEncryptedEventContent();
String senderKey = encryptedEventContent.sender_key;
String sessionId = encryptedEventContent.session_id;
String k = senderKey + "|" + sessionId;
// avoid undefined timelineId
if (TextUtils.isEmpty(timelineId)) {
timelineId = "";
}
if (!mPendingEvents.containsKey(k)) {
mPendingEvents.put(k, new HashMap<String, List<CryptoEvent>>());
}
if (!mPendingEvents.get(k).containsKey(timelineId)) {
mPendingEvents.get(k).put(timelineId, new ArrayList<CryptoEvent>());
}
if (mPendingEvents.get(k).get(timelineId).indexOf(event) < 0) {
Log.d(LOG_TAG, "## addEventToPendingList() : add Event " + event.getEventId() + " in room id " + event.getRoomId());
mPendingEvents.get(k).get(timelineId).add(event);
}
}
use of org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent in project matrix-android-sdk by matrix-org.
the class MXMegolmDecryption method decryptEvent.
@Nullable
private MXEventDecryptionResult decryptEvent(CryptoEvent event, String timeline, boolean requestKeysOnFail) throws MXDecryptionException {
// sanity check
if (null == event) {
Log.e(LOG_TAG, "## decryptEvent() : null event");
return null;
}
EncryptedEventContent encryptedEventContent = event.toEncryptedEventContent();
String senderKey = encryptedEventContent.sender_key;
String ciphertext = encryptedEventContent.ciphertext;
String sessionId = encryptedEventContent.session_id;
if (TextUtils.isEmpty(senderKey) || TextUtils.isEmpty(sessionId) || TextUtils.isEmpty(ciphertext)) {
throw new MXDecryptionException(new MXCryptoError(MXCryptoError.MISSING_FIELDS_ERROR_CODE, MXCryptoError.UNABLE_TO_DECRYPT, MXCryptoError.MISSING_FIELDS_REASON));
}
MXEventDecryptionResult eventDecryptionResult = null;
MXCryptoError cryptoError = null;
MXDecryptionResult decryptGroupMessageResult = null;
try {
decryptGroupMessageResult = mOlmDevice.decryptGroupMessage(ciphertext, event.getRoomId(), timeline, sessionId, senderKey);
} catch (MXDecryptionException e) {
cryptoError = e.getCryptoError();
}
// the decryption succeeds
if ((null != decryptGroupMessageResult) && (null != decryptGroupMessageResult.mPayload) && (null == cryptoError)) {
eventDecryptionResult = new MXEventDecryptionResult();
eventDecryptionResult.mClearEvent = decryptGroupMessageResult.mPayload;
eventDecryptionResult.mSenderCurve25519Key = decryptGroupMessageResult.mSenderKey;
if (null != decryptGroupMessageResult.mKeysClaimed) {
eventDecryptionResult.mClaimedEd25519Key = decryptGroupMessageResult.mKeysClaimed.get("ed25519");
}
eventDecryptionResult.mForwardingCurve25519KeyChain = decryptGroupMessageResult.mForwardingCurve25519KeyChain;
} else if (null != cryptoError) {
if (cryptoError.isOlmError()) {
if (TextUtils.equals("UNKNOWN_MESSAGE_INDEX", cryptoError.error)) {
addEventToPendingList(event, timeline);
if (requestKeysOnFail) {
requestKeysForEvent(event);
}
}
String reason = String.format(MXCryptoError.OLM_REASON, cryptoError.error);
String detailedReason = String.format(MXCryptoError.DETAILLED_OLM_REASON, ciphertext, cryptoError.error);
throw new MXDecryptionException(new MXCryptoError(MXCryptoError.OLM_ERROR_CODE, reason, detailedReason));
} else if (TextUtils.equals(cryptoError.errcode, MXCryptoError.UNKNOWN_INBOUND_SESSION_ID_ERROR_CODE)) {
addEventToPendingList(event, timeline);
if (requestKeysOnFail) {
requestKeysForEvent(event);
}
}
throw new MXDecryptionException(cryptoError);
}
return eventDecryptionResult;
}
use of org.matrix.androidsdk.crypto.model.crypto.EncryptedEventContent in project matrix-android-sdk by matrix-org.
the class MXMegolmDecryption method requestKeysForEvent.
/**
* Helper for the real decryptEvent and for _retryDecryption. If
* requestKeysOnFail is true, we'll send an m.room_key_request when we fail
* to decrypt the event due to missing megolm keys.
*
* @param event the event
*/
private void requestKeysForEvent(CryptoEvent event) {
String sender = event.getSender();
EncryptedEventContent wireContent = event.toEncryptedEventContent();
List<Map<String, String>> recipients = new ArrayList<>();
Map<String, String> selfMap = new HashMap<>();
selfMap.put("userId", mSession.getMyUserId());
selfMap.put("deviceId", "*");
recipients.add(selfMap);
if (!TextUtils.equals(sender, mSession.getMyUserId())) {
Map<String, String> senderMap = new HashMap<>();
senderMap.put("userId", sender);
senderMap.put("deviceId", wireContent.device_id);
recipients.add(senderMap);
}
RoomKeyRequestBody requestBody = new RoomKeyRequestBody();
requestBody.roomId = event.getRoomId();
requestBody.algorithm = wireContent.algorithm;
requestBody.senderKey = wireContent.sender_key;
requestBody.sessionId = wireContent.session_id;
mCrypto.requestRoomKey(requestBody, recipients);
}
Aggregations