Rocket.Chat.ReactNative/e2e
Djorkaeff Alexandre 3c9017a62d
[NEW] E2E Encryption (#2394)
* Add E2EKey to Subscription Model

* Install react-native-simple-crypto

* Install bytebuffer

* Add translations

* CreateChannel Encrypted toggle

* Request E2E_Enabled setting

* Add some E2E API methods

* POC E2E Encryption

* Garbage remove

* Remove keys cleaner

* Android cast JWK -> PKCS1

* Initialize E2E when Login Success

* Add some translations

* Add e2e property to Message model

* Send Encrypted messages

* (iOS) PKCS1 -> JWK & e2e.setUserPublicAndPrivateKeys

* (Android) PKCS1 -> JWK & e2e.setUserPublicAndPrivateKeys

* Create an encrypted channel

* Fix app crashing on RoomsList

* Create room key

* Set Room E2E Key (Android)

* Edit room encrypted

* Show encrypted icon on messages

* logEvents

* Decrypt pending subscriptions & messages

* Handle user cancel e2e password entry

* E2ESavePasswordView

* Update Snapshot

* Add encrypted props to message on Send

* Thread messages encryption

* E2E -> Encryption

* Share Extension: Share encrypted text

* (POC) Search messages on Encrypted room

* Provide room key to new users

* Request roomKey on stream-notify-room-users

* Add e2eKeyId to Room Model

* (WIP) E2E Encryption Screens

* Remove encryption subscription file

* Move E2E_Enable to Server Model

* Encryption List Banner

* Move Encryption init to Sagas

* Show banner only when enabled

* Use RocketChat/react-native-simple-crypto

* Search on WM only when is an Encrypted channel

* (WIP) Encryption Banner

* Encryption banner

* Patch -> Fork

* Improve send encrypted message

* Update simple-crypto

* Not decrypt already decrypted messages

* Add comments

* Change eslint disable to inline

* Improve code

* Remove comment

* Some fixes

* (WIP) Encryption Screens

* Improve sub find

* Resend an encrypted message

* Fix comment

* Code improvements

* Hide e2e buttons on features if it is not enabled

* InApp notifications of a encrypted room

* Encryption stop logic

* Edit encrypted message

* DB batch on decryptPending

* Encryption ready client

* Comments

* Handle getRoomInstance errors

* Multiple messages decrypt

* Remove unnecessary try/catch

* Fix decrypt all messages history

* Just add a questionmark

* Fix some subscriptions missing decrypt

* Disable request key logic

* Fix unicode emojis

* Fix e2ekey request

* roomId -> subscription

* Decrypt subscription after merge

* E2ERoom -> EncryptionRoom

* Fix infinite loading

* Handle import key errors

* Handle request key errors

* Move e2eRequestRoomKey to Rocket.Chat

* WIP handshake when key should be requested

* Add search messages explanation

* Remove some TODO and update comments

* Improvements

* Dont show message hash to user

* Handle key request & prevent multiple calls

* Request E2EKey on decryptSubscription that doesn't exists on database yet

* Insert decrypted subscription

* Fix crash after login

* Decrypt sub when receive the key

* Decrypt pending messages of a room

* Encrypted as a switch

* Buffer to Base64 URI Safe

* Add a relevant comment

* Prevent import key without a privateKey

* Prevent create a new instance when client is not ready

* Update simple-crypto & remove replace trick

* More comments

* Remove useless comment

* Remove useless try/catch

* I18n all E2E screens

* E2ESavePassword -> E2ESaveYourPassword

* Prevent multiple views on message when is not encrypted

* Fix encryption toggle not working sometimes

* follow some suggestions

* dont rotate icons

* remove unnecessary condition

* remove unreachable event

* create channel comment

* disable no-bitwise rule for entire file

* loadKeys -> persistKeys

* getMasterKey -> generateMasterKey

* explicit difference between E2EKey & e2eKeyId

* roomId -> rid

* group columns

* Remove server selector

* missing log events

* remove comment

* use stored public key

* update simple-crypto & remove base64-js patch

* add some logs

* remove unreachable condition

* log errors

* handle errors on provide key directly on subscription

* Downgrade RocketChat/react-native-simple-crypto

* improve get room instance

* migration of older apps

* check encrypted status before send a message

* wait client ready

* use our own base64-js

* add more jest tests

* explain return

* remove unncessary stop

* thrown error to caller

* remove superfluous checks

* use Encryption property

* change ready state logic

* ready -> establishing

* encryption.room -> encryptionRoom

* EncryptionRoom -> Room

* add documentation

* wait establishing before provide a room key

* remove superfluous condition

* improve error handling logic

* fallback e2ekey set

* remove no longer necessary check

* remove e.g.

* improve getRoomInstance

* import from index

* use batch

* fix a comment

* decrypt tmsg

* dont show hash when message is encrypted

* Fix detox

* Apply suggestions from code review

Co-authored-by: Diego Mello <diegolmello@gmail.com>
2020-09-11 11:31:38 -03:00
..
data [TESTS] Fix some simple text (#2332) 2020-07-24 16:19:30 -03:00
docker [TESTS] Fix some simple text (#2332) 2020-07-24 16:19:30 -03:00
helpers [TESTS] Stabilise Room Actions test (#2333) 2020-07-26 11:28:48 -03:00
tests [NEW] E2E Encryption (#2394) 2020-09-11 11:31:38 -03:00
.mocharc.json [TESTS] Test in docker (#2290) 2020-07-15 13:28:34 -03:00
README.md Update readme (#2381) 2020-08-07 11:15:06 -03:00
data.js [TESTS] Fix some simple text (#2332) 2020-07-24 16:19:30 -03:00

README.md

E2E Testing

Contents

  1. Prepare test environment
  2. Prepare test data
  3. Running tests
  4. FAQ

1. Prepare test environment

1.1. A Rocket.Chat server

Either

  • Install Rocket.Chat meteor app by following this guide.

Or

  • Use the local Docker environment available in this folder. You can start the environment using ./e2e/docker/controlRCDemoEnv.sh startandwait, or you can use the packaged start & run script (see step 3). Either way, you'll need Docker and Docker Compose.

1.2. Set up detox

  • Install dependencies by following this guide (only Step 1).

2. Prepare test data

  • If you're running your own Rocket.Chat server, ensure it's started (e.g. meteor npm start in the server project directory).
  • Edit e2e/data.js:
    • Set the server to the address of the server under test
    • Set the adminUser and adminPassword to an admin user on that environment (or a user with at least create-user and create-c).
  • Working example configs exist in ./e2e/data/. Setting FORCE_DEFAULT_DOCKER_DATA to 1 in the runTestsInDocker.sh script will use the example config automatically

3. Running tests

3.1. iOS

  • Build app with detox: detox build -c ios.sim.release
  • Open Simulator which is used in tests (check in package.json under detox section) from Xcode and make sure that software keyboard is being displayed. To toggle keyboard press cmd+K.
  • Run tests: detox test -c ios.sim.release, or, if choosing Docker you can run the packaged environment & runner (./e2e/docker/runTestsInDocker.sh) which will start the Docker infrastructure, run the tests and tear it down again once done.

3.2. Android

  • Build app with detox: detox build -c android.emu.debug
  • Run: react-native start
  • Run Android emulator with name ANDROID_API_28 via Android studio or cd /Users/USERNAME/Library/Android/sdk/emulator/ && ./emulator -avd ANDROID_API_28 Note: if you need to run tests on different Android emulator then simply change emulator name in ./package.json detox configurations
  • Run tests: detox test -c android.emu.debug

3.3 Running a subset of tests

Tests have been grouped into subfolders. You can choose to run just one group of tests by running, for example:

detox test ./e2e/tests/onboarding -c ios.sim.release

To do the same with the Docker runner:

./e2e/docker/runTestsInDocker.sh onboarding

4. FAQ

4.1. Detox build fails

  • Delete node_modules, ios/build, android/build: rm -rf node_modules && rm -rf ios/build && rm -rf android/build
  • Install packages: yarn install
  • Kill metro bundler server by closing terminal or with following command: lsof -ti:8081 | xargs kill
  • Clear metro bundler cache: watchman watch-del-all && rm -rf $TMPDIR/react-native-packager-cache-* && rm -rf $TMPDIR/metro-bundler-cache-*
  • Make sure you have all required environment.
  • Now try building again with detox build (with specific configuration).

4.2. Detox iOS test run fails

  • Check if your meteor app is running by opening localhost:3000 in browser.
  • Make sure software keyboard is displayed in simulator when focusing some input. To enable keyboard press cmd+K.
  • Make sure you have prepared all test data.
  • Sometimes detox e2e tests fail for no reason so all you can do is simply re-run again.

5. Todo

  • TOTP test
  • Push notifications
  • Deep linking
  • Intermittent connectivity