Search in sources :

Example 1 with CryptoEventContent

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;
}
Also used : MXEventDecryptionResult(org.matrix.androidsdk.crypto.MXEventDecryptionResult) MXDecryptionException(org.matrix.androidsdk.crypto.MXDecryptionException) ArrayList(java.util.ArrayList) IMXDecrypting(org.matrix.androidsdk.crypto.algorithms.IMXDecrypting) CountDownLatch(java.util.concurrent.CountDownLatch) MXDecryptionException(org.matrix.androidsdk.crypto.MXDecryptionException) CryptoEventContent(org.matrix.androidsdk.crypto.interfaces.CryptoEventContent) MXCryptoError(org.matrix.androidsdk.crypto.MXCryptoError) Nullable(androidx.annotation.Nullable)

Example 2 with CryptoEventContent

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);
    }
}
Also used : CryptoRoom(org.matrix.androidsdk.crypto.interfaces.CryptoRoom) CryptoRoomMember(org.matrix.androidsdk.crypto.interfaces.CryptoRoomMember) SimpleApiCallback(org.matrix.androidsdk.core.callback.SimpleApiCallback) ApiCallback(org.matrix.androidsdk.core.callback.ApiCallback) CryptoEventContent(org.matrix.androidsdk.crypto.interfaces.CryptoEventContent) MXDeviceList(org.matrix.androidsdk.crypto.MXDeviceList) List(java.util.List) ArrayList(java.util.ArrayList) MatrixError(org.matrix.androidsdk.core.model.MatrixError) MXDecryptionException(org.matrix.androidsdk.crypto.MXDecryptionException)

Aggregations

ArrayList (java.util.ArrayList)2 MXDecryptionException (org.matrix.androidsdk.crypto.MXDecryptionException)2 CryptoEventContent (org.matrix.androidsdk.crypto.interfaces.CryptoEventContent)2 Nullable (androidx.annotation.Nullable)1 List (java.util.List)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 ApiCallback (org.matrix.androidsdk.core.callback.ApiCallback)1 SimpleApiCallback (org.matrix.androidsdk.core.callback.SimpleApiCallback)1 MatrixError (org.matrix.androidsdk.core.model.MatrixError)1 MXCryptoError (org.matrix.androidsdk.crypto.MXCryptoError)1 MXDeviceList (org.matrix.androidsdk.crypto.MXDeviceList)1 MXEventDecryptionResult (org.matrix.androidsdk.crypto.MXEventDecryptionResult)1 IMXDecrypting (org.matrix.androidsdk.crypto.algorithms.IMXDecrypting)1 CryptoRoom (org.matrix.androidsdk.crypto.interfaces.CryptoRoom)1 CryptoRoomMember (org.matrix.androidsdk.crypto.interfaces.CryptoRoomMember)1