use of org.matrix.androidsdk.common.CryptoTestData in project matrix-android-sdk by matrix-org.
the class CryptoTest method test22_testDownloadKeysForUserWithNoDevice.
@Test
public void test22_testDownloadKeysForUserWithNoDevice() throws Exception {
Log.e(LOG_TAG, "test22_testDownloadKeysForUserWithNoDevice");
Context context = InstrumentationRegistry.getContext();
final Map<String, Object> results = new HashMap<>();
CryptoTestData cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false);
final MXSession aliceSession = cryptoTestData.getFirstSession();
final String aliceRoomId = cryptoTestData.getRoomId();
final MXSession bobSession = cryptoTestData.getSecondSession();
aliceSession.getCrypto().setWarnOnUnknownDevices(false);
CountDownLatch lock1 = new CountDownLatch(1);
aliceSession.getCrypto().getDeviceList().downloadKeys(Arrays.asList(bobSession.getMyUserId()), false, new TestApiCallback<MXUsersDevicesMap<MXDeviceInfo>>(lock1) {
@Override
public void onSuccess(MXUsersDevicesMap<MXDeviceInfo> info) {
results.put("downloadKeys", info);
super.onSuccess(info);
}
});
mTestHelper.await(lock1);
Assert.assertTrue(results.containsKey("downloadKeys"));
MXUsersDevicesMap<MXDeviceInfo> usersDevicesInfoMap = (MXUsersDevicesMap<MXDeviceInfo>) results.get("downloadKeys");
// MXCrypto.downloadKeys should return @[] for Bob to distinguish him from an unknown user
List<String> bobDevices = usersDevicesInfoMap.getUserDeviceIds(bobSession.getMyUserId());
Assert.assertNotNull(bobDevices);
Assert.assertTrue(bobDevices.isEmpty());
// try again
// it should not failed
CountDownLatch lock2 = new CountDownLatch(1);
aliceSession.getCrypto().getDeviceList().downloadKeys(Arrays.asList(bobSession.getMyUserId()), false, new TestApiCallback<MXUsersDevicesMap<MXDeviceInfo>>(lock2) {
@Override
public void onSuccess(MXUsersDevicesMap<MXDeviceInfo> info) {
results.put("downloadKeys2", info);
super.onSuccess(info);
}
});
mTestHelper.await(lock2);
Assert.assertTrue(results.containsKey("downloadKeys2"));
cryptoTestData.clear(context);
}
use of org.matrix.androidsdk.common.CryptoTestData in project matrix-android-sdk by matrix-org.
the class CryptoTest method test19_testAliceWithNewDeviceAndBobWithNewDevice.
@Test
public void test19_testAliceWithNewDeviceAndBobWithNewDevice() throws Exception {
Log.e(LOG_TAG, "test19_testAliceWithNewDeviceAndBobWithNewDevice");
Context context = InstrumentationRegistry.getContext();
final Map<String, Object> results = new HashMap<>();
CryptoTestData cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true);
final MXSession aliceSession = cryptoTestData.getFirstSession();
final String aliceRoomId = cryptoTestData.getRoomId();
final MXSession bobSession = cryptoTestData.getSecondSession();
bobSession.getCrypto().setWarnOnUnknownDevices(false);
aliceSession.getCrypto().setWarnOnUnknownDevices(false);
final Room roomFromBobPOV = bobSession.getDataHandler().getRoom(aliceRoomId);
final Room roomFromAlicePOV = aliceSession.getDataHandler().getRoom(aliceRoomId);
String bobUserId1 = bobSession.getMyUserId();
String aliceUserId1 = aliceSession.getMyUserId();
Assert.assertTrue(roomFromBobPOV.isEncrypted());
Assert.assertTrue(roomFromAlicePOV.isEncrypted());
final CountDownLatch lock1 = new CountDownLatch(2);
MXEventListener bobEventListener = new MXEventListener() {
@Override
public void onToDeviceEvent(Event event) {
if (!results.containsKey("onToDeviceEvent")) {
results.put("onToDeviceEvent", event);
lock1.countDown();
}
}
};
bobSession.getDataHandler().addListener(bobEventListener);
final List<Event> receivedEvents = new ArrayList<>();
EventTimeline.Listener eventTimelineListener = new EventTimeline.Listener() {
public void onEvent(Event event, EventTimeline.Direction direction, RoomState roomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE)) {
receivedEvents.add(event);
lock1.countDown();
}
}
};
roomFromBobPOV.getTimeline().addEventTimelineListener(eventTimelineListener);
String aliceMessage1 = "Hello I'm Alice!";
roomFromAlicePOV.sendEvent(mCryptoTestHelper.buildTextEvent(aliceMessage1, aliceSession, aliceRoomId), new SimpleApiCallback<Void>() {
@Override
public void onSuccess(Void info) {
// Ignore
}
});
mTestHelper.await(lock1);
Assert.assertTrue(results.containsKey("onToDeviceEvent"));
Assert.assertEquals(1, receivedEvents.size());
Event event = receivedEvents.get(0);
mCryptoTestHelper.checkEncryptedEvent(event, aliceRoomId, aliceMessage1, aliceSession);
// logout
CountDownLatch lock2 = new CountDownLatch(1);
bobSession.logout(context, new TestApiCallback<Void>(lock2) {
@Override
public void onSuccess(Void info) {
results.put("boblogout", "boblogout");
super.onSuccess(info);
}
});
mTestHelper.await(lock2);
Assert.assertTrue(results.containsKey("boblogout"));
CountDownLatch lock3 = new CountDownLatch(1);
aliceSession.logout(context, new TestApiCallback<Void>(lock3) {
@Override
public void onSuccess(Void info) {
results.put("alicelogout", "alicelogout");
super.onSuccess(info);
}
});
mTestHelper.await(lock3);
Assert.assertTrue(results.containsKey("alicelogout"));
MXSession bobSession2 = mTestHelper.logIntoAccount(bobSession.getMyUserId(), mCryptoTestHelper.getEncryptedSessionParams());
Assert.assertNotNull(bobSession2);
bobSession2.getCrypto().setWarnOnUnknownDevices(false);
MXSession aliceSession2 = mTestHelper.logIntoAccount(aliceSession.getMyUserId(), mCryptoTestHelper.getEncryptedSessionParams());
Assert.assertNotNull(aliceSession2);
aliceSession2.getCrypto().setWarnOnUnknownDevices(false);
Room roomFromBob2POV = bobSession2.getDataHandler().getRoom(aliceRoomId);
Room roomFromAlice2POV = aliceSession2.getDataHandler().getRoom(aliceRoomId);
Assert.assertTrue(roomFromBob2POV.isEncrypted());
event = bobSession2.getDataHandler().getStore().getLatestEvent(aliceRoomId);
Assert.assertNotNull(event);
Assert.assertTrue(event.isEncrypted());
Assert.assertNull(event.getClearEvent());
Assert.assertNotNull(event.getCryptoError());
Assert.assertEquals(MXCryptoError.UNKNOWN_INBOUND_SESSION_ID_ERROR_CODE, event.getCryptoError().errcode);
final CountDownLatch lock4 = new CountDownLatch(1);
final List<Event> receivedEvents2 = new ArrayList<>();
EventTimeline.Listener eventTimelineListener2 = new EventTimeline.Listener() {
public void onEvent(Event event, EventTimeline.Direction direction, RoomState roomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE)) {
receivedEvents2.add(event);
lock4.countDown();
}
}
};
roomFromBob2POV.getTimeline().addEventTimelineListener(eventTimelineListener2);
String messageFromAlice2 = "Hello I'm still Alice!";
roomFromAlice2POV.sendEvent(mCryptoTestHelper.buildTextEvent(messageFromAlice2, aliceSession2, aliceRoomId), new SimpleApiCallback<Void>() {
@Override
public void onSuccess(Void info) {
// Ignore
}
});
mTestHelper.await(lock4);
Assert.assertEquals(1, receivedEvents2.size());
event = receivedEvents2.get(0);
mCryptoTestHelper.checkEncryptedEvent(event, aliceRoomId, messageFromAlice2, aliceSession2);
cryptoTestData.clear(context);
aliceSession2.clear(context);
}
use of org.matrix.androidsdk.common.CryptoTestData in project matrix-android-sdk by matrix-org.
the class CryptoTest method test29_testAliceAndBobInAEncryptedRoomWithReplyTo.
/**
* We want to test that the relates_to data are well copied from e2e event to clear event
*
* @throws Exception
*/
@Test
public void test29_testAliceAndBobInAEncryptedRoomWithReplyTo() throws Exception {
Log.e(LOG_TAG, "test08_testAliceAndBobInAEncryptedRoom2");
Context context = InstrumentationRegistry.getContext();
CryptoTestData cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true);
final MXSession aliceSession = cryptoTestData.getFirstSession();
final String aliceRoomId = cryptoTestData.getRoomId();
final MXSession bobSession = cryptoTestData.getSecondSession();
bobSession.getCrypto().setWarnOnUnknownDevices(false);
aliceSession.getCrypto().setWarnOnUnknownDevices(false);
final Room roomFromBobPOV = bobSession.getDataHandler().getRoom(aliceRoomId);
final Room roomFromAlicePOV = aliceSession.getDataHandler().getRoom(aliceRoomId);
Assert.assertTrue(roomFromBobPOV.isEncrypted());
Assert.assertTrue(roomFromAlicePOV.isEncrypted());
final List<Event> bobReceivedEvents = new ArrayList<>();
final List<Event> aliceReceivedEvents = new ArrayList<>();
final int[] nbReceivedMessagesFromAlice = { 0 };
final int[] nbReceivedMessagesFromBob = { 0 };
final List<CountDownLatch> list = new ArrayList<>();
MXEventListener bobEventListener = new MXEventListener() {
@Override
public void onLiveEvent(Event event, RoomState roomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE) && !TextUtils.equals(event.getSender(), bobSession.getMyUserId())) {
bobReceivedEvents.add(event);
mCryptoTestHelper.checkEncryptedEvent(event, aliceRoomId, mCryptoTestHelper.getMessagesFromAlice().get(nbReceivedMessagesFromAlice[0]), aliceSession);
nbReceivedMessagesFromAlice[0]++;
list.get(list.size() - 1).countDown();
}
}
};
MXEventListener aliceEventListener = new MXEventListener() {
@Override
public void onLiveEvent(Event event, RoomState roomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE) && !TextUtils.equals(event.getSender(), aliceSession.getMyUserId())) {
aliceReceivedEvents.add(event);
try {
// "In reply to" format for body
String expectedMessage = "> <" + aliceSession.getMyUserId() + "> " + mCryptoTestHelper.getMessagesFromAlice().get(nbReceivedMessagesFromAlice[0] - 1) + "\n\n" + mCryptoTestHelper.getMessagesFromBob().get(nbReceivedMessagesFromBob[0]);
mCryptoTestHelper.checkEncryptedEvent(event, aliceRoomId, expectedMessage, bobSession);
nbReceivedMessagesFromBob[0]++;
list.get(list.size() - 1).countDown();
} catch (Exception e) {
}
}
}
};
ApiCallback<Void> callback = new SimpleApiCallback<Void>() {
@Override
public void onSuccess(Void info) {
// Ignore
}
};
roomFromBobPOV.addEventListener(bobEventListener);
roomFromAlicePOV.addEventListener(aliceEventListener);
list.add(new CountDownLatch(2));
final Map<String, Object> results = new HashMap<>();
bobSession.getDataHandler().addListener(new MXEventListener() {
@Override
public void onToDeviceEvent(Event event) {
results.put("onToDeviceEvent", event);
list.get(0).countDown();
}
});
// Alice sends a first event
roomFromAlicePOV.sendEvent(mCryptoTestHelper.buildTextEvent(mCryptoTestHelper.getMessagesFromAlice().get(nbReceivedMessagesFromAlice[0]), aliceSession, aliceRoomId), callback);
mTestHelper.await(list.get(list.size() - 1));
Assert.assertTrue(results.containsKey("onToDeviceEvent"));
Assert.assertEquals(1, nbReceivedMessagesFromAlice[0]);
// Bob reply to Alice event
Assert.assertTrue(roomFromBobPOV.canReplyTo(bobReceivedEvents.get(0)));
list.add(new CountDownLatch(1));
roomFromBobPOV.sendTextMessage(mCryptoTestHelper.getMessagesFromBob().get(nbReceivedMessagesFromBob[0]), null, Message.MSGTYPE_TEXT, bobReceivedEvents.get(0), null);
mTestHelper.await(list.get(list.size() - 1));
Assert.assertEquals(1, nbReceivedMessagesFromBob[0]);
Event event = aliceReceivedEvents.get(0);
JsonObject json = event.getContentAsJsonObject();
Assert.assertNotNull(json);
// Check that the received event contains a formatted body
Assert.assertTrue(json.has("formatted_body"));
// Check that the received event contains the relates to field
Assert.assertTrue(json.has("m.relates_to"));
RelatesTo relatesTo = (RelatesTo) JsonUtils.toClass(json.get("m.relates_to"), RelatesTo.class);
Assert.assertNotNull(relatesTo);
// Check that the event id matches
Assert.assertEquals(bobReceivedEvents.get(0).eventId, relatesTo.dict.get("event_id"));
cryptoTestData.clear(context);
}
use of org.matrix.androidsdk.common.CryptoTestData in project matrix-android-sdk by matrix-org.
the class CryptoTest method test15_testReplayAttack.
@Test
public void test15_testReplayAttack() throws Exception {
Log.e(LOG_TAG, "test15_testReplayAttack");
Context context = InstrumentationRegistry.getContext();
final Map<String, Object> results = new HashMap<>();
CryptoTestData cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true);
final MXSession aliceSession = cryptoTestData.getFirstSession();
final String aliceRoomId = cryptoTestData.getRoomId();
final MXSession bobSession = cryptoTestData.getSecondSession();
bobSession.getCrypto().setWarnOnUnknownDevices(false);
aliceSession.getCrypto().setWarnOnUnknownDevices(false);
String messageFromAlice = "Hello I'm Alice!";
final Room roomFromBobPOV = bobSession.getDataHandler().getRoom(aliceRoomId);
final Room roomFromAlicePOV = aliceSession.getDataHandler().getRoom(aliceRoomId);
Assert.assertTrue(roomFromBobPOV.isEncrypted());
Assert.assertTrue(roomFromAlicePOV.isEncrypted());
final CountDownLatch lock1 = new CountDownLatch(2);
MXEventListener bobEventListener = new MXEventListener() {
@Override
public void onLiveEvent(Event event, RoomState roomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE) && !TextUtils.equals(event.getSender(), bobSession.getMyUserId())) {
results.put("bobEcho", event);
event.setClearData(null);
bobSession.getDataHandler().decryptEvent(event, roomFromBobPOV.getTimeline().getTimelineId());
results.put("decrypted", event);
lock1.countDown();
}
}
};
roomFromBobPOV.addEventListener(bobEventListener);
bobSession.getDataHandler().addListener(new MXEventListener() {
@Override
public void onToDeviceEvent(Event event) {
results.put("onToDeviceEvent", event);
lock1.countDown();
}
});
roomFromAlicePOV.sendEvent(mCryptoTestHelper.buildTextEvent(messageFromAlice, aliceSession, aliceRoomId), new SimpleApiCallback<Void>() {
@Override
public void onSuccess(Void info) {
// Ignore
}
});
mTestHelper.await(lock1);
Assert.assertTrue(results.containsKey("onToDeviceEvent"));
Assert.assertTrue(results.containsKey("bobEcho"));
Assert.assertTrue(results.containsKey("decrypted"));
Event decryptedEvent = (Event) results.get("decrypted");
Assert.assertNull(decryptedEvent.getClearEvent());
Assert.assertEquals(MXCryptoError.DUPLICATED_MESSAGE_INDEX_ERROR_CODE, decryptedEvent.getCryptoError().errcode);
// Decrypting it with no replay attack mitigation must still work
bobSession.getDataHandler().decryptEvent(decryptedEvent, null);
mCryptoTestHelper.checkEncryptedEvent(decryptedEvent, aliceRoomId, messageFromAlice, aliceSession);
cryptoTestData.clear(context);
}
use of org.matrix.androidsdk.common.CryptoTestData in project matrix-android-sdk by matrix-org.
the class CryptoTest method test08_testAliceAndBobInAEncryptedRoom2.
@Test
public void test08_testAliceAndBobInAEncryptedRoom2() throws Exception {
Log.e(LOG_TAG, "test08_testAliceAndBobInAEncryptedRoom2");
Context context = InstrumentationRegistry.getContext();
CryptoTestData cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true);
final MXSession aliceSession = cryptoTestData.getFirstSession();
final String aliceRoomId = cryptoTestData.getRoomId();
final MXSession bobSession = cryptoTestData.getSecondSession();
bobSession.getCrypto().setWarnOnUnknownDevices(false);
aliceSession.getCrypto().setWarnOnUnknownDevices(false);
final Room roomFromBobPOV = bobSession.getDataHandler().getRoom(aliceRoomId);
final Room roomFromAlicePOV = aliceSession.getDataHandler().getRoom(aliceRoomId);
Assert.assertTrue(roomFromBobPOV.isEncrypted());
Assert.assertTrue(roomFromAlicePOV.isEncrypted());
final int[] nbReceivedMessagesFromAlice = { 0 };
final int[] nbReceivedMessagesFromBob = { 0 };
final List<CountDownLatch> list = new ArrayList<>();
MXEventListener bobEventListener = new MXEventListener() {
@Override
public void onLiveEvent(Event event, RoomState roomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE) && !TextUtils.equals(event.getSender(), bobSession.getMyUserId())) {
mCryptoTestHelper.checkEncryptedEvent(event, aliceRoomId, mCryptoTestHelper.getMessagesFromAlice().get(nbReceivedMessagesFromAlice[0]), aliceSession);
nbReceivedMessagesFromAlice[0]++;
list.get(list.size() - 1).countDown();
}
}
};
MXEventListener aliceEventListener = new MXEventListener() {
@Override
public void onLiveEvent(Event event, RoomState roomState) {
if (TextUtils.equals(event.getType(), Event.EVENT_TYPE_MESSAGE) && !TextUtils.equals(event.getSender(), aliceSession.getMyUserId())) {
mCryptoTestHelper.checkEncryptedEvent(event, aliceRoomId, mCryptoTestHelper.getMessagesFromBob().get(nbReceivedMessagesFromBob[0]), bobSession);
nbReceivedMessagesFromBob[0]++;
list.get(list.size() - 1).countDown();
}
}
};
ApiCallback<Void> callback = new SimpleApiCallback<Void>() {
@Override
public void onSuccess(Void info) {
// Ignored
}
};
roomFromBobPOV.addEventListener(bobEventListener);
roomFromAlicePOV.addEventListener(aliceEventListener);
list.add(new CountDownLatch(2));
final Map<String, Object> results = new HashMap<>();
bobSession.getDataHandler().addListener(new MXEventListener() {
@Override
public void onToDeviceEvent(Event event) {
results.put("onToDeviceEvent", event);
list.get(0).countDown();
}
});
roomFromAlicePOV.sendEvent(mCryptoTestHelper.buildTextEvent(mCryptoTestHelper.getMessagesFromAlice().get(nbReceivedMessagesFromAlice[0]), aliceSession, aliceRoomId), callback);
mTestHelper.await(list.get(list.size() - 1));
Assert.assertTrue(results.containsKey("onToDeviceEvent"));
Assert.assertEquals(1, nbReceivedMessagesFromAlice[0]);
list.add(new CountDownLatch(1));
roomFromBobPOV.sendEvent(mCryptoTestHelper.buildTextEvent(mCryptoTestHelper.getMessagesFromBob().get(nbReceivedMessagesFromBob[0]), bobSession, aliceRoomId), callback);
mTestHelper.await(list.get(list.size() - 1));
Assert.assertEquals(1, nbReceivedMessagesFromBob[0]);
list.add(new CountDownLatch(1));
roomFromBobPOV.sendEvent(mCryptoTestHelper.buildTextEvent(mCryptoTestHelper.getMessagesFromBob().get(nbReceivedMessagesFromBob[0]), bobSession, aliceRoomId), callback);
mTestHelper.await(list.get(list.size() - 1));
Assert.assertEquals(2, nbReceivedMessagesFromBob[0]);
list.add(new CountDownLatch(1));
roomFromBobPOV.sendEvent(mCryptoTestHelper.buildTextEvent(mCryptoTestHelper.getMessagesFromBob().get(nbReceivedMessagesFromBob[0]), bobSession, aliceRoomId), callback);
mTestHelper.await(list.get(list.size() - 1));
Assert.assertEquals(3, nbReceivedMessagesFromBob[0]);
list.add(new CountDownLatch(1));
roomFromAlicePOV.sendEvent(mCryptoTestHelper.buildTextEvent(mCryptoTestHelper.getMessagesFromAlice().get(nbReceivedMessagesFromAlice[0]), aliceSession, aliceRoomId), callback);
mTestHelper.await(list.get(list.size() - 1));
Assert.assertEquals(2, nbReceivedMessagesFromAlice[0]);
cryptoTestData.clear(context);
}
Aggregations