Search in sources :

Example 1 with CryptoRoom

use of org.matrix.androidsdk.crypto.interfaces.CryptoRoom in project matrix-android-sdk by matrix-org.

the class MXCryptoImpl method onRoomMembership.

/**
 * Handle a change in the membership state of a member of a room.
 *
 * @param event the membership event causing the change
 */
private void onRoomMembership(final CryptoEvent event) {
    final IMXEncrypting alg;
    synchronized (mRoomEncryptors) {
        alg = mRoomEncryptors.get(event.getRoomId());
    }
    if (null == alg) {
        // No encrypting in this room
        return;
    }
    final String userId = event.getStateKey();
    final CryptoRoom room = mSession.getDataHandler().getRoom(event.getRoomId());
    CryptoRoomMember roomMember = room.getState().getMember(userId);
    if (null != roomMember) {
        final String membership = roomMember.getMembership();
        getEncryptingThreadHandler().post(new Runnable() {

            @Override
            public void run() {
                if (TextUtils.equals(membership, CryptoRoomMember.MEMBERSHIP_JOIN)) {
                    // make sure we are tracking the deviceList for this user.
                    getDeviceList().startTrackingDeviceList(Arrays.asList(userId));
                } else if (TextUtils.equals(membership, CryptoRoomMember.MEMBERSHIP_INVITE) && room.shouldEncryptForInvitedMembers() && mCryptoConfig.mEnableEncryptionForInvitedMembers) {
                    // track the deviceList for this invited user.
                    // Caution: there's a big edge case here in that federated servers do not
                    // know what other servers are in the room at the time they've been invited.
                    // They therefore will not send device updates if a user logs in whilst
                    // their state is invite.
                    getDeviceList().startTrackingDeviceList(Arrays.asList(userId));
                }
            }
        });
    }
}
Also used : IMXEncrypting(org.matrix.androidsdk.crypto.algorithms.IMXEncrypting) CryptoRoom(org.matrix.androidsdk.crypto.interfaces.CryptoRoom) CryptoRoomMember(org.matrix.androidsdk.crypto.interfaces.CryptoRoomMember)

Example 2 with CryptoRoom

use of org.matrix.androidsdk.crypto.interfaces.CryptoRoom in project matrix-android-sdk by matrix-org.

the class MXCryptoImpl method setRoomBlacklistUnverifiedDevices.

/**
 * Manages the room black-listing for unverified devices.
 *
 * @param roomId   the room id
 * @param add      true to add the room id to the list, false to remove it.
 * @param callback the asynchronous callback
 */
private void setRoomBlacklistUnverifiedDevices(final String roomId, final boolean add, final ApiCallback<Void> callback) {
    final CryptoRoom room = mSession.getDataHandler().getRoom(roomId);
    // sanity check
    if (null == room) {
        getUIHandler().post(new Runnable() {

            @Override
            public void run() {
                callback.onSuccess(null);
            }
        });
        return;
    }
    getEncryptingThreadHandler().post(new Runnable() {

        @Override
        public void run() {
            List<String> roomIds = mCryptoStore.getRoomsListBlacklistUnverifiedDevices();
            if (add) {
                if (!roomIds.contains(roomId)) {
                    roomIds.add(roomId);
                }
            } else {
                roomIds.remove(roomId);
            }
            mCryptoStore.setRoomsListBlacklistUnverifiedDevices(roomIds);
            getUIHandler().post(new Runnable() {

                @Override
                public void run() {
                    if (null != callback) {
                        callback.onSuccess(null);
                    }
                }
            });
        }
    });
}
Also used : CryptoRoom(org.matrix.androidsdk.crypto.interfaces.CryptoRoom) MXDeviceList(org.matrix.androidsdk.crypto.MXDeviceList) List(java.util.List) ArrayList(java.util.ArrayList)

Example 3 with CryptoRoom

use of org.matrix.androidsdk.crypto.interfaces.CryptoRoom 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

CryptoRoom (org.matrix.androidsdk.crypto.interfaces.CryptoRoom)3 ArrayList (java.util.ArrayList)2 List (java.util.List)2 MXDeviceList (org.matrix.androidsdk.crypto.MXDeviceList)2 CryptoRoomMember (org.matrix.androidsdk.crypto.interfaces.CryptoRoomMember)2 ApiCallback (org.matrix.androidsdk.core.callback.ApiCallback)1 SimpleApiCallback (org.matrix.androidsdk.core.callback.SimpleApiCallback)1 MatrixError (org.matrix.androidsdk.core.model.MatrixError)1 MXDecryptionException (org.matrix.androidsdk.crypto.MXDecryptionException)1 IMXEncrypting (org.matrix.androidsdk.crypto.algorithms.IMXEncrypting)1 CryptoEventContent (org.matrix.androidsdk.crypto.interfaces.CryptoEventContent)1