Commit Graph

52 Commits (09ee2d4ea296ed02d8cb5e4d4172d83ddf98979d)

Author SHA1 Message Date
Daniel Gasienica 09ee2d4ea2 Switch to using `requestIdleCallback`
Example:
https://developer.mozilla.org/en-US/docs/Web/API/Background_Tasks_API#Example
8 years ago
Daniel Gasienica d13668544d Rename `IdleListener` to `IdleDetector` 8 years ago
Daniel Gasienica 3140e4d66d Implement basic `IdleListener` 8 years ago
Daniel Gasienica 867f73b80a Use double quotes for identifiers in error messages 8 years ago
Daniel Gasienica 70cdd2b350 Add `stringToArrayBuffer` utility
This way we can avoid an extra dependency.
8 years ago
Daniel Gasienica 2ad0fd7db6 Use Lodash `omit` instead of `delete` 8 years ago
Daniel Gasienica 279b3f81c7 Add `Attachment.deleteData` 8 years ago
Daniel Gasienica 9a540d6d18 Load attachment data before sending message 8 years ago
Daniel Gasienica 6355c54114 Return relative path from `writeAttachmentData`
This will make our app more robust to changes in location on the file system.
8 years ago
Daniel Gasienica 2cd3d5ac16 Add `Message` schema version 3 8 years ago
Daniel Gasienica aa82a2a5fb Add `context` to `Message.upgradeSchema`
Allows us to pass in Electron/Node.js specific functions. This allows better
unit testing in Mocha where we don’t have access to Electron APIs.
8 years ago
Daniel Gasienica ebe2a769c9 Add `Attachment.migrateDataToFileSystem` 8 years ago
Scott Nonnenberg cea42bde7d
Encryption support for backup and restore
Also moved to the _ prefix in backup.js for all private methods exported
for testing.
8 years ago
Scott Nonnenberg 6d8f4b7b6e
Backup: zipped messages.json, flat attachments dir
Backup creates, in a target directory:
  - An attachments folder, with all attachments, each named for their
    parent message's id - a GUID. If there is more than one attachment
    in a given message,  each attachment beyond the first will end with
    '-N', zero-indexed.
  - A file named messages.zip. It contains exactly what went to disk in
    the original export code, but zipped up.

Export is now only 'light,' and in this new messages.zip format.

Import supports both the new format and the old format. If the target
directory has a messages.zip file, we'll treat it as the new format.

Next up: Encrypting attachments and the messages.zip!
8 years ago
Scott Nonnenberg 153a22f46b
Exclude unnecessary data in export: profiles, replayable errors 8 years ago
Scott Nonnenberg c0c758d459
Backup: All exports are now 'light' exports 8 years ago
Scott Nonnenberg e583434366
Refactor: Move Backup under window.Signal 8 years ago
Daniel Gasienica c88381efe3 Use `async` / `await` to improve readability 8 years ago
Daniel Gasienica 2642844c27 Rewrite migration 17 without `idb`
We ran into issues when doing async operations inside of an IndexedDB
`onupgradeneeded` handler. The errors were ‘The transaction is not active’ or
‘Transaction has finished’. The following documentation confirmed that
transactions are committed/terminated when control returns to the event loop:

Spec
- https://www.w3.org/TR/IndexedDB/#transaction-lifetime-concept
- https://www.w3.org/TR/IndexedDB/#upgrade-transaction-construct

Stack Overflow
- https://stackoverflow.com/a/11059085
- https://stackoverflow.com/a/27338944

Since the initial database migration is so critical, I decided to avoid `idb`
with promise support for IndexedDB for now, but will reconsider using it for
other tasks in the future to improve readability of IndexedDB code.
8 years ago
Daniel Gasienica a619d48fac Update schema version history 8 years ago
Daniel Gasienica 0e20e8e2ea Use `Errors.toLogFormat` 8 years ago
Daniel Gasienica a5edbf8328 Initialize schema as first step in `upgradeSchema` 8 years ago
Daniel Gasienica 5d927b73e6 Use `while` loop for IDB cursor iteration
Previously, I messily combined promises and callbacks because I thought we
were affected by the microtask issue:
https://github.com/gasi/idb#iteratecursor--iteratekeycursor

ESLint’s `more/no-then` encouraged me to revisit this and it works as expected.
8 years ago
Daniel Gasienica 182e6ffe10 Add version 17 migration 8 years ago
Daniel Gasienica 752c8f97e6 🎨 Format ternaries 8 years ago
Daniel Gasienica 8dfaa5619f Prefix private functions with underscore 8 years ago
Daniel Gasienica ed336d31d7 Move schema versioning from `Attachment` to `Message` 8 years ago
Daniel Gasienica b9e9f5e19a 🎨 `withInheritedSchemaVersion` to `inheritSchemaVersion` 8 years ago
Daniel Gasienica df693ade7c Allow `Attachment.fileName` to be `null` 8 years ago
Daniel Gasienica c27746b79e Add `Message.withInheritedSchemaVersion` 8 years ago
Daniel Gasienica e9e46464c2 Add `SchemaVersion` type 8 years ago
Daniel Gasienica add4b11df3 Skip invalid attachments and make function sync 8 years ago
Daniel Gasienica 3dfc823716 Add `Attachment.removeSchemaVersion` 8 years ago
Scott Nonnenberg 26c273618a
Refactor: db tasks to database.js, log delete to modules/logs.js 8 years ago
Daniel Gasienica 43b47fd349 Avoid `ensure-error` for privacy reasons
Example:

```
> node
> const nonError = {foo: 'i-am-private'};
undefined

// before
> util.inspect(nonError);
'{ foo: \'i-am-private\' }'

// after
> nonError.toString()
'[object Object]'
>
```
8 years ago
Daniel Gasienica ea07915e6b Escape special characters in file path 8 years ago
Daniel Gasienica 44b81f68dd Remove privacy redaction from `Errors.toLogFormat` 8 years ago
Daniel Gasienica 49e0850fb2 Extract `Privacy` module
Centralizes how we redact sensitive information.
8 years ago
Daniel Gasienica 0e2f8a8a06 Extract `Errors.redactSensitivePaths` 8 years ago
Daniel Gasienica 3dffdc3f0b Rename `Errors` to `GlobalErrors` for clarity 8 years ago
Daniel Gasienica 2575196617 Extract `Errors.addGlobalHandler` procedure 8 years ago
Daniel Gasienica be3e4d86c2 Add `Errors.toLogFormat`
Allows errors to be formatted and sanitized for logging. Removes sensitive paths
such as the app root directory.

Ideally, this module would be called singular `Error` but that is already a
global name. Using `Errors` plural is  similar to Java convention for utilities
such as `Arrays`, `Collections`, `Files`, etc. See:
https://stackoverflow.com/a/11673838
8 years ago
Daniel Gasienica b049412bfd Document workaround for `got` `FormData` bug
See: https://github.com/sindresorhus/got/pull/466
8 years ago
Daniel Gasienica 710701d0fc Document why `key` comes first 8 years ago
Daniel Gasienica 52f7de6a10 Add `debuglogs` module 8 years ago
Daniel Gasienica 85b121aca4 Rename `shouldShowAudioNotificationSetting`
Use `isAudioNotificationSupported` to make it less presentation layer specific.
8 years ago
Daniel Gasienica 21339c6866 Add `Settings` type 8 years ago
Daniel Gasienica 91daedd619 Add `OS` module 8 years ago
Daniel Gasienica 3c15e01630
Auto-fixes: UX Improvements (#2077)
* Whitelist `conversation_search_view` for ESLint

* Autofix `conversation_search_view`

* Remove Vim modeline

* Whitelist globals for ESLint

* Ignore unnamed module IIFE

* Whitelist legacy `then` expressions

* Extract `isSearchable`

Fixes line length violations.

* Remove unused constant

* Remove unnecessary escaping for parens

Suggested by ESLint `no-useless-escape` rule.

* 🎨 Organize file list

* Whitelist `inbox_view` for ESLint

* Autofix `inbox_view`

* Remove Vim modeline

* Add function names

* Whitelist globals for ESLint

* Fix lint errors

* 🔤 `options` properties

* 🎨 Improve `then` chain formatting

* Consider `js/*.js` files as scripts not modules

Forces use of 'use strict' directive per ESLint.

* Ignore unnamed module IIFE

* Fix function argument line breaks
8 years ago
Daniel Gasienica a1ac810343 Security: Replace Unicode order overrides in attachment names
As a user, when I receive a file attachment, I want to have confidence that the
filename I see in the Signal Desktop app is the same as it will be on disk.

To prevent user confusion when receiving files with Unicode order override
characters, e.g. `test<LTRO>fig.exe` appearing as `testexe.gif`, we replace all
occurrences of order overrides (`U+202D` and `U+202E`) with `U+FFFD`.

**Changes**
- [x] Bump `Attachment` `schemaVersion` to 2.
- [x] Replace all Unicode order overrides in `attachment.filename`:
      `Attachment.replaceUnicodeOrderOverrides`.
- [x] Add tests for existing `Attachment.upgradeSchema`
- [x] Add tests for existing `Attachment.withSchemaVersion`
- [x] Add tests for `Attachment.replaceUnicodeOrderOverrides` positives.
- [x] Add `testcheck` generative property-based testing library
      (based on QuickCheck) to ensure valid filenames are preserved.

---

commit 855bdbc7e647e44f73b9e1f5e6d64f734c61169a
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 13:02:01 2018 -0500

    Log error stack in case of error

commit 6e053ed66aee136f186568fa88aacd4814b2ab07
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 12:30:28 2018 -0500

    Improve `upgradeStep` error handling

commit 8c226a2523b701cb578b2137832c3eaf3475bb2b
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 12:30:08 2018 -0500

    Check for expected version before upgrade

    Prevents out of order upgrade steps.

commit 28b0675591e782169128f75429b7bab2a22307fa
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 12:29:52 2018 -0500

    Reject invalid attachments

commit 41f4f457dae9416dae66dc2fa2079483d1f127a9
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 12:29:36 2018 -0500

    Fix upgrade pipeline order

commit 3935629e91c49b8d96c1e02bd37b1b31d1180720
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 12:28:25 2018 -0500

    Avoid `_.isPlainObject`

    Attachments are deserialized from a protocol buffer and can have a
    non-plain-object constructor.

commit 39f6e7f622ff4885e2ccafa354e0edb5864c55d8
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 12:19:07 2018 -0500

    Define basic attachment validity

commit adcf7e3243cd90866cc35990c558ff7829019037
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Thu Feb 22 12:18:54 2018 -0500

    Add tests for attachment upgrade pipeline

commit 82fc4644d7e654eea9f348518b086497be2b0cb4
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Wed Feb 21 12:20:24 2018 -0500

    Favor `async` / `await` over `then`

commit 8fe49e3c40e78ced0b8f2eb0b678f4bae842855d
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Wed Feb 21 12:19:59 2018 -0500

    Add `eslint-more` plugin

    This will enable us to disallow `then` in favor of `async` / `await`.

commit 020beefb25f508ae96cf3fc099599fbbca98802b
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Wed Feb 21 11:31:49 2018 -0500

    Remove unnecessary `async` modifiers

commit 177090c5f5ad9836f0ca0a5c2f298779519e3692
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Wed Feb 21 11:30:55 2018 -0500

    Document `operator-linebreak` ESLint rule

commit 25622b7c59291cb672ae057c47e7327a564cca40
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Wed Feb 21 11:14:15 2018 -0500

    Prefix internal function with `_`

commit 6aa3cf5098df71e9b710064739ec49d74f81b7bf
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 19:00:07 2018 -0500

    Replace all Unicode order override occurrences

commit fd6e23b0a519bce3c12c5b9ac676bcd198034fed
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:48:41 2018 -0500

    Whitelist `testcheck` `check` and `gen` globals

commit 400bae9fac5078821813bc0ca17a5d7a72900161
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:46:57 2018 -0500

    🎨 Fix lint errors

commit da53d3960aa7aa36b7cc1fcff414c9e929c0d9fc
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:42:42 2018 -0500

    Add tests for `Attachment.withSchemaVersion`

commit ec203444239d9e3c443ba88cab7ef4672151072d
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:42:17 2018 -0500

    Add test for `Attachment.upgradeSchema`

commit 4540d5bdf7a4279f49d2e4c6ee03f47b93df46bf
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:05:29 2018 -0500

    Rename `setSchemaVersion` --> `withSchemaVersion`

    Put the schema version first for better readability.

commit e379cf919feda31d1fa96d406c30fd38e159a11d
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:03:22 2018 -0500

    Add filename sanitization to upgrade pipeline

commit 1e344a0d15926fc3e17be20cd90bfa882b65f337
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:01:55 2018 -0500

    Test that we preserve non-suspicious filenames

commit a2452bfc98f93f82bed48b438757af2e66a6af82
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 17:00:56 2018 -0500

    Add `testcheck` dependency

    Allows for generative property-based testing similar to Haskell’s QuickCheck.
    See: https://medium.com/javascript-inside/f91432247c27

commit ceb5bfd2484a77689fdb8e9edd18d4a7b093a486
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 16:15:33 2018 -0500

    Replace Unicode order override characters

    Prevents users from being tricked into clicking a file named `testexe.fig`
    that appears as `testexe.gif` due to a Unicode order override character.

    See:
    - http://unicode.org/reports/tr36/#Bidirectional_Text_Spoofing
    - https://krebsonsecurity.com/2011/09/right-to-left-override-aids-email-attacks/

commit bc605afb1c6af3a5ebc31a4c1523ff170eb96ffe
Author: Daniel Gasienica <daniel@gasienica.ch>
Date:   Fri Feb 16 16:12:29 2018 -0500

    Remove `CURRENT_PROCESS_VERSION`

    Reintroduce this whenever we need it. We currently only deal with schema version
    numbers within this module.
8 years ago