Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 59 additions & 100 deletions apps/meteor/tests/e2e/e2e-encryption/e2ee-encrypted-channels.spec.ts

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { faker } from '@faker-js/faker';

import { Users } from '../fixtures/userStates';
import { HomeChannel } from '../page-objects';
import { EncryptedRoomPage } from '../page-objects/encrypted-room';
import { preserveSettings } from '../utils/preserveSettings';
import { test, expect } from '../utils/test';

Expand All @@ -17,6 +18,7 @@ const originalSettings = preserveSettings(settingsList);

test.describe('E2EE File Encryption', () => {
let poHomeChannel: HomeChannel;
let encryptedRoomPage: EncryptedRoomPage;

test.use({ storageState: Users.userE2EE.state });

Expand All @@ -25,7 +27,6 @@ test.describe('E2EE File Encryption', () => {
await api.post('/settings/E2E_Allow_Unencrypted_Messages', { value: true });
await api.post('/settings/E2E_Enabled_Default_DirectRooms', { value: false });
await api.post('/settings/E2E_Enabled_Default_PrivateRooms', { value: false });
await api.post('/im.delete', { username: 'user2' });
});

test.afterAll(async ({ api }) => {
Expand All @@ -35,6 +36,7 @@ test.describe('E2EE File Encryption', () => {

test.beforeEach(async ({ page }) => {
poHomeChannel = new HomeChannel(page);
encryptedRoomPage = new EncryptedRoomPage(page);
await page.goto('/home');
});

Expand All @@ -55,7 +57,7 @@ test.describe('E2EE File Encryption', () => {
await poHomeChannel.content.fileNameInput.fill('any_file1.txt');
await poHomeChannel.content.btnModalConfirm.click();

await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();
await expect(poHomeChannel.content.getFileDescription).toHaveText('any_description');
await expect(poHomeChannel.content.lastMessageFileName).toContainText('any_file1.txt');
});
Expand Down Expand Up @@ -90,7 +92,7 @@ test.describe('E2EE File Encryption', () => {
await poHomeChannel.content.fileNameInput.fill('any_file1.txt');
await poHomeChannel.content.btnModalConfirm.click();

await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();
await expect(poHomeChannel.content.getFileDescription).toHaveText('message 1');
await expect(poHomeChannel.content.lastMessageFileName).toContainText('any_file1.txt');
});
Expand All @@ -105,7 +107,7 @@ test.describe('E2EE File Encryption', () => {
await poHomeChannel.content.fileNameInput.fill('any_file2.txt');
await poHomeChannel.content.btnModalConfirm.click();

await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();
await expect(poHomeChannel.content.getFileDescription).toHaveText('message 2');
await expect(poHomeChannel.content.lastMessageFileName).toContainText('any_file2.txt');
});
Expand All @@ -120,7 +122,7 @@ test.describe('E2EE File Encryption', () => {
await poHomeChannel.content.fileNameInput.fill('any_file3.txt');
await poHomeChannel.content.btnModalConfirm.click();

await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();
await expect(poHomeChannel.content.getFileDescription).toHaveText('message 2');
await expect(poHomeChannel.content.lastMessageFileName).toContainText('any_file2.txt');
});
Expand Down Expand Up @@ -152,7 +154,7 @@ test.describe('E2EE File Encryption', () => {
await poHomeChannel.content.sendMessage('This is an encrypted message.');

await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('This is an encrypted message.');
await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();
});

await test.step('send a text file in channel, file should not be encrypted', async () => {
Expand All @@ -161,7 +163,7 @@ test.describe('E2EE File Encryption', () => {
await poHomeChannel.content.fileNameInput.fill('any_file1.txt');
await poHomeChannel.content.btnModalConfirm.click();

await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).not.toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).not.toBeVisible();
await expect(poHomeChannel.content.getFileDescription).toHaveText('any_description');
await expect(poHomeChannel.content.lastMessageFileName).toContainText('any_file1.txt');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ test.describe('E2EE Key Reset', () => {
await api.post('/settings/E2E_Allow_Unencrypted_Messages', { value: true });
await api.post('/settings/E2E_Enabled_Default_DirectRooms', { value: false });
await api.post('/settings/E2E_Enabled_Default_PrivateRooms', { value: false });
await api.post('/im.delete', { username: 'user2' });
});

test.beforeEach(async ({ browser, page }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { BASE_API_URL } from '../config/constants';
import injectInitialData from '../fixtures/inject-initial-data';
import { Users, restoreState } from '../fixtures/userStates';
import { HomeChannel } from '../page-objects';
import { EncryptedRoomPage } from '../page-objects/encrypted-room';
import { preserveSettings } from '../utils/preserveSettings';
import { test, expect } from '../utils/test';

Expand Down Expand Up @@ -35,6 +36,7 @@ const sendEncryptedMessage = async (request: APIRequestContext, rid: string, enc

test.describe('E2EE Legacy Format', () => {
let poHomeChannel: HomeChannel;
let encryptedRoomPage: EncryptedRoomPage;

test.use({ storageState: Users.userE2EE.state });

Expand All @@ -43,11 +45,11 @@ test.describe('E2EE Legacy Format', () => {
await api.post('/settings/E2E_Allow_Unencrypted_Messages', { value: true });
await api.post('/settings/E2E_Enabled_Default_DirectRooms', { value: false });
await api.post('/settings/E2E_Enabled_Default_PrivateRooms', { value: false });
await api.post('/im.delete', { username: 'user2' });
});

test.beforeEach(async ({ page }) => {
poHomeChannel = new HomeChannel(page);
encryptedRoomPage = new EncryptedRoomPage(page);
await page.goto('/home');
});

Expand Down Expand Up @@ -87,6 +89,6 @@ test.describe('E2EE Legacy Format', () => {
await sendEncryptedMessage(request, rid, kid + encryptedMessage);

await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('world');
await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();
});
});
14 changes: 7 additions & 7 deletions apps/meteor/tests/e2e/e2e-encryption/e2ee-otr.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Users } from '../fixtures/userStates';
import { HomeChannel } from '../page-objects';
import { DisableRoomEncryptionModal, EnableRoomEncryptionModal } from '../page-objects/fragments/e2ee';
import { preserveSettings } from '../utils/preserveSettings';
import { test, expect } from '../utils/test';

Expand All @@ -14,6 +15,8 @@ preserveSettings(settingsList);

test.describe('E2EE OTR (Off-The-Record)', () => {
let poHomeChannel: HomeChannel;
let enableEncryptionModal: EnableRoomEncryptionModal;
let disableEncryptionModal: DisableRoomEncryptionModal;

test.use({ storageState: Users.userE2EE.state });

Expand All @@ -27,6 +30,8 @@ test.describe('E2EE OTR (Off-The-Record)', () => {

test.beforeEach(async ({ page }) => {
poHomeChannel = new HomeChannel(page);
enableEncryptionModal = new EnableRoomEncryptionModal(page);
disableEncryptionModal = new DisableRoomEncryptionModal(page);
await page.goto('/home');
});

Expand All @@ -43,21 +48,16 @@ test.describe('E2EE OTR (Off-The-Record)', () => {
await poHomeChannel.tabs.kebab.click({ force: true });
if (await poHomeChannel.tabs.btnDisableE2E.isVisible()) {
await poHomeChannel.tabs.btnDisableE2E.click({ force: true });
await expect(page.getByRole('dialog', { name: 'Disable encryption' })).toBeVisible();
await page.getByRole('button', { name: 'Disable encryption' }).click();
await poHomeChannel.toastMessage.dismissToast();
await disableEncryptionModal.disable();
await poHomeChannel.tabs.kebab.click({ force: true });
}
await expect(poHomeChannel.tabs.btnEnableE2E).toBeVisible();
await poHomeChannel.tabs.btnEnableE2E.click({ force: true });
await expect(page.getByRole('dialog', { name: 'Enable encryption' })).toBeVisible();
await page.getByRole('button', { name: 'Enable encryption' }).click();
await enableEncryptionModal.enable();
await page.waitForTimeout(1000);

await expect(poHomeChannel.content.encryptedRoomHeaderIcon).toBeVisible();

await poHomeChannel.toastMessage.dismissToast();

await poHomeChannel.tabs.kebab.click({ force: true });
await expect(poHomeChannel.tabs.btnEnableOTR).toBeVisible();
await poHomeChannel.tabs.btnEnableOTR.click({ force: true });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Users, storeState, restoreState } from '../fixtures/userStates';
import { AccountProfile, HomeChannel } from '../page-objects';
import { setupE2EEPassword } from './setupE2EEPassword';
import { AccountSecurityPage } from '../page-objects/account-security';
import { EncryptedRoomPage } from '../page-objects/encrypted-room';
import { HomeSidenav } from '../page-objects/fragments';
import {
E2EEKeyDecodeFailureBanner,
Expand All @@ -27,6 +28,13 @@ const originalSettings = preserveSettings(settingsList);

test.describe('E2EE Passphrase Management - Initial Setup', () => {
test.use({ storageState: Users.admin.state });
let loginPage: LoginPage;
let enterE2EEPasswordBanner: EnterE2EEPasswordBanner;
let enterE2EEPasswordModal: EnterE2EEPasswordModal;
let e2EEKeyDecodeFailureBanner: E2EEKeyDecodeFailureBanner;
let sidenav: HomeSidenav;
let accountSecurityPage: AccountSecurityPage;
let resetE2EEPasswordModal: ResetE2EEPasswordModal;

test.beforeAll(async ({ api }) => {
await api.post('/settings/E2E_Enable', { value: true });
Expand All @@ -35,6 +43,16 @@ test.describe('E2EE Passphrase Management - Initial Setup', () => {
await api.post('/settings/E2E_Enabled_Default_PrivateRooms', { value: false });
});

test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
enterE2EEPasswordBanner = new EnterE2EEPasswordBanner(page);
enterE2EEPasswordModal = new EnterE2EEPasswordModal(page);
e2EEKeyDecodeFailureBanner = new E2EEKeyDecodeFailureBanner(page);
sidenav = new HomeSidenav(page);
accountSecurityPage = new AccountSecurityPage(page);
resetE2EEPasswordModal = new ResetE2EEPasswordModal(page);
});

test.afterAll(async ({ api }) => {
await api.post('/settings/E2E_Enable', { value: originalSettings.E2E_Enable });
await api.post('/settings/E2E_Allow_Unencrypted_Messages', { value: originalSettings.E2E_Allow_Unencrypted_Messages });
Expand All @@ -44,8 +62,6 @@ test.describe('E2EE Passphrase Management - Initial Setup', () => {

test.describe('Generate', () => {
test.beforeEach(async ({ page, api }) => {
const loginPage = new LoginPage(page);

await api.post('/method.call/e2e.resetOwnE2EKey', {
message: JSON.stringify({ msg: 'method', id: '1', method: 'e2e.resetOwnE2EKey', params: [] }),
});
Expand All @@ -56,12 +72,6 @@ test.describe('E2EE Passphrase Management - Initial Setup', () => {
});

test('expect the randomly generated password to work', async ({ page }) => {
const loginPage = new LoginPage(page);
const enterE2EEPasswordBanner = new EnterE2EEPasswordBanner(page);
const enterE2EEPasswordModal = new EnterE2EEPasswordModal(page);
const e2EEKeyDecodeFailureBanner = new E2EEKeyDecodeFailureBanner(page);
const sidenav = new HomeSidenav(page);

const password = await setupE2EEPassword(page);

// Log out
Expand All @@ -78,10 +88,7 @@ test.describe('E2EE Passphrase Management - Initial Setup', () => {
await e2EEKeyDecodeFailureBanner.expectToNotBeVisible();
});

test('expect to manually reset the password', async ({ page }) => {
const accountSecurityPage = new AccountSecurityPage(page);
const loginPage = new LoginPage(page);

test('expect to manually reset the password', async () => {
// Reset the E2EE key to start the flow from the beginning
await accountSecurityPage.goto();
await accountSecurityPage.resetE2EEPassword();
Expand All @@ -90,12 +97,6 @@ test.describe('E2EE Passphrase Management - Initial Setup', () => {
});

test('should reset e2e password from the modal', async ({ page }) => {
const sidenav = new HomeSidenav(page);
const loginPage = new LoginPage(page);
const enterE2EEPasswordBanner = new EnterE2EEPasswordBanner(page);
const enterE2EEPasswordModal = new EnterE2EEPasswordModal(page);
const resetE2EEPasswordModal = new ResetE2EEPasswordModal(page);

await setupE2EEPassword(page);

// Logout
Expand All @@ -114,13 +115,6 @@ test.describe('E2EE Passphrase Management - Initial Setup', () => {
});

test('expect to manually set a new password', async ({ page }) => {
const accountSecurityPage = new AccountSecurityPage(page);
const loginPage = new LoginPage(page);
const enterE2EEPasswordBanner = new EnterE2EEPasswordBanner(page);
const enterE2EEPasswordModal = new EnterE2EEPasswordModal(page);
const e2EEKeyDecodeFailureBanner = new E2EEKeyDecodeFailureBanner(page);
const sidenav = new HomeSidenav(page);

const newPassword = faker.internet.password({
length: 30,
prefix:
Expand Down Expand Up @@ -160,16 +154,10 @@ test.describe('E2EE Passphrase Management - Initial Setup', () => {
await page.goto('/home');
await injectInitialData();
await restoreState(page, Users.userE2EE);
const sidenav = new HomeSidenav(page);
await sidenav.logout();

const loginPage = new LoginPage(page);
await loginPage.loginByUserState(Users.userE2EE, { except: ['private_key', 'public_key'] });

const enterE2EEPasswordBanner = new EnterE2EEPasswordBanner(page);
const enterE2EEPasswordModal = new EnterE2EEPasswordModal(page);
const e2EEKeyDecodeFailureBanner = new E2EEKeyDecodeFailureBanner(page);

await enterE2EEPasswordBanner.click();
await enterE2EEPasswordModal.enterPassword('minus mobile dexter forest elvis');
await e2EEKeyDecodeFailureBanner.expectToNotBeVisible();
Expand All @@ -185,13 +173,21 @@ const roomSetupSettingsList = ['E2E_Enable', 'E2E_Allow_Unencrypted_Messages'];
test.describe.serial('E2EE Passphrase Management - Room Setup States', () => {
let poAccountProfile: AccountProfile;
let poHomeChannel: HomeChannel;
let encryptedRoomPage: EncryptedRoomPage;
let loginPage: LoginPage;
let accountSecurityPage: AccountSecurityPage;
let enterE2EEPasswordModal: EnterE2EEPasswordModal;
let e2eePassword: string;

preserveSettings(roomSetupSettingsList);

test.beforeEach(async ({ page }) => {
poAccountProfile = new AccountProfile(page);
poHomeChannel = new HomeChannel(page);
encryptedRoomPage = new EncryptedRoomPage(page);
loginPage = new LoginPage(page);
accountSecurityPage = new AccountSecurityPage(page);
enterE2EEPasswordModal = new EnterE2EEPasswordModal(page);
});

test.beforeAll(async ({ api }) => {
Expand Down Expand Up @@ -248,7 +244,7 @@ test.describe.serial('E2EE Passphrase Management - Room Setup States', () => {
await poHomeChannel.content.sendMessage('hello world');

await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('hello world');
await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();
});

test('expect enter password state on encrypted room', async ({ page }) => {
Expand Down Expand Up @@ -281,9 +277,7 @@ test.describe.serial('E2EE Passphrase Management - Room Setup States', () => {

await poHomeChannel.btnRoomEnterE2EEPassword.click();

await page.locator('#modal-root input').fill(e2eePassword);

await page.locator('#modal-root .rcx-button--primary').click();
await enterE2EEPasswordModal.enterPassword(e2eePassword);

await expect(poHomeChannel.bannerEnterE2EEPassword).not.toBeVisible();

Expand All @@ -294,7 +288,7 @@ test.describe.serial('E2EE Passphrase Management - Room Setup States', () => {
await poHomeChannel.content.sendMessage('hello world');

await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('hello world');
await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();

await storeState(page, Users.admin);
});
Expand All @@ -313,28 +307,25 @@ test.describe.serial('E2EE Passphrase Management - Room Setup States', () => {
await poHomeChannel.content.sendMessage('hello world');

await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('hello world');
await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible();
await expect(encryptedRoomPage.lastMessage.encryptedIcon).toBeVisible();

await poHomeChannel.sidenav.btnUserProfileMenu.click();
await poHomeChannel.sidenav.accountProfileOption.click();

await page.locator('role=navigation >> a:has-text("Security")').click();
await accountSecurityPage.goto();

await poAccountProfile.securityE2EEncryptionSection.click();
await poAccountProfile.securityE2EEncryptionResetKeyButton.click();

await page.locator('role=button[name="Login"]').waitFor();
await loginPage.waitForIt();

await page.reload();

await page.locator('role=button[name="Login"]').waitFor();
await loginPage.waitForIt();

await injectInitialData();
await restoreState(page, Users.admin);

await page.locator('role=navigation >> role=button[name=Search]').click();
await page.locator('role=search >> role=searchbox').fill(channelName);
await page.locator(`role=search >> role=listbox >> role=link >> text="${channelName}"`).click();
await poHomeChannel.sidenav.openSearch();
await poHomeChannel.sidenav.inputSearch.fill(channelName);
await poHomeChannel.sidenav.getSearchItemByName(channelName).click();

await poHomeChannel.btnRoomSaveE2EEPassword.click();
await poHomeChannel.btnSavedMyPassword.click();
Expand Down
Loading
Loading