use of org.matrix.androidsdk.crypto.interfaces.CryptoEventContent in project matrix-android-sdk by matrix-org.
the class MXCryptoImpl method decryptEvent.
/**
* Decrypt an event
*
* @param event the raw event.
* @param timeline the id of the timeline where the event is decrypted. It is used to prevent replay attack.
* @return the MXEventDecryptionResult data, or null in case of error
*/
@Override
@Nullable
public MXEventDecryptionResult decryptEvent(final CryptoEvent event, final String timeline) throws MXDecryptionException {
if (null == event) {
Log.e(LOG_TAG, "## decryptEvent : null event");
return null;
}
final CryptoEventContent eventContent = event.getWireEventContent();
if (null == eventContent) {
Log.e(LOG_TAG, "## decryptEvent : empty event content");
return null;
}
final List<MXEventDecryptionResult> results = new ArrayList<>();
final CountDownLatch lock = new CountDownLatch(1);
final List<MXDecryptionException> exceptions = new ArrayList<>();
getDecryptingThreadHandler().post(new Runnable() {
@Override
public void run() {
MXEventDecryptionResult result = null;
IMXDecrypting alg = getRoomDecryptor(event.getRoomId(), eventContent.getAlgorithm());
if (null == alg) {
String reason = String.format(MXCryptoError.UNABLE_TO_DECRYPT_REASON, event.getEventId(), eventContent.getAlgorithm());
Log.e(LOG_TAG, "## decryptEvent() : " + reason);
exceptions.add(new MXDecryptionException(new MXCryptoError(MXCryptoError.UNABLE_TO_DECRYPT_ERROR_CODE, MXCryptoError.UNABLE_TO_DECRYPT, reason)));
} else {
try {
result = alg.decryptEvent(event, timeline);
} catch (MXDecryptionException decryptionException) {
exceptions.add(decryptionException);
}
if (null != result) {
results.add(result);
}
}
lock.countDown();
}
});
try {
lock.await();
} catch (Exception e) {
Log.e(LOG_TAG, "## decryptEvent() : failed " + e.getMessage(), e);
}
if (!exceptions.isEmpty()) {
throw exceptions.get(0);
}
if (!results.isEmpty()) {
return results.get(0);
}
return null;
}
use of org.matrix.androidsdk.crypto.interfaces.CryptoEventContent in project matrix-android-sdk by matrix-org.
the class MXCryptoImpl method onCryptoEvent.
/**
* Handle an m.room.encryption event.
*
* @param event the encryption event.
*/
private void onCryptoEvent(final CryptoEvent event) {
final CryptoEventContent eventContent = event.getWireEventContent();
final CryptoRoom room = mSession.getDataHandler().getRoom(event.getRoomId());
// Check whether the event content must be encrypted for the invited members.
boolean encryptForInvitedMembers = mCryptoConfig.mEnableEncryptionForInvitedMembers && room.shouldEncryptForInvitedMembers();
ApiCallback<List<CryptoRoomMember>> callback = new ApiCallback<List<CryptoRoomMember>>() {
@Override
public void onSuccess(final List<CryptoRoomMember> info) {
getEncryptingThreadHandler().post(new Runnable() {
@Override
public void run() {
setEncryptionInRoom(event.getRoomId(), eventContent.getAlgorithm(), true, info);
}
});
}
private void onError() {
// Ensure setEncryption in room is done, even if there is a failure to fetch the room members
getEncryptingThreadHandler().post(new Runnable() {
@Override
public void run() {
setEncryptionInRoom(event.getRoomId(), eventContent.getAlgorithm(), true, room.getState().getLoadedMembersCrypto());
}
});
}
@Override
public void onNetworkError(Exception e) {
Log.w(LOG_TAG, "[MXCrypto] onCryptoEvent: Warning: Unable to get all members from the HS. Fallback by using lazy-loaded members", e);
onError();
}
@Override
public void onMatrixError(MatrixError e) {
Log.w(LOG_TAG, "[MXCrypto] onCryptoEvent: Warning: Unable to get all members from the HS. Fallback by using lazy-loaded members");
onError();
}
@Override
public void onUnexpectedError(Exception e) {
Log.w(LOG_TAG, "[MXCrypto] onCryptoEvent: Warning: Unable to get all members from the HS. Fallback by using lazy-loaded members", e);
onError();
}
};
if (encryptForInvitedMembers) {
room.getActiveMembersAsyncCrypto(callback);
} else {
room.getJoinedMembersAsyncCrypto(callback);
}
}
Aggregations