Compare commits

..

183 Commits

Author SHA1 Message Date
adbenitez 1b0d3f8583 Merge remote-tracking branch 'upstream/main' 2026-01-08 17:42:54 +01:00
adb d81cb238df Merge pull request #4155 from deltachat/update-core-2026-01-08
Update core to 2.36.0
2026-01-08 17:26:46 +01:00
adbenitez 220ae351ee update CHANGELOG 2026-01-08 17:25:52 +01:00
adbenitez 4b09158535 update deltachat-core-rust to 'chore(release): prepare for 2.36.0' of 'v2.36.0' 2026-01-08 17:18:26 +01:00
adb e3c423cdd4 Merge pull request #4154 from deltachat/prep-2.35.0
prepare 2.35.0 release
2026-01-08 16:18:29 +01:00
adbenitez 7840f5c577 prepare 2.35.0 release 2026-01-08 16:11:00 +01:00
adb 87091c4214 Merge pull request #4153 from deltachat/adb/update-translations-2026-01-08
update translations
2026-01-08 16:09:27 +01:00
adbenitez 4996ca9d93 update translations 2026-01-08 16:02:35 +01:00
adb 9b8511b7f2 Merge pull request #4151 from deltachat/adb/issue-4133
avoid crash in FetchForegroundService.onCreate()
2026-01-08 15:50:01 +01:00
adbenitez a66fc7bf10 tweak fix 2026-01-07 18:19:44 +01:00
adbenitez 75cad1ab9c update changelog 2026-01-07 17:32:46 +01:00
adb be974b3fc8 Merge branch 'main' into adb/issue-4133 2026-01-07 17:22:07 +01:00
adbenitez 777ef609ff avoid crash in FetchForegroundService.onCreate() 2026-01-07 17:13:36 +01:00
adbenitez 224964db95 fix TAG in FetchForegroundService 2026-01-07 16:08:51 +01:00
B. Petersen 5bfc91de1b remove unused strings, add new deprecated strings 2026-01-07 15:57:02 +01:00
B. Petersen b9d1aa4338 clarify position of "Add Second Device" settings
clarify, that the "Add Second Device" settings are within Delta Chat,
not within system or app settings.

we got reports of ppl searching within system settings,
esp. on iOS, some apps have additional settings there,
so it is not so far fetched.

but also for other OS, the hint to start Delta Chat is useful
and not only noise.
2026-01-05 13:29:27 +01:00
B. Petersen e296dad260 update translations, add Kabyl (Taqbaylit) language 2026-01-05 13:26:05 +01:00
adb 4e372511fb Merge pull request #4145 from deltachat/adb/issue-4143
use DC_EVENT_TRANSPORTS_MODIFIED
2026-01-03 16:24:43 +01:00
adbenitez e0a71d0fff use DC_EVENT_TRANSPORTS_MODIFIED to sync changes from remote devices 2026-01-03 16:13:32 +01:00
adb 5bcdd4cf16 Merge pull request #4144 from deltachat/update-core-and-stuff-2026-01-02
Update core to 2.35.0
2026-01-02 14:49:26 +01:00
adbenitez 68b0b365da update translations 2026-01-02 14:42:18 +01:00
adbenitez 227046a739 update changelog 2026-01-02 14:40:03 +01:00
adbenitez f9127341e7 update deltachat-core-rust to 'chore(release): prepare for 2.35.0' of 'v2.35.0' 2026-01-02 14:38:16 +01:00
adb 184da9c20e Merge pull request #4142 from deltachat/r10s/remove-email-from-account-switcher
remove email from account switcher
2026-01-02 13:47:55 +01:00
adb 96b5cabeb6 Merge branch 'main' into r10s/remove-email-from-account-switcher 2026-01-02 13:45:27 +01:00
adb 4a8706b9e3 Merge pull request #4139 from deltachat/adb/issue-4138
avoid NPE accessing location manager, event center and notification center
2025-12-29 23:02:27 +01:00
adb 94a10afac2 Merge pull request #4134 from deltachat/adb/issue-4124
Harden security around relays and profile management
2025-12-29 23:01:43 +01:00
B. Petersen a0660faf07 update CHANGELOG 2025-12-24 13:42:36 +01:00
B. Petersen 26170fc147 no showing email in account switcher
even if that is done for non-chatmail only,
it raises false expectations for other profiles,
and here it is easy to avoid - if that is really an important information for the user,
they can add it to the label.

also, this synchronizes UI which what is done on desktop/iOS
2025-12-24 13:40:18 +01:00
adbenitez 8d6147761b add comment 2025-12-23 20:11:03 +01:00
adbenitez 9d6abfd979 avoid wrongly showing emoji icon while recording audio and event arrives 2025-12-23 20:08:57 +01:00
adbenitez 46f4324478 upload mappings to release 2025-12-22 20:03:44 +01:00
adbenitez bfeab57744 update screenshots 2025-12-22 19:36:26 +01:00
adbenitez 2e99926e82 Fix file_provider_paths.xml to support SD card 2025-12-22 19:21:22 +01:00
adbenitez c28148b843 avoid NPE accessing location manager, event center and notification center 2025-12-22 16:32:27 +01:00
B. Petersen b6b3fe12b6 fix: add members, not subscribers to emails 2025-12-21 16:44:20 +01:00
adbenitez 56c00a7c43 update changelog 2025-12-18 22:11:54 +01:00
adb 4803bcccdd Merge branch 'main' into adb/issue-4124 2025-12-18 22:09:44 +01:00
adb 92f17d5156 Merge pull request #4094 from deltachat/adb/remove-realtime-toggle
remove realtime preference toggle
2025-12-18 22:09:25 +01:00
adbenitez 5310c41694 protect profile deletion 2025-12-18 22:08:26 +01:00
adbenitez a54f3ed1a2 require authorization for relays management 2025-12-18 20:21:52 +01:00
adb 8ceb12370f Update src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
Co-authored-by: Hocuri <hocuri@gmx.de>
2025-12-17 12:07:01 +01:00
adb 0a7839fb7d Update src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
Co-authored-by: Hocuri <hocuri@gmx.de>
2025-12-17 12:06:50 +01:00
adb 76e4c59119 Merge pull request #87 from ArcaneChat/copilot/add-email-subject-field
Add subject field for mailing list chats
2025-12-16 20:31:45 +01:00
adbenitez 33b69b9f3a update scripts 2025-12-16 20:30:50 +01:00
adbenitez b4f5e2d124 allow to set subject in email threads 2025-12-16 20:25:05 +01:00
adb 6853d797f2 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-16 18:58:07 +01:00
adbenitez fa7a3c9c32 Merge remote-tracking branch 'upstream/main' 2025-12-16 18:50:00 +01:00
adb a70c76f7f3 Merge pull request #4132 from deltachat/prep-2.34.0
prepare 2.34.0
2025-12-16 17:55:19 +01:00
adbenitez 87a6a12367 prepare 2.34.0 2025-12-16 17:50:29 +01:00
adb 9bcdcd918e Merge pull request #4130 from deltachat/update-core-and-stuff-2025.12.16
Update core to 2.34.0
2025-12-16 17:39:45 +01:00
adbenitez 7454454b63 update changelog 2025-12-16 17:35:11 +01:00
adbenitez 69a5e42640 update RPC bindings 2025-12-16 17:35:04 +01:00
adbenitez 1e86ed225d update translations 2025-12-16 17:34:28 +01:00
adbenitez 4cd7977ced update deltachat-core-rust to 'chore: prepare 2.34.0 release' of 'v2.34.0' 2025-12-16 17:29:44 +01:00
adb 8d0f1a6602 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-16 17:25:40 +01:00
adb 0ce10cbb35 Merge pull request #4129 from deltachat/adb/issue-4116-p2
do accounts migration in background
2025-12-16 17:23:24 +01:00
adb 7decf02fd3 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-16 14:49:57 +01:00
Hocuri 114731f722 Make sending of statistics into a setting (#3794)
Counterpart of https://github.com/chatmail/core/pull/6851

* Make sending of statistics into a setting

* feat: Count securejoin sources and UI paths

* feat: Rename self_reporting to send_statistics

* Adapt core's API change

* WIP, untested: Adapt to a rename on the core side

* Adapt to generated jsonrpc

* New strings and a new dialog

* Adapt to the API change

* Rewording: `...and support research`

* "More Info" button rather than link

* Small fixes

* Open the correct survey (though it doesn't work yet)

* Changelog

* Update help

* Fix compile error

* Fix compilation

* Revert submodule change

* Don't show a device message yet

* Move "Send Statistics" setting

* Fix compilation error

* Remove unused constant

---------

Co-authored-by: adb <adb@merlinux.eu>
2025-12-16 13:10:51 +01:00
B. Petersen 2a7025ef17 stop using deprecated ask_delete_messages_simple 2025-12-15 18:09:06 +01:00
adb 257003ba09 Merge branch 'main' into adb/issue-4116-p2 2025-12-15 17:29:49 +01:00
adbenitez ca110c6d74 improve code 2025-12-15 17:28:48 +01:00
adbenitez 09f66caadc indent code 2025-12-15 17:23:49 +01:00
B. Petersen 4a73ac19c2 tweak another occurance of 'Chats and Media' 2025-12-15 17:21:04 +01:00
B. Petersen 9c3281e182 chats preferences is called just 'Chats'
it was renamed first on iOS from 'Chats and Media' to 'Chats'
to not confuse with 'All Apps and Media' -
however, that point is also valid for android,
but even if not, it is good for inner consistency and simpler documentation.

moreover, the settings are in reality also about contacts and more,
so just a broad chats is fine.

but also for outer consistency,
this seems better - also in quite some other apps,
it is just called 'chats'
2025-12-15 17:21:04 +01:00
adbenitez a84e17635a Merge branch 'adb/issue-4116-p2' of https://github.com/deltachat/deltachat-android into adb/issue-4116-p2 2025-12-15 17:20:50 +01:00
adbenitez af7d915d14 fix gplay flavor 2025-12-15 17:20:33 +01:00
adb f679376445 Merge branch 'main' into adb/issue-4116-p2 2025-12-15 16:38:00 +01:00
adbenitez 4f32b994fa do accounts migration in background
move accounts migration to background thread and wait for it in
foreground to avoid ANR in background in ApplicationContext
2025-12-15 16:29:13 +01:00
adb dbb9115024 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-15 12:56:15 +01:00
adb af640044c9 Merge pull request #4125 from deltachat/r10s/simplify-delete-wording
simpler 'really delete?' wordings
2025-12-15 12:55:06 +01:00
adb bece13d75e Merge pull request #4126 from deltachat/adb/issue-4059
avoid TransactionTooLargeException in LogViewActivity
2025-12-15 12:54:51 +01:00
adbenitez 1b9c619739 update changelog 2025-12-15 12:53:16 +01:00
adb ccd8df85e4 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-15 12:51:27 +01:00
adbenitez 1195945637 update changelog 2025-12-15 12:48:56 +01:00
adb 2e77ae8f4d Merge branch 'main' into adb/issue-4059 2025-12-15 12:48:08 +01:00
adbenitez c8fefca916 avoid TransactionTooLargeException in LogViewActivity 2025-12-15 12:44:50 +01:00
B. Petersen 6acb2203ef simpler 'really delete?' wordings
this removes the addendum 'on all your devices'
from the 'really delete?' questions.

- after polls, and looking at what other apps are doing,
  it is just the default expectation, that a message is deleted from all devices,
  also, we do not have an option (nor do not want to have)

- so, at that point - fresh user, one device -
  there is no need to clutter with other convepts and relativation.
  also, most user will never have more devices.

- ppl anyway do not read -
  but if they do, it is good to have things as much on point as possible :)

- the question fits better to the "delete for everyone" option

- simplify code and strings,
  as device message deletion is no longer special
  (there, we never said "on all your devices")

the addendum 'from your devices' was added as
one year ago, for technical limitations, deletion was really on one device.
when we removed that limitation, we added to addendum,
so ppl used to old apps have a chance to get the change.
meanwhile, the new default is clear and settled and the addendum
does more harm and raise questions than doing good.
2025-12-15 11:29:02 +01:00
adb 46c627dde1 Merge pull request #4123 from deltachat/adb/issue-4112
don't show `new_classic_contact` option in add-relay mode
2025-12-14 15:29:18 +01:00
adbenitez 1366bc3571 don't show new_classic_contact option in add-relay mode 2025-12-13 20:10:31 +01:00
adb 20c487be7a Merge pull request #4122 from deltachat/adb/update-rpc-bindings-2025.12.13
update RPC bindings
2025-12-13 20:05:40 +01:00
adbenitez ef674746d9 update RPC bindings 2025-12-13 20:04:43 +01:00
adbenitez e65268979c tweak intro image 2025-12-13 19:03:32 +01:00
adbenitez e289432a09 Merge remote-tracking branch 'upstream/main' 2025-12-13 11:51:12 +01:00
adbenitez 8509049791 update intro image 2025-12-13 11:50:35 +01:00
adbenitez d1b490a02d update spanish strings 2025-12-13 11:09:22 +01:00
adb 64d33bebbd Merge pull request #4119 from deltachat/adb/issue-4118
avoid NPE in InstantOnboardingActivity.onCreate
2025-12-12 17:14:38 +01:00
adbenitez 0a44d00451 add comment 2025-12-12 17:04:36 +01:00
adb 353b2c0488 Merge pull request #4121 from deltachat/adb/issue-4114
Allow to add relay from clipboard or image
2025-12-12 16:40:33 +01:00
B. Petersen 85c68d0485 remove dead account-creation-from-qr code 2025-12-12 16:39:27 +01:00
adbenitez 12c2237e00 remove leftover 2025-12-12 16:30:58 +01:00
adbenitez 68f9533392 Allow to add relay from clipboard or image if camera permission is not granted 2025-12-12 16:29:01 +01:00
adb e93efa318a Merge pull request #4117 from deltachat/adb/issue-4116
add more logging
2025-12-12 15:47:15 +01:00
adbenitez fbc01ff0a2 switch to new profile if no URI is available 2025-12-12 15:05:04 +01:00
adbenitez b0ca48740a avoid NPE in InstantOnboardingActivity.onCreate 2025-12-12 15:01:41 +01:00
adbenitez fa795dd149 add more logging 2025-12-12 14:28:17 +01:00
B. Petersen 0a4f1ded54 tune down 'account' wording 2025-12-11 18:40:00 +01:00
adbenitez b2e88d50fd fix typo 2025-12-10 17:24:01 +01:00
adbenitez 2a54867724 improve welcome message and intro graphic 2025-12-10 16:10:48 +01:00
adbenitez 210e5c7fbc Merge remote-tracking branch 'upstream/main' 2025-12-10 13:32:40 +01:00
adb a5818c7cba Merge pull request #4110 from deltachat/prep-2.33.1
prepare 2.33.1
2025-12-10 13:29:32 +01:00
adbenitez 059d517d0d update build.gradle 2025-12-10 12:51:05 +01:00
adbenitez 5c3eb0ac82 update changelog 2025-12-10 12:48:20 +01:00
adbenitez efa04fce18 update translations 2025-12-10 12:48:15 +01:00
adb fb9771adde Merge pull request #4106 from deltachat/adb/issue-4104
remove unnecessary lock
2025-12-10 12:44:42 +01:00
adb 2930d0dc2d Merge branch 'main' into adb/issue-4104 2025-12-10 12:18:39 +01:00
adb e6e85ed812 Merge pull request #4109 from deltachat/adb/add-missing-padding-conversationactivity
fix ConversationActivity on Android <11
2025-12-10 12:16:52 +01:00
adbenitez 7837a99e7b fix ConversationActivity on Android <11 2025-12-10 12:13:46 +01:00
adb 8c546dc358 Merge pull request #4107 from deltachat/adb/improve-add-relay-workflow
improve UX of adding new relays via QR or clicking links
2025-12-10 11:37:18 +01:00
adb f0c75ec3c6 Merge pull request #4108 from deltachat/adb/allow-dcaccount-in_webview
add dcaccount and dclogin to schema whitelist
2025-12-10 11:36:58 +01:00
adbenitez 658283c4e8 add dcaccount and dclogin to schema whitelist 2025-12-10 11:06:15 +01:00
adbenitez 0ef4d645df allow to add relays via link 2025-12-10 10:57:55 +01:00
adbenitez 91713911ee improve UX of adding new relays via QR 2025-12-10 09:58:56 +01:00
adbenitez 1c0a54d75e remove unnecessary lock 2025-12-09 18:39:55 +01:00
B. Petersen 0f82b3ca93 deprecate strings used to create profiles from main scanner
instead, one should be asked whether to add a transport.

- it is very probably the more wanted action -
  when one wants a new profile, it is better to learn first,
  that one has to go over "switch profil"

- less can go wrong -
  if ppl play around,
  adding a transport is less harmful than a new profile
  where they do not know how to switch, send from different ones etc.
2025-12-09 18:27:47 +01:00
adb 1a80187c07 Merge pull request #4103 from deltachat/adb/issue-4102
avoid NPE in WebxdcGarbageCollectionWorker
2025-12-09 18:25:34 +01:00
adbenitez e315d0505c fix startWork 2025-12-09 15:05:42 +01:00
adbenitez 10b966a7c8 store context and get Rpc on startWork 2025-12-09 12:34:39 +01:00
adbenitez 3c65408f25 avoid NPE in WebxdcGarbageCollectionWorker 2025-12-09 11:36:20 +01:00
adb 1e31b479e8 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-09 10:04:37 +01:00
adbenitez 6f1f446aa8 Merge remote-tracking branch 'upstream/main' 2025-12-08 19:17:03 +01:00
adbenitez e5149ac255 Merge remote-tracking branch 'upstream/main' 2025-12-08 19:16:02 +01:00
adb 403539da35 Merge pull request #4100 from deltachat/prep-2.33.0
prepare 2.33.0
2025-12-08 17:40:18 +01:00
adbenitez 443501112d prepare 2.33.0 2025-12-08 17:39:31 +01:00
adb bea2effb89 Merge pull request #4099 from deltachat/adb/update-translations-2025.12.08
update translations
2025-12-08 17:34:41 +01:00
adbenitez b2d875cc61 update translations 2025-12-08 17:30:55 +01:00
B. Petersen e94f571744 remove more deprecated strings 2025-12-08 16:25:19 +01:00
adb cf91468f65 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-08 15:50:44 +01:00
adb 69c6fdd070 Merge pull request #4096 from deltachat/adb/rename-relayutil
Rename RelayUtil to ShareUtil
2025-12-08 15:37:39 +01:00
B. Petersen 1b9bfc37ad remove deprecated strings 2025-12-08 15:20:30 +01:00
B. Petersen 8cb1c195b1 mark unused string as deprecated 2025-12-08 13:38:20 +01:00
B. Petersen 41f963332c remove 'email' from welcome message 2025-12-08 13:38:20 +01:00
B. Petersen dc6dee6a1a reword 'transport' to 'relay' 2025-12-08 13:38:20 +01:00
adbenitez 35becfc63b rename RelayUtil to ShareUtil 2025-12-08 12:54:42 +01:00
adb 6c31d8cf85 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-08 12:48:32 +01:00
adb f6c25a2015 Merge pull request #4085 from deltachat/adb/issue-4082
improve KeepAliveService
2025-12-08 12:47:58 +01:00
adbenitez 4c8d27f4bb Merge branch 'adb/remove-realtime-toggle' of https://github.com/deltachat/deltachat-android into adb/remove-realtime-toggle 2025-12-07 17:33:11 +01:00
adbenitez 87c49dc680 update changelog 2025-12-07 17:29:07 +01:00
adb f0d5695729 Merge branch 'main' into adb/remove-realtime-toggle 2025-12-07 17:27:55 +01:00
adb be01c3b14f Merge branch 'main' into adb/issue-4082 2025-12-07 17:21:50 +01:00
adb bf435f4303 Merge pull request #4090 from deltachat/adb/issue-4089
only save common image formats to Pictures
2025-12-07 17:21:31 +01:00
adbenitez 0289f47adc remove realtime preference toggle 2025-12-07 17:18:39 +01:00
adb 1f455c435f Merge pull request #4093 from deltachat/adb/improve-relay-list-item-layout
improve realy_list_item layout
2025-12-07 12:55:03 +01:00
adbenitez db8d4b5daf improve realy_list_item layout 2025-12-07 12:53:29 +01:00
adb 5ac7f9ee11 Merge branch 'main' into adb/issue-4082 2025-12-07 12:34:43 +01:00
adb 6c80f85290 Merge branch 'main' into adb/issue-4089 2025-12-07 12:34:30 +01:00
adb 744bca93e8 Merge pull request #4092 from deltachat/link2xt/flake-android-36
flake.nix: update Android SDK from 35 to 36
2025-12-07 12:34:13 +01:00
adb 601a65a1cb Merge pull request #4080 from deltachat/adb/add-transport-list-activity
add screen to list/add/remove transports/relays
2025-12-07 12:33:50 +01:00
adbenitez 9f2523da21 use R.string.def, don't add extra string 2025-12-07 11:50:47 +01:00
link2xt c936d51bac flake.nix: update Android SDK from 35 to 36
Closes <https://github.com/deltachat/deltachat-android/issues/4091>
2025-12-06 21:02:00 +00:00
adbenitez b77862c290 update changelog 2025-12-05 23:48:21 +01:00
adbenitez c495c3936b only save common image formats to Pictures 2025-12-05 23:45:27 +01:00
adbenitez a5a5819eec add makefile 2025-12-05 23:18:41 +01:00
adbenitez 429c3fb57c tweak changelog 2025-12-05 23:08:10 +01:00
adb 0c9bec1d3d Merge branch 'main' into adb/add-transport-list-activity 2025-12-05 23:07:06 +01:00
adb 51771669d3 Merge pull request #4088 from deltachat/update-core-and-stuff-2025.12.5
Update core to 2.33.0
2025-12-05 23:06:18 +01:00
adbenitez f32651cd9d update RPC bindings 2025-12-05 23:03:33 +01:00
adbenitez 07a2663591 update translations 2025-12-05 22:59:22 +01:00
adbenitez fe9ee4c484 update changelog 2025-12-05 22:55:12 +01:00
adbenitez 1425815467 update deltachat-core-rust to 'chore(release): prepare for 2.33.0' of 'v2.33.0' 2025-12-05 22:52:47 +01:00
adbenitez eea4a1b124 Merge remote-tracking branch 'upstream/main' 2025-12-05 22:37:50 +01:00
adb 72c7772e89 Merge pull request #4086 from deltachat/adb/set-clipToPadding-in-xml
set clipToPadding in xml instead of dynamically
2025-12-05 22:37:18 +01:00
adb c4f0dc2f2d Merge branch 'main' into adb/set-clipToPadding-in-xml 2025-12-05 22:36:47 +01:00
adb 2d0645465e Merge pull request #4087 from deltachat/adb/make-last-item-visible-in-chatlist
make last item fully visible when scrolling bottom of chat list
2025-12-05 22:27:06 +01:00
adbenitez 5031993289 update changelog 2025-12-05 21:22:07 +01:00
adbenitez 8e944552b3 make last item fully visible in chat list 2025-12-05 21:18:16 +01:00
adbenitez 342b071189 set clipToPadding in xml instead of dynamically 2025-12-05 21:12:11 +01:00
Korb 32248b4635 Adding Russian metadata translation (#62)
* Create ru-RU/title.txt

* Create ru-RU/short_description.txt
2025-12-05 19:00:30 +01:00
adbenitez 89b4be49c8 tweak dialog buttons's color 2025-12-05 01:55:04 +01:00
adbenitez b3230abd68 update changelog 2025-12-05 01:40:17 +01:00
adbenitez e26ac3d264 improve KeepAliveService 2025-12-05 00:29:58 +01:00
adb bd4fa0b032 Merge branch 'main' into adb/add-transport-list-activity 2025-12-04 23:16:58 +01:00
adbenitez f24b2e2540 update changelog 2025-12-04 20:15:55 +01:00
adbenitez f8d2cd7bf3 Merge branch 'adb/add-transport-list-activity' of https://github.com/deltachat/deltachat-android into adb/add-transport-list-activity 2025-12-04 20:12:14 +01:00
adbenitez 1ff99ddbe4 add "add transport" floating button 2025-12-04 20:11:42 +01:00
adb 13bf0d6f9f Merge branch 'main' into adb/add-transport-list-activity 2025-12-04 18:42:58 +01:00
adbenitez d24f53895e allow to add transport from QR scanner 2025-12-04 18:42:14 +01:00
adbenitez 230fb79584 allow removing transports 2025-12-02 05:32:21 +01:00
adbenitez 9181a9c398 add uncommited/missing import in RelayListActivity 2025-12-02 05:21:02 +01:00
adbenitez 2f05b20b0f allow editing transports 2025-12-02 05:20:42 +01:00
adbenitez 115ffae588 create RelayListActivity with basic listing of relays/transports 2025-12-02 04:46:30 +01:00
adb 7455e56f11 Merge branch 'main' into adb/add-transport-list-activity 2025-12-01 23:34:05 +01:00
adbenitez 56459e7e7a add TransportListActivity 2025-12-01 21:26:37 +01:00
185 changed files with 6990 additions and 5548 deletions
+5 -1
View File
@@ -59,6 +59,8 @@ jobs:
rm build/outputs/apk/foss/release/*universal*
./gradlew assembleGplayRelease
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
mv build/outputs/mapping/fossRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-foss.txt
mv build/outputs/mapping/gplayRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-gplay.txt
- name: Release on GitHub
uses: softprops/action-gh-release@v1
@@ -67,7 +69,9 @@ jobs:
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
prerelease: ${{ contains(github.event.ref, '-beta') }}
fail_on_unmatched_files: true
files: build/outputs/apk/foss/release/*.apk
files: |
build/outputs/apk/foss/release/*.apk
build/outputs/mapping/fossRelease/mapping-*.txt
- name: Release on ZapStore
run: |
+30 -1
View File
@@ -2,23 +2,52 @@
## Unreleased
* Don't notify notification-to-all from in-chat apps if the chat is muted
* Allow to see inbox quota for all relays in connectivity screen
* Update to core 2.36.0
## v2.35.0
2026-01
* Protect profile deletion and relays management with system lock/pin
* Fix: Remove address from profile switcher
* Fix: Avoid crash if the system doesn't allow to start foreground service
* Remove deprecated "real-time apps" switch
* Update to core 2.35.0
## v2.34.0
2025-12
* Allow to add relay from clipboard or image if camera permission is not granted
* Avoid crash in the "View Log" screen
* Update to core 2.34.0
## v2.33.1
2025-12
* Target Android 16
* Change color of links in text messages
* Improve edge-to-edge support
* Add the option (opt-in) to send anonymous statistics to Delta Chat's developers
* Metadata protection: protect message recipients
* Allow to withdraw channel invite links and QR codes
* Allow to open externally links clicked inside in-chat apps
* Do not show "1 member" when the process of joining the group is not finished
* Make search case-insensitive for non-ASCII chat and contact names
* Improve handling of video recoding
* Send .webm videos as file, they are not supported by all platforms
* Tweak advanced section and wording of some advanced options
* Fix: avoid crash in push notifications handling
* Fix: avoid freezing in background
* Fix: clean up web storage of deleted in-chat apps
* Fix: avoid crash when exporting some files with wrong image MIME type
* Expose new "Multi-device mode" option instead of "Delete from server" for chatmail profiles
* Opened in-chat apps got a 'About Apps' menu item
* Avoid gray avatar on profile creation
* Avoid last item in chat list being covered by the floating button
* Add disk usage statistics to log
* Update to core 2.29.0
* New experimental feature: several addresses per profile
* Update to core 2.33.0
## v2.25.0
2025-11
+2 -2
View File
@@ -33,8 +33,8 @@ android {
useLibrary 'org.apache.http.legacy'
defaultConfig {
versionCode 30000732
versionName "2.25.0"
versionCode 30000736
versionName "2.36.0"
applicationId "chat.delta.lite"
multiDexEnabled true
Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 KiB

After

Width:  |  Height:  |  Size: 446 KiB

@@ -0,0 +1,36 @@
ArcaneChat — децентрализованный и защищённый мессенджер, удобный для друзей и семьи.
• Анонимность. Мгновенный вход без номера телефона, e-mail или других личных данных.
• Гибкость. Поддерживает несколько профилей чатов и легко настраивается на нескольких устройствах.
• Расширяемость. В чатах можно использовать мини-приложения: списки покупок, календари или игры.
• Надёжность. Работает даже при плохом соединении и в сложных сетевых условиях.
• Безопасность. Проверенное сквозное шифрование, защищённое от сетевых и серверных атак.
• Самостоятельность. Может работать с вашим собственным e-mail-адресом или сервером.
ArcaneChat — клиент Delta Chat, разработанный с акцентом на удобство, качественный UX и экономию трафика. Также приложение часто экспериментирует с новыми функциями, которые со временем могут быть добавлены в официальный клиент Delta Chat.
<b>Основные отличия от официального клиента Delta Chat:</b>
<ul>
<li>Поддержка некоторых стилей markdown в текстовых сообщениях (жирный, курсив, зачёркнутый и т.д.)</li>
<li>Поддержка отображения анимированных стикеров Telegram (.tgs-файлы)</li>
<li>Поддержка предпросмотра SVG-изображений</li>
<li>Несколько цветовых тем/скинов</li>
<li>Возможность отключать профили, полностью отключая им доступ в сеть для экономии трафика</li>
<li>На панели переключения профилей видно состояние подключения каждого профиля</li>
<li>Дополнительная опция для обмена местоположением на 12 часов</li>
<li>Нажатие на сообщение с POI открывает его на карте</li>
<li>Статус «был(а) в сети» отображается в списке контактов, как в WhatsApp, Telegram и т.д.</li>
<li>Видео воспроизводятся по кругу — удобно для коротких GIF-видео</li>
<li>У чата «Device Messages» в списке чатов отображается значок подтверждения</li>
<li>В режиме «низкое качество» голосовые сообщения сжимаются сильнее для экономии трафика</li>
<li>Автоматическая загрузка сообщений по умолчанию ограничена 640KB</li>
<li>Отображаемое имя профиля всегда видно в заголовке приложения вместо названия приложения</li>
<li>Для разработчиков мини-приложений: доступны дополнительные возможности WebXDC API, см. https://github.com/ArcaneChat/android/#webxdc</li>
<li>Более удобная организация настроек с дополнительным разделом «Privacy»</li>
</ul>
@@ -0,0 +1 @@
⚡ Быстрые зашифрованные чаты для семьи 🎉
@@ -0,0 +1 @@
ArcaneChat
+1 -1
View File
@@ -18,7 +18,7 @@
build-tools-35-0-0
cmdline-tools-latest
platform-tools
platforms-android-35
platforms-android-36
ndk-27-2-12479018
]);
rust-version = pkgs.lib.removeSuffix "\n"
+83
View File
@@ -0,0 +1,83 @@
.PHONY: apk
apk:
./scripts/rebrand.sh
./gradlew --offline assembleGplayRelease
./scripts/undo_rebrand.sh
.PHONY: aab
aab:
./scripts/rebrand.sh
sed -i 's/signingConfigs.releaseApk/signingConfigs.releaseBundle/g' build.gradle
./gradlew --offline bundleGplayRelease
sed -i 's/signingConfigs.releaseBundle/signingConfigs.releaseApk/g' build.gradle
./scripts/undo_rebrand.sh
.PHONY: foss
foss:
./scripts/rebrand.sh
./gradlew --offline assembleFossRelease
./scripts/undo_rebrand.sh
.PHONY: install
install:
adb -d install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: emulator-install
emulator-install:
adb install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: fetch
fetch:
git fetch upstream
.PHONY: clean
clean:
./gradlew --offline clean
# CORE:
.PHONY: fetch-core
fetch-core:
cd ../core && git fetch upstream
.PHONY: core
core:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-fast
core-fast:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh arm64-v8a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-v7
core-v7:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh armeabi-v7a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-x86
core-x86:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh x86; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: link
link:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
.PHONY: unlink
unlink:
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
+1
View File
@@ -6,3 +6,4 @@ find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/Delta Chat
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/get.delta.chat/github.com\/ArcaneChat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/delta.chat\/donate/arcanechat.me\/#contribute/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/Delta Chat/ArcaneChat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/❤️/💜/g'
+1
View File
@@ -6,6 +6,7 @@ find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/ArcaneChat
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/github.com\/ArcaneChat/get.delta.chat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/arcanechat.me\/#contribute/delta.chat\/donate/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/ArcaneChat/Delta Chat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/💜/❤️/g'
# don't revert the app name
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<application>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="specialUse"
android:enabled="true" />
</application>
</manifest>
+5
View File
@@ -10,6 +10,11 @@
<meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" />
<application>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="dataSync"
android:enabled="true" />
<service
android:name=".notifications.FcmReceiveService"
android:foregroundServiceType="dataSync"
@@ -62,7 +62,7 @@ public class FcmReceiveService extends FirebaseMessagingService {
prefixedToken = addPrefix(rawToken);
Log.i(TAG, "FCM token: " + prefixedToken);
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
triedRegistering = true;
});
}
@@ -91,7 +91,19 @@ public class FcmReceiveService extends FirebaseMessagingService {
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
Log.i(TAG, "FCM push notification received");
FetchForegroundService.start(this);
// Note: The system can downgrade the high priority messages to normal priority
// if the app is not using the high priority messages for surfacing time sensitive
// content to the user. If the message's priority is downgraded, your app cannot
// start a foreground service and attempting to start one results in a
// ForegroundServiceStartNotAllowedException.
// So, it's recommended to check the result of RemoteMessage.getPriority() and
// confirm it's PRIORITY_HIGH() before attempting to start a foreground service.
// source: https://developer.android.com/develop/background-work/services/fgs/restrictions-bg-start
if (remoteMessage.getPriority() == RemoteMessage.PRIORITY_HIGH) {
FetchForegroundService.start(this);
} else {
FetchForegroundService.fetchSynchronously();
}
}
@Override
@@ -104,6 +116,6 @@ public class FcmReceiveService extends FirebaseMessagingService {
public void onNewToken(@NonNull String rawToken) {
prefixedToken = addPrefix(rawToken);
Log.i(TAG, "new FCM token: " + prefixedToken);
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
}
}
+9 -22
View File
@@ -208,16 +208,7 @@
<activity android:name=".NewConversationActivity"
android:theme="@style/TextSecure.LightNoActionBar"
android:windowSoftInputMode="stateHidden"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
android:exported="true">
<intent-filter>
<data android:scheme="mailto"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
</activity>
<activity android:name=".ContactMultiSelectionActivity"
@@ -233,13 +224,16 @@
android:theme="@style/TextSecure.LightNoActionBar"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".EditTransportActivity"
<activity android:name=".relay.EditRelayActivity"
android:launchMode="singleTask"
android:windowSoftInputMode="stateUnchanged"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
android:exported="true">
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
</activity>
<activity android:name=".relay.RelayListActivity"
android:windowSoftInputMode="stateHidden"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".proxy.ProxySettingsActivity"
android:label="@string/proxy_settings"
android:windowSoftInputMode="stateHidden"
@@ -361,15 +355,13 @@
<activity android:name=".calls.CallActivity"
android:label=""
android:theme="@style/TextSecure.LightTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
android:exported="true">
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
</activity>
<activity android:name=".WebxdcActivity"
android:label=""
android:theme="@style/TextSecure.LightTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
android:exported="true">
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
</activity>
<activity android:name=".WebxdcStoreActivity"
@@ -387,11 +379,6 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
</activity>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="dataSync"
android:enabled="true" />
<service
android:name=".geolocation.LocationBackgroundService"
android:foregroundServiceType="location" />
+179 -104
View File
@@ -15,7 +15,7 @@
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
</ul>
</li>
@@ -26,6 +26,7 @@
<li><a href="#kdyź-se-nedopatřením-odstraníš">Kdyź se nedopatřením odstraníš.</a></li>
<li><a href="#nechci-již-přijímat-zprávy-ze-skupiny">Nechci již přijímat zprávy ze skupiny.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#mám-zájem-o-technické-podrobnosti-kde-najdu-víc">Mám zájem o technické podrobnosti. Kde najdu víc?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
</li>
</ul>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
<h3 id="multiple-accounts">
@@ -261,14 +260,11 @@ or to <strong>Switch Profiles</strong>.</p>
</h3>
<ul>
<li>
<p>Profilový obrázek lze zvolit v nastavení. Když napíšeš svému kontaktu,
<p>Profilový obrázek lze zvolit v nastavení. Když napíšeš svému kontaktu,
nebo přidáš nový vyfocením QR kódu, tyto kontakty automaticky uvidí tvůj profilový obrázek.</p>
</li>
<li>
<p>Z důvodu soukromí nikdo nevidí tvůj profilový obrázek dokud jim nenapíšeš.</p>
</li>
<ul>
<li>Z důvodu soukromí nikdo nevidí tvůj profilový obrázek dokud jim nenapíšeš.</li>
</ul>
<h3 id="signature">
@@ -303,7 +299,8 @@ they will see it when they view your contact details.</p>
</li>
<li>
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
Archived chats remain accessible above the chat list or via search.</p>
They remain accessible above the chat list or via search
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
</li>
<li>
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
@@ -338,7 +335,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -375,22 +372,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -455,19 +448,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<h3 id="delold">
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
</h3>
<ul>
<li>If you want to save storage on your device, you can choose to delete old
messages automatically.</li>
<li>To turn it on, go to “delete old messages from device” in the “Chats &amp; Media”
settings. You can set a timeframe between “after an hour” and “after a year”;
<p>If you want to save storage on your device, you can choose to delete old
messages automatically.</p>
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
You can set a timeframe between “after an hour” and “after a year”;
this way, <em>all</em> messages will be deleted from your device as soon as they are
older than that.</li>
</ul>
older than that.</p>
<h3 id="remove-account">
@@ -515,9 +507,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Z menu v pravém horním rohu, nebo stiskem příslušného tlačítka na Androidu / iOS vyber <strong>Nový hovor</strong> a pak <strong>Nová skupina</strong>.</li>
<li>Na další obrazovce, vyber <strong>členy skupiny</strong> a zadej <strong>Název skupiny</strong>. Také můžeš vybrat <strong>obrázek skupiny</strong>.</li>
<li>Jakmile do skupiny pošleš <strong>první zprávu</strong>, všichni členové budou vyrozuměni o nové skupině a mohou do ní také psát (dokud nepošleš první zprávu členové skupiny o ní nebudou vědět).</li>
<li>
<p>Z menu v pravém horním rohu, nebo stiskem příslušného tlačítka na Androidu / iOS vyber <strong>Nový hovor</strong> a pak <strong>Nová skupina</strong>.</p>
</li>
<li>
<p>Na další obrazovce, vyber <strong>členy skupiny</strong> a zadej <strong>Název skupiny</strong>. Také můžeš vybrat  <strong>obrázek skupiny</strong>.</p>
</li>
<li>
<p>Jakmile do skupiny pošleš <strong>první zprávu</strong>, všichni členové budou vyrozuměni o nové skupině a mohou do ní také psát (dokud nepošleš první zprávu členové skupiny o ní nebudou vědět).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -528,11 +526,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -560,10 +557,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Když nejsi členem skupiny nelze se znovu připojit. Nicméně, není to velká potíž -
požádej běžnou zprávou jiného člena skupiny o znovupřipojení.</li>
</ul>
<p>Když nejsi členem skupiny nelze se znovu připojit. Nicméně, není to velká potíž -
požádej běžnou zprávou jiného člena skupiny o znovupřipojení.</p>
<h3 id="nechci-již-přijímat-zprávy-ze-skupiny">
@@ -574,15 +569,12 @@ požádej běžnou zprávou jiného člena skupiny o znovupřipojení.</li>
</h3>
<ul>
<li>
<p>Buď se odeber ze seznamu členů a nebo vymaž celý skupinový hovor.
K opětovnému připojení v budoucnu požádej nějakého člena skupiny o znovupřidání.</p>
</li>
<li>
<p>Jiná možnost je “Umlčení” skupiny, což znamená nadále přijímat a také posílat zprávy,
ale nebudeš dostávat upozrnění na nově příchozí zprávy.</p>
</li>
<li>Buď se odeber ze seznamu členů a nebo vymaž celý skupinový hovor.
K opětovnému připojení v budoucnu požádej nějakého člena skupiny o znovupřidání.</li>
</ul>
<p>Jiná možnost je “Umlčení” skupiny, což znamená nadále přijímat a také posílat zprávy,
ale nebudeš dostávat upozrnění na nově příchozí zprávy.</p>
<h3 id="cloning-a-group">
@@ -608,6 +600,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -649,7 +656,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -896,7 +903,7 @@ One device is not needed for the other to work.</p>
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -948,22 +955,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="je-v-plánu-vytvořit-webovou-verzi-delta-chatu">
@@ -991,10 +997,10 @@ Všechny softwarové balíčky jsou na <a href="https://get.delta.chat">get.delt
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1007,33 +1013,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1055,7 +1072,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1067,7 +1084,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1076,7 +1093,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1100,6 +1117,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="mám-zájem-o-technické-podrobnosti-kde-najdu-víc">
@@ -1108,9 +1159,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Dobrý začátek je <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</li>
</ul>
<p>Dobrý začátek je <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1349,6 +1398,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1435,12 +1510,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
File diff suppressed because it is too large Load Diff
+178 -105
View File
@@ -15,7 +15,7 @@
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
</ul>
</li>
@@ -26,6 +26,7 @@
<li><a href="#i-have-deleted-myself-by-accident">I have deleted myself by accident.</a></li>
<li><a href="#i-do-not-want-to-receive-the-messages-of-a-group-any-longer">I do not want to receive the messages of a group any longer.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">Im interested in the technical details. Can you tell me more?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
</li>
</ul>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
<h3 id="multiple-accounts">
@@ -261,16 +260,11 @@ or to <strong>Switch Profiles</strong>.</p>
</h3>
<ul>
<li>
<p>You can add a profile picture in your settings. If you write to your contacts
<p>You can add a profile picture in your settings. If you write to your contacts
or add them via QR code, they automatically see it as your profile picture.</p>
</li>
<li>
<p>For privacy reasons, no one sees your profile picture until you write a
<p>For privacy reasons, no one sees your profile picture until you write a
message to them.</p>
</li>
</ul>
<h3 id="signature">
@@ -304,7 +298,8 @@ they will see it when they view your contact details.</p>
</li>
<li>
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
Archived chats remain accessible above the chat list or via search.</p>
They remain accessible above the chat list or via search
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
</li>
<li>
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
@@ -339,7 +334,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -376,22 +371,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -456,19 +447,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<h3 id="delold">
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
</h3>
<ul>
<li>If you want to save storage on your device, you can choose to delete old
messages automatically.</li>
<li>To turn it on, go to “delete old messages from device” in the “Chats &amp; Media”
settings. You can set a timeframe between “after an hour” and “after a year”;
<p>If you want to save storage on your device, you can choose to delete old
messages automatically.</p>
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
You can set a timeframe between “after an hour” and “after a year”;
this way, <em>all</em> messages will be deleted from your device as soon as they are
older than that.</li>
</ul>
older than that.</p>
<h3 id="remove-account">
@@ -516,9 +506,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</li>
<li>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</li>
<li>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</li>
<li>
<p>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</p>
</li>
<li>
<p>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</p>
</li>
<li>
<p>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -529,11 +525,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -561,10 +556,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>As youre no longer a group member, you cannot add yourself again.
However, no problem, just ask any other group member in a normal chat to re-add you.</li>
</ul>
<p>As youre no longer a group member, you cannot add yourself again.
However, no problem, just ask any other group member in a normal chat to re-add you.</p>
<h3 id="i-do-not-want-to-receive-the-messages-of-a-group-any-longer">
@@ -575,15 +568,12 @@ However, no problem, just ask any other group member in a normal chat to re-add
</h3>
<ul>
<li>
<p>Either delete yourself from the member list or delete the whole chat.
If you want to join the group again later on, ask another group member to add you again.</p>
</li>
<li>
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
can still write, but are no longer notified of any new messages.</p>
</li>
<li>Either delete yourself from the member list or delete the whole chat.
If you want to join the group again later on, ask another group member to add you again.</li>
</ul>
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
can still write, but are no longer notified of any new messages.</p>
<h3 id="cloning-a-group">
@@ -609,6 +599,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -650,7 +655,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -897,7 +902,7 @@ One device is not needed for the other to work.</p>
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -949,22 +954,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
@@ -993,10 +997,10 @@ or the AppImage for Linux. You can find them on
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1009,33 +1013,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1057,7 +1072,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1069,7 +1084,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1078,7 +1093,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1102,6 +1117,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
@@ -1110,9 +1159,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</li>
</ul>
<p>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1351,6 +1398,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1437,12 +1510,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
+174 -103
View File
@@ -26,6 +26,7 @@
<li><a href="#me-he-eliminado-por-accidente">Me he eliminado por accidente.</a></li>
<li><a href="#no-quiero-recibir-más-los-mensajes-de-un-grupo">No quiero recibir más los mensajes de un grupo.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">Estoy interesado en los detalles técnicos. ¿Pueden decirme más?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">¿Cómo Delta Chat protege los metadatos en los mensajes?</a></li>
<li><a href="#device-seizure">¿Cómo proteger los metadatos y los contactos cuando se incauta un dispositivo?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">¿Soporta Delta Chat Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -220,15 +224,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>Para mejorar el rendimiento, las imágenes se optimizan y se envían en un tamaño más pequeño de forma predeterminada, pero puedes enviarla como un “archivo” para conservar la original.</p>
</li>
</ul>
<p>Para mejorar el rendimiento, las imágenes se optimizan y se envían en un tamaño más pequeño de forma predeterminada, pero puedes enviarla como un “archivo” para conservar la original.</p>
<h3 id="multiple-accounts">
@@ -259,15 +258,10 @@ o para <strong>Cambiar perfiles</strong>.</p>
</h3>
<ul>
<li>
<p>Puede agregar una foto de perfil en su configuración. Si escribe a sus contactos
<p>Puede agregar una foto de perfil en su configuración. Si escribe a sus contactos
o los agrega a través de un código QR, ellos lo verán automáticamente como su foto de perfil.</p>
</li>
<li>
<p>Por cuestiones de privacidad, nadie verá su foto de perfil hasta que les escriba un mensaje.</p>
</li>
</ul>
<p>Por cuestiones de privacidad, nadie verá su foto de perfil hasta que les escriba un mensaje.</p>
<h3 id="signature">
@@ -300,8 +294,7 @@ they will see it when they view your contact details.</p>
<p><strong>Chats muteados</strong> si no quieres recibir notificaciones de ellos. Chats muteados se mantienen en su lugar e inclusive puedes fijarlos.</p>
</li>
<li>
<p><strong>Archivar chats</strong> si no deseas verlos en tu lista de chats.
Los chats archivados siguen siendo accesibles arriba de la lista de chats o a través de la búsqueda.</p>
<p><strong>Archivar chats</strong> si no deseas verlos en tu lista de chats. Los chats archivados siguen siendo accesibles arriba de la lista de chats o a través de la búsqueda.</p>
</li>
<li>
<p>Cuando un chat archivado recibe un nuevo mensaje, a menos que esté silenciado, <strong>saldrá del archivo</strong> y volverá a aparecer en tu lista de chats.
@@ -374,22 +367,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -459,14 +448,13 @@ the (anyway encrypted) messages may take longer to get deleted from their server
</h3>
<ul>
<li>If you want to save storage on your device, you can choose to delete old
messages automatically.</li>
<li>To turn it on, go to “delete old messages from device” in the “Chats &amp; Media”
settings. You can set a timeframe between “after an hour” and “after a year”;
<p>If you want to save storage on your device, you can choose to delete old
messages automatically.</p>
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
You can set a timeframe between “after an hour” and “after a year”;
this way, <em>all</em> messages will be deleted from your device as soon as they are
older than that.</li>
</ul>
older than that.</p>
<h3 id="remove-account">
@@ -514,9 +502,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Selecciona <strong>Nuevo chat</strong> y luego <strong>Nuevo grupo</strong> del menu en el sector superior derecho o toca en el botón correspondiente en Android/iOS.</li>
<li>En la siguiente pantalla selecciona a los <strong>miembros del grupo</strong> y define un <strong>nombre de grupo</strong>. Tambien puedes seleccionar un <strong>avatar de grupo</strong>.</li>
<li>Tan pronto escribas el <strong>primer mensaje</strong> en el grupo, todos los miembros serán informados sobre el nuevo grupo y podrán responder en él (mientras no escribas un mensaje será invisible para los miembros).</li>
<li>
<p>Selecciona <strong>Nuevo chat</strong> y luego <strong>Nuevo grupo</strong> del menu en el sector superior derecho o toca en el botón correspondiente en Android/iOS.</p>
</li>
<li>
<p>En la siguiente pantalla selecciona a los <strong>miembros del grupo</strong> y define un <strong>nombre de grupo</strong>. Tambien puedes seleccionar un <strong>avatar de grupo</strong>.</p>
</li>
<li>
<p>Tan pronto escribas el <strong>primer mensaje</strong> en el grupo, todos los miembros serán informados sobre el nuevo grupo y podrán responder en él (mientras no escribas un mensaje será invisible para los miembros).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -527,11 +521,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -559,10 +552,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Como ya no eres miembro del grupo, no puedes volver a agregarte.
Sin embargo, no hay problema, solo pídale a cualquier otro miembro del grupo en un chat normal que lo vuelva a agregar.</li>
</ul>
<p>Como ya no eres miembro del grupo, no puedes volver a agregarte.
Sin embargo, no hay problema, solo pídale a cualquier otro miembro del grupo en un chat normal que lo vuelva a agregar.</p>
<h3 id="no-quiero-recibir-más-los-mensajes-de-un-grupo">
@@ -573,15 +564,12 @@ Sin embargo, no hay problema, solo pídale a cualquier otro miembro del grupo en
</h3>
<ul>
<li>
<p>Elimínate de la lista de miembros o elimina todo el chat.
Si desea unirse al grupo nuevamente más tarde, pídale a otro miembro del grupo que lo agregue nuevamente.</p>
</li>
<li>
<p>Como alternativa, también puede “silenciar” a un grupo, lo que significa que recibirá todos los mensajes y
aún puede escribir, pero ya no se le notifican nuevos mensajes.</p>
</li>
<li>Elimínate de la lista de miembros o elimina todo el chat.
Si desea unirse al grupo nuevamente más tarde, pídale a otro miembro del grupo que lo agregue nuevamente.</li>
</ul>
<p>Como alternativa, también puede “silenciar” a un grupo, lo que significa que recibirá todos los mensajes y
aún puede escribir, pero ya no se le notifican nuevos mensajes.</p>
<h3 id="cloning-a-group">
@@ -607,6 +595,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -648,7 +651,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -895,7 +898,7 @@ No es necesario un dispositivo para que el otro funcione.</p>
<p>Vuelve a verificar que ambos dispositivos estén en la <strong>misma Wi-Fi o red</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -947,22 +950,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="tienen-planeado-crear-un-cliente-web-de-delta-chat">
@@ -991,10 +993,10 @@ o el AppImage para Linux. Puedes encontrarlos en
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1007,33 +1009,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1055,7 +1068,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1067,7 +1080,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1076,7 +1089,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1100,6 +1113,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">
@@ -1108,9 +1155,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Visita la página <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Estándares usados en Delta Chat</a>.</li>
</ul>
<p>Visita la página <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Estándares usados en Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1346,6 +1391,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1428,12 +1499,12 @@ in collaboration with other OpenPGP implementers.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
+169 -95
View File
@@ -26,6 +26,7 @@
<li><a href="#jai-quitté-un-groupe-par-accident">Jai quitté un groupe par accident.</a></li>
<li><a href="#je-ne-souhaite-plus-recevoir-les-messages-dun-groupe">Je ne souhaite plus recevoir les messages dun groupe.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#les-détails-techniques-mintéressent-pouvez-vous-men-dire-plus-">Les détails techniques mintéressent. Pouvez-vous men dire plus ?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Oui. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Oui. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>Pour améliorer les performances, les images sont redimensionnées et envoyées en taille réduite par défaut ; mais vous pouvez les envoyer en tant que “fichier” pour en conserver la taille originale.</p>
</li>
</ul>
<p>Pour améliorer les performances, les images sont redimensionnées et envoyées en taille réduite par défaut ; mais vous pouvez les envoyer en tant que “fichier” pour en conserver la taille originale.</p>
<h3 id="multiple-accounts">
@@ -263,9 +262,7 @@ or to <strong>Switch Profiles</strong>.</p>
<p>Dans les paramètres vous pouvez ajouter une photo de profil. Si vous écrivez à vos contacts ou que vous les ajoutez via le QR code, ils la verront automatiquement comme votre photo de profil.</p>
<ul>
<li>Pour des raisons de confidentialité, personne ne peut voir votre photo de profil sans que vous ayez dabord entamé une discussion.</li>
</ul>
<p>Pour des raisons de confidentialité, personne ne peut voir votre photo de profil sans que vous ayez dabord entamé une discussion.</p>
<h3 id="signature">
@@ -298,8 +295,7 @@ they will see it when they view your contact details.</p>
<p>Utilisez la <strong>sourdine</strong> pour les discussions dont vous ne voulez pas recevoir les notifications. Les discussions en sourdine figurent toujours dans votre liste et peuvent aussi être les épinglées.</p>
</li>
<li>
<p><strong>Archivez les discussions</strong> si vous ne voulez plus les voir apparaître dans votre liste de discussions.
Les discussions archivées restent accessibles au-dessus de la liste de discussions ou via la recherche.</p>
<p><strong>Archivez les discussions</strong> si vous ne voulez plus les voir apparaître dans votre liste de discussions. Les discussions archivées restent accessibles au-dessus de la liste de discussions ou via la recherche.</p>
</li>
<li>
<p>Lorsquun nouveau message est envoyé sur une discussion que vous avez archivée, et que vous navez pas mise en sourdine, la discussion <strong>sort des archives</strong> et reprend sa place dans votre liste de discussions.
@@ -335,7 +331,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -372,22 +368,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -457,10 +449,9 @@ the (anyway encrypted) messages may take longer to get deleted from their server
</h3>
<ul>
<li>Vous pouvez choisir de supprimer automatiquement les anciens messages pour libérer de lespace de stockage sur votre appareil.</li>
<li>Pour activer cette option, ouvrez les paramètres des “Discussions et fichiers multimédias” et cliquez sur “Supprimer les anciens messages de lappareil”. Vous pouvez définir le délai après lequel <em>tous</em> les messages seront supprimés de votre appareil, parmi plusieurs choix allant de “Immédiatement” à “Après 1 année”.</li>
</ul>
<p>Vous pouvez choisir de supprimer automatiquement les anciens messages pour libérer de lespace de stockage sur votre appareil.</p>
<p>Pour activer cette option, ouvrez les paramètres des “Discussions et fichiers multimédias” et cliquez sur “Supprimer les anciens messages de lappareil”. Vous pouvez définir le délai après lequel <em>tous</em> les messages seront supprimés de votre appareil, parmi plusieurs choix allant de “Immédiatement” à “Après 1 année”.</p>
<h3 id="remove-account">
@@ -508,9 +499,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Sélectionnez <strong>Nouvelle discussion</strong> puis <strong>Nouveau groupe</strong> dans le menu à trois points situé en haut à droite de la fenêtre ou son équivalent sous Android et iOS.</li>
<li>Sur l’écran suivant, sélectionnez <strong>Ajouter des participants</strong> et choisissez un <strong>Nom du groupe</strong>. Vous pouvez aussi choisir une <strong>image de groupe</strong>.</li>
<li>Lorsque vous enverrez le <strong>premier message</strong> dans le groupe, tous les membres en seront informés et pourront répondre. Le groupe est invisible aux autres membres si vous n’écrivez pas de premier message.</li>
<li>
<p>Sélectionnez <strong>Nouvelle discussion</strong> puis <strong>Nouveau groupe</strong> dans le menu à trois points situé en haut à droite de la fenêtre ou son équivalent sous Android et iOS.</p>
</li>
<li>
<p>Sur l’écran suivant, sélectionnez <strong>Ajouter des participants</strong> et choisissez un <strong>Nom du groupe</strong>. Vous pouvez aussi choisir une <strong>image de groupe</strong>.</p>
</li>
<li>
<p>Lorsque vous enverrez le <strong>premier message</strong> dans le groupe, tous les membres en seront informés et pourront répondre. Le groupe est invisible aux autres membres si vous n’écrivez pas de premier message.</p>
</li>
</ul>
<h3 id="addmembers">
@@ -521,11 +518,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -553,10 +549,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Comme vous n’êtes plus membre du groupe, vous ne pouvez pas vous y ajouter vous-même.
Contactez nimporte quel autre membre de ce groupe dans une discussion directe pour lui demander de vous y ré-inviter.</li>
</ul>
<p>Comme vous n’êtes plus membre du groupe, vous ne pouvez pas vous y ajouter vous-même.
Contactez nimporte quel autre membre de ce groupe dans une discussion directe pour lui demander de vous y ré-inviter.</p>
<h3 id="je-ne-souhaite-plus-recevoir-les-messages-dun-groupe">
@@ -567,14 +561,11 @@ Contactez nimporte quel autre membre de ce groupe dans une discussion directe
</h3>
<ul>
<li>
<p>Supprimez-vous de la liste des membres ou supprimez la discussion entière.
Si souhaitez rejoindre le groupe plus tard, demandez à un autre membre du groupe de vous ré-inviter.</p>
</li>
<li>
<p>Vous pouvez également mettre un groupe en “Sourdine” : vous recevrez tous les messages et pourrez toujours écrire, mais naurez plus les notifications des nouveaux messages.</p>
</li>
<li>Supprimez-vous de la liste des membres ou supprimez la discussion entière.
Si souhaitez rejoindre le groupe plus tard, demandez à un autre membre du groupe de vous ré-inviter.</li>
</ul>
<p>Vous pouvez également mettre un groupe en “Sourdine” : vous recevrez tous les messages et pourrez toujours écrire, mais naurez plus les notifications des nouveaux messages.</p>
<h3 id="cloning-a-group">
@@ -600,6 +591,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -641,7 +647,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -886,7 +892,7 @@ Lun na pas besoin de lautre pour pouvoir fonctionner.</p>
<p>Vérifier à nouveau que les deux appareils sont sur <strong>le même réseau ou le même Wi-Fi</strong>.</p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -937,22 +943,21 @@ Vous pouvez utiliser plusieurs comptes par appareil : <a href="#multiple-account
<p>Recourez à cette méthode uniquement si les instructions ci-dessus pour “Ajouter un deuxième appareil” ont échoué.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="le-lancement-dun-client-web-delta-chat-est-il-prévu-">
@@ -978,10 +983,10 @@ end-to-end encrypted messages with your communication partners.</li>
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -994,33 +999,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1042,7 +1058,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1054,7 +1070,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1063,7 +1079,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1087,6 +1103,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="les-détails-techniques-mintéressent-pouvez-vous-men-dire-plus-">
@@ -1095,9 +1145,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Consultez les <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">standards utilisés dans Delta Chat</a>.</li>
</ul>
<p>Consultez les <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">standards utilisés dans Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1336,6 +1384,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1422,12 +1496,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
+179 -106
View File
@@ -15,7 +15,7 @@
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
</ul>
</li>
@@ -26,6 +26,7 @@
<li><a href="#i-have-deleted-myself-by-accident">I have deleted myself by accident.</a></li>
<li><a href="#i-do-not-want-to-receive-the-messages-of-a-group-any-longer">I do not want to receive the messages of a group any longer.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">Im interested in the technical details. Can you tell me more?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
</li>
</ul>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
<h3 id="multiple-accounts">
@@ -261,16 +260,11 @@ or to <strong>Switch Profiles</strong>.</p>
</h3>
<ul>
<li>
<p>Anda dapat menambahkan gambar profil di pengaturan Anda. Jika Anda menulis ke kontak Anda
atau menambahkannya melalui kode QR, mereka secara otomatis melihatnya sebagai gambar profil Anda.</p>
</li>
<li>
<p>Untuk alasan kerahasiaan, tidak ada satupun yang dapat melihat Foto Profil anda hingga anda menulis
<p>Anda dapat menambahkan gambar profil di pengaturan Anda. Jika Anda menulis ke kontak Anda
atau menambahkannya melalui kode QR, mereka secara otomatis melihatnya sebagai gambar profil Anda.</p>
<p>Untuk alasan kerahasiaan, tidak ada satupun yang dapat melihat Foto Profil anda hingga anda menulis
sebuah pesan kepada mereka.</p>
</li>
</ul>
<h3 id="signature">
@@ -304,7 +298,8 @@ they will see it when they view your contact details.</p>
</li>
<li>
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
Archived chats remain accessible above the chat list or via search.</p>
They remain accessible above the chat list or via search
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
</li>
<li>
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
@@ -339,7 +334,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -376,22 +371,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -456,19 +447,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<h3 id="delold">
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
</h3>
<ul>
<li>If you want to save storage on your device, you can choose to delete old
messages automatically.</li>
<li>To turn it on, go to “delete old messages from device” in the “Chats &amp; Media”
settings. You can set a timeframe between “after an hour” and “after a year”;
<p>If you want to save storage on your device, you can choose to delete old
messages automatically.</p>
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
You can set a timeframe between “after an hour” and “after a year”;
this way, <em>all</em> messages will be deleted from your device as soon as they are
older than that.</li>
</ul>
older than that.</p>
<h3 id="remove-account">
@@ -516,9 +506,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</li>
<li>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</li>
<li>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</li>
<li>
<p>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</p>
</li>
<li>
<p>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</p>
</li>
<li>
<p>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -529,11 +525,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -561,10 +556,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>As youre no longer a group member, you cannot add yourself again.
However, no problem, just ask any other group member in a normal chat to re-add you.</li>
</ul>
<p>As youre no longer a group member, you cannot add yourself again.
However, no problem, just ask any other group member in a normal chat to re-add you.</p>
<h3 id="i-do-not-want-to-receive-the-messages-of-a-group-any-longer">
@@ -575,15 +568,12 @@ However, no problem, just ask any other group member in a normal chat to re-add
</h3>
<ul>
<li>
<p>Either delete yourself from the member list or delete the whole chat.
If you want to join the group again later on, ask another group member to add you again.</p>
</li>
<li>
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
can still write, but are no longer notified of any new messages.</p>
</li>
<li>Either delete yourself from the member list or delete the whole chat.
If you want to join the group again later on, ask another group member to add you again.</li>
</ul>
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
can still write, but are no longer notified of any new messages.</p>
<h3 id="cloning-a-group">
@@ -609,6 +599,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -650,7 +655,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -897,7 +902,7 @@ One device is not needed for the other to work.</p>
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -949,22 +954,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
@@ -993,10 +997,10 @@ or the AppImage for Linux. You can find them on
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1009,33 +1013,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1057,7 +1072,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1069,7 +1084,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1078,7 +1093,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1102,6 +1117,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
@@ -1110,9 +1159,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</li>
</ul>
<p>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1351,6 +1398,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1437,12 +1510,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
File diff suppressed because it is too large Load Diff
+174 -105
View File
@@ -26,6 +26,7 @@
<li><a href="#ik-heb-mezelf-per-ongeluk-verwijderd">Ik heb mezelf per ongeluk verwijderd</a></li>
<li><a href="#ik-wil-geen-groepsberichten-meer-ontvangen">Ik wil geen groepsberichten meer ontvangen</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">Ik wil graag meer weten over de gebruikte technieken. Waar kan ik meer informatie vinden?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>Om de prestaties te verhogen, worden afbeeldingen standaard geoptimaliseerd en verkleind verstuurd, maar je kunt ze als een bestand verzenden om het origineel te sturen.</p>
</li>
</ul>
<p>Om de prestaties te verhogen, worden afbeeldingen standaard geoptimaliseerd en verkleind verstuurd, maar je kunt ze als een bestand verzenden om het origineel te sturen.</p>
<h3 id="multiple-accounts">
@@ -261,16 +260,11 @@ or to <strong>Switch Profiles</strong>.</p>
</h3>
<ul>
<li>
<p>In de instellingen kun je een profielfoto toevoegen. Als je een bericht stuurt aan
je contactpersonen of ze toevoegt middels hun QR-code, dan krijgen ze je profielfoto te zien.</p>
</li>
<li>
<p>Omwille van je privacy, krijgen anderen je profielfoto pas te zien
als je ze een bericht stuurt.</p>
</li>
</ul>
<p>In de instellingen kun je een profielfoto toevoegen. Als je een bericht stuurt aan
je contactpersonen of ze toevoegt middels hun QR-code, dan krijgen ze je profielfoto te zien.</p>
<p>Omwille van je privacy, krijgen anderen je profielfoto pas te zien
als je ze een bericht stuurt.</p>
<h3 id="signature">
@@ -303,8 +297,7 @@ they will see it when they view your contact details.</p>
<p>Stel gesprekken in op <strong>Negeren</strong> als je geen meldingen meer wilt ontvangen. Wel blijven genegeerde gesprekken op de lijst staan en kun je ze te allen tijde vastmaken.</p>
</li>
<li>
<p><strong>Archiveer gesprekken</strong> als je ze niet meer op de gesprekslijst wilt zien.
Gearchiveerde gesprekken zijn te allen tijde te bekijken boven de lijst of via een zoekopdracht.</p>
<p><strong>Archiveer gesprekken</strong> als je ze niet meer op de gesprekslijst wilt zien. Gearchiveerde gesprekken zijn te allen tijde te bekijken boven de lijst of via een zoekopdracht.</p>
</li>
<li>
<p>Als er een nieuw bericht in een gearchiveerd gesprek wordt ontvangen, dan wordt het gesprek in kwestie <strong>ge-dearchiveerd</strong> en dus weer op de gesprekslijst geplaatst.
@@ -340,7 +333,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -377,22 +370,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -462,12 +451,9 @@ the (anyway encrypted) messages may take longer to get deleted from their server
</h3>
<ul>
<li>Als je ruimte wilt besparen op je apparaat, dan kun je er voor kiezen om oude
berichten automatisch te verwijderen.</li>
<li>Inschakelen kan via de sectie Gesprekken en media in de instellingen. Je kunt een periode tussen
na één uur en na één jaar kiezen. *Alle berichten die ouder zijn, worden verwijderd.</li>
</ul>
<p>Als je ruimte wilt besparen op je apparaat, dan kun je er voor kiezen om oude berichten automatisch te verwijderen.</p>
<p>Inschakelen kan via de sectie Gesprekken en media in de instellingen. Je kunt een periode tussen na één uur en na één jaar kiezen. <em>Alle</em> berichten die ouder zijn, worden verwijderd.</p>
<h3 id="remove-account">
@@ -515,9 +501,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Open het menu met de drie puntjes rechtsboven in het gespreksoverzicht, kies <strong>Nieuw gesprek</strong> en daarna <strong>Nieuwe groep</strong>.</li>
<li>Kies dan de <strong>groepsleden</strong> en druk op het vinkje rechtsboven. Daarna kun je een <strong>groepsnaam</strong> opgeven.</li>
<li>Zodra je het <strong>eerste groepsbericht</strong> hebt verstuurd, worden alle deelnemers op de hoogte gebracht en kunnen zij antwoorden versturen (de groep blijft onzichtbaar voor anderen zolang jij geen bericht verstuurt).</li>
<li>
<p>Open het menu met de drie puntjes rechtsboven in het gespreksoverzicht, kies <strong>Nieuw gesprek</strong> en daarna <strong>Nieuwe groep</strong>.</p>
</li>
<li>
<p>Kies dan de <strong>groepsleden</strong> en druk op het vinkje rechtsboven. Daarna kun je een <strong>groepsnaam</strong> opgeven.</p>
</li>
<li>
<p>Zodra je het <strong>eerste groepsbericht</strong> hebt verstuurd, worden alle deelnemers op de hoogte gebracht en kunnen zij antwoorden versturen (de groep blijft onzichtbaar voor anderen zolang jij geen bericht verstuurt).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -528,11 +520,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -560,10 +551,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Je neemt geen deel meer aan de groep en kunt jezelf dus niet meer toevoegen.
Vraag iemand via een één-op-ééngesprek of hij/zij je weer wilt toevoegen.</li>
</ul>
<p>Je neemt geen deel meer aan de groep en kunt jezelf dus niet meer toevoegen.
Vraag iemand via een één-op-ééngesprek of hij/zij je weer wilt toevoegen.</p>
<h3 id="ik-wil-geen-groepsberichten-meer-ontvangen">
@@ -574,15 +563,12 @@ Vraag iemand via een één-op-ééngesprek of hij/zij je weer wilt toevoegen.</l
</h3>
<ul>
<li>
<p>Verwijder jezelf van de groepslijst of verwijder het hele groepsgesprek.
Als je later weer wilt deelnemen, vraag dan iemand anders of hij/zij je weer wilt toevoegen.</p>
</li>
<li>
<p>Wat ook kan doen is groepsmeldingen uitschakelen. Zo blijf je in de groep, maar ontvang je
geen meldingen meer als er nieuwe berichten zijn.</p>
</li>
<li>Verwijder jezelf van de groepslijst of verwijder het hele groepsgesprek.
Als je later weer wilt deelnemen, vraag dan iemand anders of hij/zij je weer wilt toevoegen.</li>
</ul>
<p>Wat ook kan doen is groepsmeldingen uitschakelen. Zo blijf je in de groep, maar ontvang je
geen meldingen meer als er nieuwe berichten zijn.</p>
<h3 id="cloning-a-group">
@@ -608,6 +594,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -649,7 +650,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -895,7 +896,7 @@ op beide apparaten</strong>. Hierdoor hoef je niet het ene apparaat bij de hand
<p>Controleer of beide apparaten verbonden zijn met <strong>hetzelfde (wifi)netwerk</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -947,22 +948,21 @@ volg dan onderstaande stappen omtrent handmatige overzetting</p>
<p>Deze methode is vooral bedoeld voor situaties waarin Tweede apparaat toevoegen niet lukt.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="bestaan-er-plannen-om-een-delta-chat-webclient-te-maken">
@@ -991,10 +991,10 @@ of de AppImage van de Linux-client. Deze kun je downloaden op
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1007,33 +1007,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1055,7 +1066,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1067,7 +1078,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1076,7 +1087,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1100,6 +1111,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">
@@ -1108,9 +1153,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Bekijk de pagina <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Door Delta Chat gebruikte standaarden</a>.</li>
</ul>
<p>Bekijk de pagina <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Door Delta Chat gebruikte standaarden</a>.</p>
<h2 id="e2ee">
@@ -1349,6 +1392,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1435,12 +1504,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
+167 -89
View File
@@ -26,6 +26,7 @@
<li><a href="#usunąłem-się-przez-przypadek">Usunąłem się przez przypadek.</a></li>
<li><a href="#nie-chcę-już-otrzymywać-wiadomości-od-grupy">Nie chcę już otrzymywać wiadomości od grupy.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#zaawansowane">Zaawansowane</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#chcę-zarządzać-własnym-serwerem-dla-delta-chat-co-polecacie">Chcę zarządzać własnym serwerem dla Delta Chat. Co polecacie?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#interesują-mnie-szczegóły-techniczne-możesz-powiedzieć-mi-coś-więcej">Interesują mnie szczegóły techniczne. Możesz powiedzieć mi coś więcej?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Czy wiadomości oznaczone ikoną poczty są widoczne w internecie?</a></li>
<li><a href="#message-metadata">W jaki sposób Delta Chat chroni metadane w wiadomościach?</a></li>
<li><a href="#device-seizure">Jak chronić metadane i kontakty w przypadku przejęcia urządzenia?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Czy Delta Chat obsługuje funkcję „Sealed Sender”?</a></li>
<li><a href="#pfs">Czy Delta Chat obsługuje funkcję Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Czy Delta Chat obsługuje kryptografię postkwantową?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -220,15 +224,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Tak. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Tak. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>Ze względu na wydajność obrazy są domyślnie optymalizowane i wysyłane w mniejszym rozmiarze, ale można je wysłać jako „plik”, aby zachować oryginał.</p>
</li>
</ul>
<p>Ze względu na wydajność obrazy są domyślnie optymalizowane i wysyłane w mniejszym rozmiarze, ale można je wysłać jako „plik”, aby zachować oryginał.</p>
<h3 id="multiple-accounts">
@@ -258,14 +257,9 @@ and uses the server only to relay messages.</p>
</h3>
<ul>
<li>
<p>Możesz dodać zdjęcie profilowe w swoich ustawieniach. Jeśli napiszesz do swoich kontaktów lub dodasz je za pomocą kodu QR, automatycznie zobaczą je jako Twoje zdjęcie profilowe.</p>
</li>
<li>
<p>Ze względów prywatności nikt nie widzi Twojego zdjęcia profilowego, dopóki nie napiszesz do niego wiadomości.</p>
</li>
</ul>
<p>Możesz dodać zdjęcie profilowe w swoich ustawieniach. Jeśli napiszesz do swoich kontaktów lub dodasz je za pomocą kodu QR, automatycznie zobaczą je jako Twoje zdjęcie profilowe.</p>
<p>Ze względów prywatności nikt nie widzi Twojego zdjęcia profilowego, dopóki nie napiszesz do niego wiadomości.</p>
<h3 id="signature">
@@ -365,22 +359,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -437,10 +427,9 @@ the (anyway encrypted) messages may take longer to get deleted from their server
</h3>
<ul>
<li>Jeśli chcesz zaoszczędzić miejsce na urządzeniu, możesz wybrać opcję automatycznego usuwania starych wiadomości.</li>
<li>Aby ją włączyć, przejdź do „Usuń wiadomości z urządzenia” w ustawieniach w sekcji „Czaty i media”. Możesz ustawić przedział czasowy pomiędzy „po 1 godzinie” a „po 1 roku”; w ten sposób <em>wszystkie</em> wiadomości zostaną usunięte z urządzenia, gdy tylko staną się starsze.</li>
</ul>
<p>Jeśli chcesz zaoszczędzić miejsce na urządzeniu, możesz wybrać opcję automatycznego usuwania starych wiadomości.</p>
<p>Aby ją włączyć, przejdź do „Usuń wiadomości z urządzenia” w ustawieniach w sekcji „Czaty i media”. Możesz ustawić przedział czasowy pomiędzy „po 1 godzinie” a „po 1 roku”; w ten sposób <em>wszystkie</em> wiadomości zostaną usunięte z urządzenia, gdy tylko staną się starsze.</p>
<h3 id="remove-account">
@@ -488,9 +477,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Wybierz <strong>Nowy czat</strong>, a następnie <strong>Nowa grupa</strong> z menu w prawym górnym rogu lub naciśnij odpowiedni przycisk na Androidzie / iOS.</li>
<li>Na następnym ekranie wybierz <strong>członków grupy</strong> i zdefiniuj <strong>nazwę grupy</strong>. Możesz też wybrać awatar <strong>grupy</strong>.</li>
<li>Zaraz po napisaniu pierwszej wiadomości w grupie wszyscy członkowie zostaną poinformowani o nowej grupie i mogą odpowiedzieć w grupie (jeżeli nie napiszesz wiadomości w grupie, grupa jest niewidoczna dla członków).</li>
<li>
<p>Wybierz <strong>Nowy czat</strong>, a następnie <strong>Nowa grupa</strong> z menu w prawym górnym rogu lub naciśnij odpowiedni przycisk na Androidzie / iOS.</p>
</li>
<li>
<p>Na następnym ekranie wybierz <strong>członków grupy</strong> i zdefiniuj <strong>nazwę grupy</strong>. Możesz też wybrać awatar <strong>grupy</strong>.</p>
</li>
<li>
<p>Zaraz po napisaniu pierwszej wiadomości w grupie wszyscy członkowie zostaną poinformowani o nowej grupie i mogą odpowiedzieć w grupie (jeżeli nie napiszesz wiadomości w grupie, grupa jest niewidoczna dla członków).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -501,11 +496,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -533,10 +527,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Ponieważ nie jesteś członkiem grupy, nie możesz dodać siebie ponownie.
Jednak nie ma problemu, po prostu poproś dowolnego członka grupy na normalnym czacie, aby dodał cię ponownie.</li>
</ul>
<p>Ponieważ nie jesteś członkiem grupy, nie możesz dodać siebie ponownie.
Jednak nie ma problemu, po prostu poproś dowolnego członka grupy na normalnym czacie, aby dodał cię ponownie.</p>
<h3 id="nie-chcę-już-otrzymywać-wiadomości-od-grupy">
@@ -547,15 +539,12 @@ Jednak nie ma problemu, po prostu poproś dowolnego członka grupy na normalnym
</h3>
<ul>
<li>
<p>Usuń siebie z listy członków lub usuń cy czat.
Jeśli później będziesz chciał ponownie dołączyć do grupy, poproś innego członka grupy, aby dodał cię do grupy.</p>
</li>
<li>
<p>Alternatywnie możesz też „Wyłączyć powiadomienia” dla grupy dzięki temu otrzymasz wszystkie wiadomości i
nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych nowych wiadomościach.</p>
</li>
<li>Usuń siebie z listy członków lub usuń cały czat.
Jeśli później będziesz chciał ponownie dołączyć do grupy, poproś innego członka grupy, aby dodał cię do grupy.</li>
</ul>
<p>Alternatywnie możesz też „Wyłączyć powiadomienia” dla grupy dzięki temu otrzymasz wszystkie wiadomości i
nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych nowych wiadomościach.</p>
<h3 id="cloning-a-group">
@@ -581,6 +570,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -622,7 +626,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -833,7 +837,7 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Sprawdź dokładnie, czy oba urządzenia są w tym <strong>samym Wi-Fi lub tej samej sieci</strong></p>
</li>
<li>
<p>Na <strong>Windowsie</strong>, przejdź do <strong>Panel sterowania / Sieć i internet</strong> i upewnij się, że <strong>Sieć prywatna</strong> jest wybrana jako “Typ profilu sieci”
<p>Na <strong>Windowsie</strong>, przejdź do Panel sterowania / Sieć i internet i upewnij się, że <strong>Sieć prywatna</strong> jest wybrana jako “Typ profilu sieci”
(po przeniesieniu możesz wrócić do pierwotnej wartości)</p>
</li>
<li>
@@ -877,14 +881,16 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Ta metoda jest zalecana tylko wtedy, gdy opisana powyżej opcja „Dodaj kolejne urządzenie” nie działa.</p>
<ul>
<li>Na starym urządzeniu przejdź do „Ustawienia » Czaty i media » Eksport kopii zapasowej”. Wprowadź swój PIN odblokowania ekranu, wzór lub hasło. Następnie możesz nacisnąć „Utwórz kopię”. Spowoduje to zapisanie pliku kopii zapasowej na urządzeniu. Teraz musisz jakoś przenieść go na inne urządzenie.</li>
<li>Na nowym urządzeniu, na ekranie logowania, zamiast logować się na swoje konto e-mail, wybierz „Przywróć z kopii zapasowej”. Po zaimportowaniu Twoje rozmowy, klucze szyfrujące i multimedia powinny zostać skopiowane na nowe urządzenie.
<ul>
<li><strong>Jeśli korzystasz z iOS</strong> i napotykasz trudności, może <a href="https://support.delta.chat/t/import-backup-to-ios/1628">ten poradnik</a> Ci pomoże.</li>
</ul>
<li>
<p>Na starym urządzeniu przejdź do <strong>Ustawienia → Czaty i media → Eksport kopii zapasowej</strong>. Wprowadź swój PIN odblokowania ekranu, wzór lub hasło. Następnie możesz nacisnąć „Utwórz kopię”. Spowoduje to zapisanie pliku kopii zapasowej na urządzeniu. Teraz musisz jakoś przenieść go na inne urządzenie.</p>
</li>
<li>
<p>Na nowym urządzeniu, na ekranie logowania, zamiast logować się na swoje konto e-mail, wybierz <strong>Przywróć z kopii zapasowej</strong>. Po zaimportowaniu Twoje rozmowy, klucze szyfrujące i multimedia powinny zostać skopiowane na nowe urządzenie.
Jeśli korzystasz z iOS i napotykasz trudności, może <a href="https://support.delta.chat/t/import-backup-to-ios/1628">ten poradnik</a> Ci pomoże.</p>
</li>
<li>Jesteś teraz zsynchronizowany i możesz używać obu urządzeń do wysyłania i odbierania wiadomości zaszyfrowanych end-to-end w komunikacji ze swoimi partnerami.</li>
</ul>
<p>Jesteś teraz zsynchronizowany i możesz używać obu urządzeń do wysyłania i odbierania wiadomości zaszyfrowanych end-to-end w komunikacji ze swoimi partnerami.</p>
<h3 id="czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">
@@ -908,10 +914,10 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -924,33 +930,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -972,7 +989,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -984,7 +1001,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -993,7 +1010,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1017,6 +1034,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="interesują-mnie-szczegóły-techniczne-możesz-powiedzieć-mi-coś-więcej">
@@ -1025,9 +1076,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Zobacz <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standardy używane w Delta Chat</a>.</li>
</ul>
<p>Zobacz <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standardy używane w Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1214,6 +1263,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1278,9 +1353,12 @@ but an implementation has not been agreed as a priority yet.</p>
<p>Nie.</p>
<p>Delta Chat generuje bezpieczne klucze OpenPGP zgodnie ze specyfikacją Autocrypt 1.1. Możesz wyeksportować swój prywatny klucz, ale nie możesz zaimportować dodatkowych kluczy prywatnych.</p>
<p>Generalnie nie zalecamy ani nie oferujemy użytkownikom wykonywania ręcznego zarządzania kluczami. Chcemy się upewnić, że audyty bezpieczeństwa mogą skupić się na kilku sprawdzonych algorytmach kryptograficznych, a nie na pełnym zakresie możliwych algorytmów dozwolonych w OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
+176 -103
View File
@@ -15,7 +15,7 @@
<li><a href="#o-que-significam-os-carrapatos-mostrados-ao-lado-das-mensagens-de-saída">O que significam os carrapatos mostrados ao lado das mensagens de saída?</a></li>
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
</ul>
</li>
@@ -26,6 +26,7 @@
<li><a href="#deletei-minha-própria-conta-por-acidente">Deletei minha própria conta por acidente.</a></li>
<li><a href="#não-quero-mais-receber-as-mensagens-de-um-grupo">Não quero mais receber as mensagens de um grupo.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#estou-interessado-nos-detalhes-técnicos-pode-me-dizer-mais">Estou interessado nos detalhes técnicos. Pode me dizer mais?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Sim. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Sim. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
</li>
</ul>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
<h3 id="multiple-accounts">
@@ -261,14 +260,9 @@ or to <strong>Switch Profiles</strong>.</p>
</h3>
<ul>
<li>
<p>Você pode adicionar uma imagem de perfil nas suas configurações. Se você escrever aos seus contatos ou adicioná-los via código QR, eles automaticamente verão a imagem do seu perfil.</p>
</li>
<li>
<p>Por motivos de privacidade, ninguém pode ver a imagem do seu ṕerfil até que você escreva para as pessoas.</p>
</li>
</ul>
<p>Você pode adicionar uma imagem de perfil nas suas configurações. Se você escrever aos seus contatos ou adicioná-los via código QR, eles automaticamente verão a imagem do seu perfil.</p>
<p>Por motivos de privacidade, ninguém pode ver a imagem do seu ṕerfil até que você escreva para as pessoas.</p>
<h3 id="signature">
@@ -302,7 +296,8 @@ they will see it when they view your contact details.</p>
</li>
<li>
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
Archived chats remain accessible above the chat list or via search.</p>
They remain accessible above the chat list or via search
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
</li>
<li>
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
@@ -337,7 +332,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -374,22 +369,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -454,19 +445,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<h3 id="delold">
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
</h3>
<ul>
<li>If you want to save storage on your device, you can choose to delete old
messages automatically.</li>
<li>To turn it on, go to “delete old messages from device” in the “Chats &amp; Media”
settings. You can set a timeframe between “after an hour” and “after a year”;
<p>If you want to save storage on your device, you can choose to delete old
messages automatically.</p>
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
You can set a timeframe between “after an hour” and “after a year”;
this way, <em>all</em> messages will be deleted from your device as soon as they are
older than that.</li>
</ul>
older than that.</p>
<h3 id="remove-account">
@@ -514,9 +504,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Selecione <strong>Nova Conversa</strong> e em seguida <strong>Novo Grupo</strong> no menu que fica na parte de cima da tela, no canto direito, ou clique no botão correspondente no ANdroid/iOS.</li>
<li>Na tela seguinte, selecione <strong>os membros do grupo</strong> e defina o <strong>nome do grupo</strong>. Você também pode selecionar o <strong>avatar do grupo</strong> (uma imagem).</li>
<li>Logo após você escrever a <strong>primeira mensagem</strong>, todas as pessoas do grupo serão informadas sobre o novo grupo e poderão responder no grupo (a não que você escreva uma mensagem ali, o grupo estará invisível para os membros).</li>
<li>
<p>Selecione <strong>Nova Conversa</strong> e em seguida <strong>Novo Grupo</strong> no menu que fica na parte de cima da tela, no canto direito, ou clique no botão correspondente no ANdroid/iOS.</p>
</li>
<li>
<p>Na tela seguinte, selecione <strong>os membros do grupo</strong> e defina o <strong>nome do grupo</strong>. Você também pode selecionar o <strong>avatar do grupo</strong> (uma imagem).</p>
</li>
<li>
<p>Logo após você escrever a <strong>primeira mensagem</strong>, todas as pessoas do grupo serão informadas sobre o novo grupo e poderão responder no grupo (a não que você escreva uma mensagem ali, o grupo estará invisível para os membros).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -527,11 +523,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -559,9 +554,7 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Já que você não é mais um membro do grupo, não tem como se adicionar novamente. Entretanto, não tem problema, é só pedir para outra pessoa do grupo, através de um chat normal, adicionar você.</li>
</ul>
<p>Já que você não é mais um membro do grupo, não tem como se adicionar novamente. Entretanto, não tem problema, é só pedir para outra pessoa do grupo, através de um chat normal, adicionar você.</p>
<h3 id="não-quero-mais-receber-as-mensagens-de-um-grupo">
@@ -572,14 +565,11 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>
<p>Ou você se exclui do grupo ou apaga a conversa inteira do grupo.
Se você quiser entrar mais tarde no grupo novamente, peça a outra pessoa do grupo para adicioná-la novamente.</p>
</li>
<li>
<p>Uma alternativa é “silenciar” um grupo. Fazendo isso, você receberá todas as mensagens e ainda poderá escrever, mas não será receberá mais notificações d enovas mensagens.</p>
</li>
<li>Ou você se exclui do grupo ou apaga a conversa inteira do grupo.
Se você quiser entrar mais tarde no grupo novamente, peça a outra pessoa do grupo para adicioná-la novamente.</li>
</ul>
<p>Uma alternativa é “silenciar” um grupo. Fazendo isso, você receberá todas as mensagens e ainda poderá escrever, mas não será receberá mais notificações d enovas mensagens.</p>
<h3 id="cloning-a-group">
@@ -605,6 +595,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -646,7 +651,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -893,7 +898,7 @@ One device is not needed for the other to work.</p>
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -945,22 +950,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="existe-algum-plano-para-a-introdução-de-um-cliente-web-para-delta-chat">
@@ -989,10 +993,10 @@ ou o AppImage para Linux. Você pode encontrá-los em
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1005,33 +1009,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1053,7 +1068,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1065,7 +1080,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1074,7 +1089,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1098,6 +1113,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="estou-interessado-nos-detalhes-técnicos-pode-me-dizer-mais">
@@ -1106,9 +1155,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Veja <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">As normas usadas no Delta Chat</a>.</li>
</ul>
<p>Veja <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">As normas usadas no Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1347,6 +1394,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1433,12 +1506,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
File diff suppressed because it is too large Load Diff
+178 -105
View File
@@ -15,7 +15,7 @@
<li><a href="#čo-znamenajú-zaškrtnutia-zobrazené-vedľa-odchádzajúcich-správ">Čo znamenajú zaškrtnutia zobrazené vedľa odchádzajúcich správ?</a></li>
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
</ul>
</li>
@@ -26,6 +26,7 @@
<li><a href="#omylom-som-sa-vymazal">Omylom som sa vymazal.</a></li>
<li><a href="#už-viac-nechcem-dostávať-správy-od-skupiny">Už viac nechcem dostávať správy od skupiny.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">Zaujímajú ma technické detaily. Môžete mi povedať viac?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
</li>
</ul>
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
<h3 id="multiple-accounts">
@@ -261,16 +260,11 @@ or to <strong>Switch Profiles</strong>.</p>
</h3>
<ul>
<li>
<p>V nastaveniach si môžete pridať profilový obrázok. Ak napíšete svojim kontaktom
<p>V nastaveniach si môžete pridať profilový obrázok. Ak napíšete svojim kontaktom
alebo si ich pridáte pomocou QR kódu, automaticky to vidia ako váš profilový obrázok.</p>
</li>
<li>
<p>Z dôvodu ochrany osobných údajov nikto nevidí váš profilový obrázok, kým im nenapíšete
<p>Z dôvodu ochrany osobných údajov nikto nevidí váš profilový obrázok, kým im nenapíšete
správu.</p>
</li>
</ul>
<h3 id="signature">
@@ -304,7 +298,8 @@ they will see it when they view your contact details.</p>
</li>
<li>
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
Archived chats remain accessible above the chat list or via search.</p>
They remain accessible above the chat list or via search
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
</li>
<li>
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
@@ -339,7 +334,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -376,22 +371,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -456,19 +447,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<h3 id="delold">
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
</h3>
<ul>
<li>If you want to save storage on your device, you can choose to delete old
messages automatically.</li>
<li>To turn it on, go to “delete old messages from device” in the “Chats &amp; Media”
settings. You can set a timeframe between “after an hour” and “after a year”;
<p>If you want to save storage on your device, you can choose to delete old
messages automatically.</p>
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
You can set a timeframe between “after an hour” and “after a year”;
this way, <em>all</em> messages will be deleted from your device as soon as they are
older than that.</li>
</ul>
older than that.</p>
<h3 id="remove-account">
@@ -516,9 +506,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Vyberte <strong>Nový chat</strong> a potom <strong>Nová skupina</strong> z ponuky v pravom hornom rohu alebo stlačte príslušné tlačidlo v systéme Android/iOS.</li>
<li>Na nasledujúcej obrazovke vyberte <strong>členov skupiny</strong> a definujte <strong>názov skupiny</strong>. Môžete si tiež vybrať <strong>avatara skupiny</strong>.</li>
<li>Hneď ako napíšete <strong>prvú správu</strong> v skupine, všetci členovia sú informovaní o novej skupine a môžu odpovedať v skupine (pokiaľ nenapíšete správu v skupine, skupina je pre skupinu neviditeľná členovia).</li>
<li>
<p>Vyberte <strong>Nový chat</strong> a potom <strong>Nová skupina</strong> z ponuky v pravom hornom rohu alebo stlačte príslušné tlačidlo v systéme Android/iOS.</p>
</li>
<li>
<p>Na nasledujúcej obrazovke vyberte <strong>členov skupiny</strong> a definujte <strong>názov skupiny</strong>. Môžete si tiež vybrať <strong>avatara skupiny</strong>.</p>
</li>
<li>
<p>Hneď ako napíšete <strong>prvú správu</strong> v skupine, všetci členovia sú informovaní o novej skupine a môžu odpovedať v skupine (pokiaľ nenapíšete správu v skupine, skupina je pre skupinu neviditeľná členovia).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -529,11 +525,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -561,10 +556,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Keďže už nie ste členom skupiny, nemôžete sa znova pridať.
Žiadny problém, jednoducho požiadajte ktoréhokoľvek iného člena skupiny v bežnom chate, aby vás znova pridal.</li>
</ul>
<p>Keďže už nie ste členom skupiny, nemôžete sa znova pridať.
Žiadny problém, jednoducho požiadajte ktoréhokoľvek iného člena skupiny v bežnom chate, aby vás znova pridal.</p>
<h3 id="už-viac-nechcem-dostávať-správy-od-skupiny">
@@ -575,15 +568,12 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>
<p>Vymažte sa zo zoznamu členov alebo odstráňte celý chat.
Ak sa chcete neskôr znova pripojiť k skupine, požiadajte iného člena skupiny, aby vás znova pridal.</p>
</li>
<li>
<p>Ako alternatívu môžete tiež “Stlmiť” skupinu - znamená to, že budete dostávať všetky správy a
môžete stále písať, ale už nebudete upozorňovaní na žiadne nové správy.</p>
</li>
<li>Vymažte sa zo zoznamu členov alebo odstráňte celý chat.
Ak sa chcete neskôr znova pripojiť k skupine, požiadajte iného člena skupiny, aby vás znova pridal.</li>
</ul>
<p>Ako alternatívu môžete tiež “Stlmiť” skupinu - znamená to, že budete dostávať všetky správy a
môžete stále písať, ale už nebudete upozorňovaní na žiadne nové správy.</p>
<h3 id="cloning-a-group">
@@ -609,6 +599,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -650,7 +655,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -897,7 +902,7 @@ One device is not needed for the other to work.</p>
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -949,22 +954,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="máte-nejaké-plány-na-zavedenie-webového-klienta-delta-chat">
@@ -993,10 +997,10 @@ alebo AppImage pre Linux. Nájdete ich na
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1009,33 +1013,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1057,7 +1072,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1069,7 +1084,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1078,7 +1093,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1102,6 +1117,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">
@@ -1110,9 +1159,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Pozrite si <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Štandardy používané v Delta Chate</a>.</li>
</ul>
<p>Pozrite si <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Štandardy používané v Delta Chate</a>.</p>
<h2 id="e2ee">
@@ -1351,6 +1398,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1437,12 +1510,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
+176 -105
View File
@@ -26,6 +26,7 @@
<li><a href="#fshiva-veten-padashje">Fshiva veten padashje.</a></li>
<li><a href="#sdua-ti-marr-më-mesazhet-e-një-grupi">Sdua ti marr më mesazhet e një grupi.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">Më interesojnë hollësitë teknike. Mund të më tregoni diçka më tepër?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">Si i mbron Delta Chat-i tejtëdhënat në mesazhe?</a></li>
<li><a href="#device-seizure">Si të mbrohen tejtëdhënat dhe kontaktet, kur shtien në dorë një pajisje?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Po Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Po Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>Si parazgjedhje, për funksionim më të mirë, figurat optimizohen dhe dërgohen në madhësi më të vogël, por mund ta dërgoni si një “kartelë”, që të ruhet origjinali.</p>
</li>
</ul>
<p>Si parazgjedhje, për funksionim më të mirë, figurat optimizohen dhe dërgohen në madhësi më të vogël, por mund ta dërgoni si një “kartelë”, që të ruhet origjinali.</p>
<h3 id="multiple-accounts">
@@ -261,16 +260,11 @@ or to <strong>Switch Profiles</strong>.</p>
</h3>
<ul>
<li>
<p>Mund të shtoni një foto profili te rregullimet tuaja. Nëse u shkruani kontakteve
tuaja ose i shtoni përmes kodi QR, e shohin automatikisht si foton e profilit tuaj.</p>
</li>
<li>
<p>Për arsye privatësie, askush se sheh foton tuaj të profilit, deri sa
tu shkruani një mesazh.</p>
</li>
</ul>
<p>Mund të shtoni një foto profili te rregullimet tuaja. Nëse u shkruani kontakteve
tuaja ose i shtoni përmes kodi QR, e shohin automatikisht si foton e profilit tuaj.</p>
<p>Për arsye privatësie, askush se sheh foton tuaj të profilit, deri sa
tu shkruani një mesazh.</p>
<h3 id="signature">
@@ -303,8 +297,7 @@ they will see it when they view your contact details.</p>
<p><strong>Heshtoni fjalosje</strong>, nëse sdoni të merrni njoftime mbi to. Fjalosjet e heshtuara qëndrojnë në vend dhe mundeni edhe të fiksoni një fjalosje të heshtuar.</p>
</li>
<li>
<p><strong>Arkivoni fjalosje</strong>, nëse sdoni ti shihni më në listën tuaj të fjalosjeve.
Fjalosjet e arkivuara mbesin të përdorshme mbi listën e fjalosjeve, ose përmes kërkimit.</p>
<p><strong>Arkivoni fjalosje</strong>, nëse sdoni ti shihni më në listën tuaj të fjalosjeve. Fjalosjet e arkivuara mbesin të përdorshme mbi listën e fjalosjeve, ose përmes kërkimit.</p>
</li>
<li>
<p>Kur te një fjalosje e arkivuar vjen një mesazh i ri, do të <strong>hapet jashtë arkivit</strong> dhe kalojë te lista juaj e fjalosjeve, veç në mos qoftë e heshtuar.
@@ -340,7 +333,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
you can go back to the original message in the original chat</p>
</li>
<li>
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
</li>
<li>
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
@@ -377,22 +370,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -462,14 +451,13 @@ the (anyway encrypted) messages may take longer to get deleted from their server
</h3>
<ul>
<li>Nëse doni të kurseni hapësirë në pajisjen tuaj, mund të zgjidhni të fshihen
automatikisht mesazhe të vjetër.</li>
<li>Për ta aktivizuar, kaloni te “fshi prej pajisjeje mesazhe të vjetër”, te rregullimet
<p>Nëse doni të kurseni hapësirë në pajisjen tuaj, mund të zgjidhni të fshihen
automatikisht mesazhe të vjetër.</p>
<p>Për ta aktivizuar, kaloni te “fshi prej pajisjeje mesazhe të vjetër”, te rregullimet
“Fjalosje &amp; Media”. Mund të caktoni një periudhë nga “pas një ore” e deri
“pas një viti”; në këtë mënyrë, <em>krejt</em> mesazhet do të fshihen nga pajisja juaj
sapo të jenë më të vjetër se aq.</li>
</ul>
sapo të jenë më të vjetër se aq.</p>
<h3 id="remove-account">
@@ -517,9 +505,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Prej menusë në cepin e sipërm djathtas, përzgjidhni <strong>Fjalosje e re</strong> dhe mandej <strong>Grup i ri</strong>, ose shtypni butonin përgjegjës në Android/iOS.</li>
<li>Te skena vijuese, përzgjidhni <strong>anëtarë grupi</strong> dhe përcaktoni një <strong>emër grupi</strong>. Mund të përzgjidhni edhe një <strong>avatar grupi</strong>.</li>
<li>Sapo të shkruani <strong>mesazhin e parë</strong> te grupi, krejt anëtarët marrin vesh për grupin e ri dhe mund të përgjigjen në të (për sa kohë që te grupi sshkruani një mesazh i cili është i padukshëm për anëtarët).</li>
<li>
<p>Prej menusë në cepin e sipërm djathtas, përzgjidhni <strong>Fjalosje e re</strong> dhe mandej <strong>Grup i ri</strong>, ose shtypni butonin përgjegjësAndroid/iOS.</p>
</li>
<li>
<p>Te skena vijuese, përzgjidhni <strong>anëtarë grupi</strong> dhe përcaktoni një <strong>emër grupi</strong>. Mund të përzgjidhni edhe një <strong>avatar grupi</strong>.</p>
</li>
<li>
<p>Sapo të shkruani <strong>mesazhin e parë</strong> te grupi, krejt anëtarët marrin vesh për grupin e ri dhe mund të përgjigjen në të (për sa kohë që te grupi sshkruani një mesazh i cili është i padukshëm për anëtarët).</p>
</li>
</ul>
<h3 id="addmembers">
@@ -530,11 +524,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -562,10 +555,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Ngaqë sjeni më anëtar i grupit, smund të shtoni veten sërish.
Megjithatë, ska problem, thjesht kërkojini një anëtari tjetër të grupit në një fjalosje të zakonshme tju shtojë sërish.</li>
</ul>
<p>Ngaqë sjeni më anëtar i grupit, smund të shtoni veten sërish.
Megjithatë, ska problem, thjesht kërkojini një anëtari tjetër të grupit në një fjalosje të zakonshme tju shtojë sërish.</p>
<h3 id="sdua-ti-marr-më-mesazhet-e-një-grupi">
@@ -576,16 +567,13 @@ Megjithatë, ska problem, thjesht kërkojini një anëtari tjetër të grupit
</h3>
<ul>
<li>
<p>Ose fshini veten si anëtar i listës, ose fshini krejt bisedën.
Nëse më vonë doni të ribëheni pjesë e grupit, kërkojini një anëtari tjetër të grupit tju shtojë sërish.</p>
</li>
<li>
<p>Ndryshe, mundeni edhe ta “Heshtoni” një grup - duke bërë këtë, do të merrni
<li>Ose fshini veten si anëtar i listës, ose fshini krejt bisedën.
Nëse më vonë doni të ribëheni pjesë e grupit, kërkojini një anëtari tjetër të grupit tju shtojë sërish.</li>
</ul>
<p>Ndryshe, mundeni edhe ta “Heshtoni” një grup - duke bërë këtë, do të merrni
krejt mesazhet dhe prapë mund të shkruani, por nuk njoftoheni më,
për çfarëdo mesazhesh të rinj.</p>
</li>
</ul>
<h3 id="cloning-a-group">
@@ -611,6 +599,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -652,7 +655,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -899,7 +902,7 @@ Njëra pajisja ska nevojë për tjetrën që të funksionojë.</p>
<p>Kontrolloni sërish që të dyja pajisjet të gjenden në <strong>të njëjtin rrjet Wi-Fi ose klasik</strong></p>
</li>
<li>
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
<p>On <strong>Windows</strong>, go to Control Panel / Network and Internet
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
(after transfer, you can change back to the original value)</p>
</li>
@@ -951,22 +954,21 @@ provoni <strong>shpërnguljen dorazi</strong> të përshkruar më poshtë</p>
<p>Kjo metodë rekomandohet vetëm nëse “Shtoni Pajisje të Dytë” si përshkruhet më sipër sfunksionon.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="a-ka-ndonjë-plan-për-të-sjellë-një-klient-web-delta-chat">
@@ -997,10 +999,10 @@ Windows Desktop, ose AppImage për Linux. Mund ti gjeni te
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -1013,33 +1015,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1061,7 +1074,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1073,7 +1086,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1082,7 +1095,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1106,6 +1119,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">
@@ -1114,9 +1161,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Shihni <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standarde të përdorur në Delta Chat</a>.</li>
</ul>
<p>Shihni <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standarde të përdorur në Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1355,6 +1400,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1441,12 +1512,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, we do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
+207 -152
View File
@@ -8,7 +8,7 @@
<li><a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">Чи підтримує Delta Chat вкладення у вигляді фото, відео тощо?</a></li>
<li><a href="#multiple-accounts">Що таке профілі? Як я можу перемикатися між ними?</a></li>
<li><a href="#хто-бачить-моє-зображення-профілю">Хто бачить моє зображення профілю?</a></li>
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
<li><a href="#signature">Чи можу я встановити біографію/статус у Delta Chat?</a></li>
<li><a href="#що-значить-закріплення-приглушення-архівування">Що значить Закріплення, Приглушення, Архівування?</a></li>
<li><a href="#save">Як працюють “Збережені повідомлення”?</a></li>
<li><a href="#що-означає-зелена-точка">Що означає зелена точка?</a></li>
@@ -16,16 +16,16 @@
<li><a href="#edit">Виправлення помилок та видалення повідомлень після надсилання</a></li>
<li><a href="#ephemeralmsgs">Як працюють повідомлення, що зникають?</a></li>
<li><a href="#delold">Що станеться, якщо я ввімкну «Видаляти старі повідомлення з пристрою»?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
</ul>
</li>
<li><a href="#groups">Groups</a>
<li><a href="#groups">Групи</a>
<ul>
<li><a href="#створення-групи">Створення групи</a></li>
<li><a href="#addmembers">Add and remove members</a></li>
<li><a href="#addmembers">Додавання та видалення учасників</a></li>
<li><a href="#я-випадково-себе-видалив">Я випадково себе видалив</a></li>
<li><a href="#я-більше-не-хочу-отримувати-повідомлення-групи">Я більше не хочу отримувати повідомлення групи.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#клонування-групи">Клонування групи</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,19 +54,20 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Експериментальні функції</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
</ul>
</li>
<li><a href="#e2ee">Шифрування та безпека</a>
<ul>
<li><a href="#які-стандарти-використовуються-для-наскрізного-шифрування">Які стандарти використовуються для наскрізного шифрування?</a></li>
<li><a href="#whene2e">How can I know if messages are end-to-end encrypted?</a></li>
<li><a href="#can-i-still-receive-or-send-messages-without-end-to-end-encryption">Can I still receive or send messages without end-to-end encryption?</a></li>
<li><a href="#whene2e">Як дізнатися, чи повідомлення зашифровано наскрізним шифруванням?</a></li>
<li><a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">Чи можу я отримувати та надсилати пошту без наскрізного шифрування?</a></li>
<li><a href="#e2eeguarantee">Що означає зелена галочка в профілі контакту?</a></li>
<li><a href="#чи-зашифровані-наскрізно-вкладення-зображення-файли-аудіо-тощо">Чи зашифровані наскрізно вкладення (зображення, файли, аудіо тощо)?</a></li>
<li><a href="#openpgp-secure">Чи безпечний OpenPGP?</a></li>
@@ -75,6 +76,7 @@
<li><a href="#чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls">Чи повідомлення, позначені значком пошти, доступні в Інтернеті?{#tls}</a></li>
<li><a href="#message-metadata">Як Delta Chat захищає метадані у повідомленнях?</a></li>
<li><a href="#device-seizure">Як захистити метадані та контакти якщо пристрій вилучено?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Чи підтримує Delta Chat функцію “Запечатаний відправник”?</a></li>
<li><a href="#pfs">Чи підтримує Delta Chat цілковиту пряму секретність (Perfect Forward Secrecy)?</a></li>
<li><a href="#pqc">Чи підтримує Delta Chat пост-квантову криптографію?</a></li>
@@ -112,20 +114,17 @@
які пропонують миттєву доставку повідомлень та push-сповіщення для пристроїв iOS та Android.</p>
</li>
<li>
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
<a href="#multiclient">multi-device</a> support on all platforms
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
<p>Повсюдна підтримка багатьох <a href="#multiple-accounts">профілів</a> та <a href="#multiclient">пристроїв</a> на всіх платформах та між різними <a href="https://chatmail.at/clients">поштовими програмами</a>.</p>
</li>
<li>
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
<p>Інтерактивні <a href="https://webxdc.org/">веб-застосунки у чатах</a> для ігор та співпраці</p>
</li>
<li>
<p><a href="#security-audits">Audited end-to-end encryption</a>
safe against network and server attacks.</p>
<p><a href="#security-audits">Аудитоване наскрізне шифрування</a>
захищене від мережевих та серверних атак.</p>
</li>
<li>
<p>Free and Open Source software, both app and server side,
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
<p>Вільне програмне забезпечення з відкритим вихідним кодом, як застосунок, так серверна частина, побудоване на основі <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Інтернет-стандартів</a>.</p>
</li>
</ul>
@@ -137,8 +136,7 @@ built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standa
</h3>
<p>First, note that Delta Chat is a private messenger.
There is no public discovery, <em>you</em> decide about your contacts.</p>
<p>По-перше, зверніть увагу, що Delta Chat - це приватний месенджер. Тут немає публічного розкриття, <em>ви</em> самі вирішуєте, з ким спілкуватися.</p>
<ul>
<li>
@@ -156,7 +154,7 @@ through another private chat.</p>
</li>
</ul>
<p>Now wait while connection gets established.</p>
<p>Зараз зачекайте, поки встановлюється з’єднання.</p>
<ul>
<li>
@@ -169,9 +167,9 @@ the ability to chat is delayed until connectivity is restored.</p>
</li>
</ul>
<p>Congratulations!
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
<p>Вітаємо!
Тепер Ви автоматично використовуватимете <a href="#e2ee">наскрізне шифрування</a> з цим контактом.
Якщо ви додасте один одного у <a href="#groups">групи</a>, наскрізне шифрування буде встановлено між усіма учасниками.</p>
<h3 id="why-is-a-chat-marked-as-request">
@@ -184,7 +182,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -220,15 +219,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>Так. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>Так. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>З міркувань продуктивності, зображення оптимізовані та надсилаються в меншому розмірі за замовчуванням, але ви можете надіслати їх як «файл», щоб зберегти оригінал.</p>
</li>
</ul>
<p>З міркувань продуктивності, зображення оптимізовані та надсилаються в меншому розмірі за замовчуванням, але ви можете надіслати їх як «файл», щоб зберегти оригінал.</p>
<h3 id="multiple-accounts">
@@ -246,7 +240,7 @@ and uses the server only to relay messages.</p>
<p>Пізніше ви можете натиснути на зображення вашого профілю у верхньому лівому кутку, щоб вибрати <strong>Додати профілі</strong> або <strong>Переключити профілі</strong>.</p>
<p>You may want to use separate profiles for political, family or work related activities.</p>
<p>Ви можете використовувати окремі профілі для політичної, сімейної або робочої діяльності.</p>
<p>Ви також можете дізнатися <a href="#multiclient">як використовувати один і той самий профіль на декількох пристроях</a>.</p>
@@ -258,19 +252,14 @@ and uses the server only to relay messages.</p>
</h3>
<ul>
<li>
<p>Ви можете додати зображення профілю в ваших налаштуваннях. Якщо ви пишете комусь із ваших контактів чи додаєте їх через QR код, вони автоматично побачать ваше зображення профілю.</p>
</li>
<li>
<p>Із міркувань приватності, ніхто не бачить ваше зображення профілю доки ви їм не напишете.</p>
</li>
</ul>
<p>Ви можете додати зображення профілю в ваших налаштуваннях. Якщо ви пишете комусь із ваших контактів чи додаєте їх через QR код, вони автоматично побачать ваше зображення профілю.</p>
<p>Із міркувань приватності, ніхто не бачить ваше зображення профілю доки ви їм не напишете.</p>
<h3 id="signature">
Can I set a Bio/Status with Delta Chat? <a href="#signature" class="anchor"></a>
Чи можу я встановити біографію/статус у Delta Chat? <a href="#signature" class="anchor"></a>
</h3>
@@ -298,8 +287,7 @@ they will see it when they view your contact details.</p>
<p><strong>Приглушіть чати</strong> якщо ви не хочете отримувати сповіщення для них. Приглушені чати залишаються на місці і ви також можете закріпити приглушений чат.</p>
</li>
<li>
<p><strong>Архівуйте чати</strong>, якщо ви більше не хочете бачити їх у своєму списку чатів.
Заархівовані чати залишаються доступними над списком чатів або через пошук.</p>
<p><strong>Архівуйте чати</strong>, якщо ви більше не хочете бачити їх у своєму списку чатів. Заархівовані чати залишаються доступними над списком чатів або через пошук.</p>
</li>
<li>
<p>Коли архівний чат отримує нове повідомлення, якщо не приглушений, він <strong>вискочить з архіву</strong> і повернеться у ваш список чатів.
@@ -366,22 +354,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -442,19 +426,12 @@ the (anyway encrypted) messages may take longer to get deleted from their server
</h3>
<ul>
<li>Якщо ви хочете заощадити пам’ять на своєму пристрої, ви можете видалити старе повідомлення автоматично.</li>
<li>Щоб увімкнути його, перейдіть до «видалити старі повідомлення з пристрою» в налаштуваннях «Чатів та медіа» . Ви можете встановити часові рамки від «через годину» до «через рік»;
Таким чином, <em>усі</em> повідомлення будуть видалені з вашого пристрою, як тільки вони будуть старішими за це.</li>
</ul>
<h3 id="remove-account">
How can I delete my chat profile? <a href="#remove-account" class="anchor"></a>
</h3>
<p>Якщо ви хочете заощадити пам’ять на своєму пристрої, ви можете видалити старе повідомлення автоматично.</p>
<p>Щоб увімкнути його, перейдіть до «видалити старі повідомлення з пристрою» в налаштуваннях «Чатів та медіа» . Ви можете встановити часові рамки від «через годину» до «через рік»;
Таким чином, <em>усі</em> повідомлення будуть видалені з вашого пристрою, як тільки вони будуть старішими за це.</p>
<p>Як я можу видалити свій профіль у Delta Chat? {#remove-account}</p>
<p>If you are using more than one chat profile,
you can remove single ones in the top profile switcher menu (on Android and iOS),
@@ -470,12 +447,12 @@ or the respective page from your chosen <a href="https://chatmail.at/relays">3rd
<h2 id="groups">
Groups <a href="#groups" class="anchor"></a>
Групи <a href="#groups" class="anchor"></a>
</h2>
<p>Groups let several people chat together privately with <strong>equal rights</strong>.</p>
<p>Групи дозволяють кільком людям спілкуватися у приватному чаті з <strong>рівними правами</strong>.</p>
<p>Anyone can
change the group name or avatar,
@@ -483,7 +460,7 @@ change the group name or avatar,
set <a href="#ephemeralmsgs">disappearing messages</a>,
and <a href="#edit">delete their own messages</a> from all members devices.</p>
<p>Because all members have the same rights, groups work best among <strong>trusted friends and family</strong>.</p>
<p>Оскільки усі учасники мають однакові права, групи найкраще працюють серед <strong>довірених друзів та родичів</strong>.</p>
<h3 id="створення-групи">
@@ -494,24 +471,29 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>Оберіть <strong>Новий чат</strong>, потім <strong>Нова групи</strong> у меню в верхньому правому кутку або натисніть відповідну кнопку у Android/iOS.</li>
<li>На наступному екрані виберіть <strong>учасники групи</strong> та встановіть <strong>назву групи</strong>. Ви також можете обрати <strong>аватар групи</strong>.</li>
<li>Як тільки ви напишете <strong>перше повідомлення</strong> у групу, усі учасники будуть проінформовані про нову групу і зможуть відповісти у нову групу (доки ви не напишете повідомлення у групі, група залишатиметься невидимою для учасників).</li>
<li>
<p>Оберіть <strong>Новий чат</strong>, потім <strong>Нова групи</strong> у меню в верхньому правому кутку або натисніть відповідну кнопку у Android/iOS.</p>
</li>
<li>
<p>На наступному екрані виберіть <strong>учасники групи</strong> та встановіть <strong>назву групи</strong>. Ви також можете обрати <strong>аватар групи</strong>.</p>
</li>
<li>
<p>Як тільки ви напишете <strong>перше повідомлення</strong> у групу, усі учасники будуть проінформовані про нову групу і зможуть відповісти у нову групу (доки ви не напишете повідомлення у групі, група залишатиметься невидимою для учасників).</p>
</li>
</ul>
<h3 id="addmembers">
Add and remove members <a href="#addmembers" class="anchor"></a>
Додавання та видалення учасників <a href="#addmembers" class="anchor"></a>
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -539,9 +521,7 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>Оскільки ви більше не учасник групи, ви не зможете додати себе знову. Однак, це не проблема, просто попросіть будь-якого іншого учасника групи в звичайному чаті додати вас знову.</li>
</ul>
<p>Оскільки ви більше не учасник групи, ви не зможете додати себе знову. Однак, це не проблема, просто попросіть будь-якого іншого учасника групи в звичайному чаті додати вас знову.</p>
<h3 id="я-більше-не-хочу-отримувати-повідомлення-групи">
@@ -552,18 +532,15 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>
<p>Або видаліть себе із списку учасників групи, або видаліть весь чат. Якщо ви хочете повернутись до чату пізніше, попросіть іншого учасника групи додати вас знову.</p>
</li>
<li>
<p>Ви також можете “Заглушити” групу - це означає, що ви будете отримувати усі повідомлення та можете писати у групу, але ви більше не будете отримувати сповіщення про нові повідомлення.</p>
</li>
<li>Або видаліть себе із списку учасників групи, або видаліть весь чат. Якщо ви хочете повернутись до чату пізніше, попросіть іншого учасника групи додати вас знову.</li>
</ul>
<p>Ви також можете “Заглушити” групу - це означає, що ви будете отримувати усі повідомлення та можете писати у групу, але ви більше не будете отримувати сповіщення про нові повідомлення.</p>
<h3 id="cloning-a-group">
<h3 id="клонування-групи">
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
Клонування групи <a href="#клонування-групи" class="anchor"></a>
</h3>
@@ -581,8 +558,23 @@ or right-click the group in the chat list (Desktop).</p>
</li>
</ul>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<p>Нова група є <strong>цілком незалежною</strong> від оригінальної,
котра продовжує працювати як раніше.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -625,7 +617,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -655,8 +647,8 @@ trust the people you chat with, you can trust the in-chat app as well.</p>
to get started.</p>
</li>
<li>
<p>All else you need to know is written in the
<a href="https://webxdc.org/docs">Webxdc documentation</a>.</p>
<p>Все інше, що Вам потрібно знати, написано у
<a href="https://webxdc.org/docs">документації Webxdc</a>.</p>
</li>
<li>
<p>If you have question, you can ask others with experience
@@ -841,7 +833,7 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Ще раз упевніться, що обидва пристрої підключені до <strong>одного Wi-Fi або мережі</strong></p>
</li>
<li>
<p>У <strong>Windows</strong> перейдіть до <strong>Панель керування / Мережа та Інтернет</strong> і переконайтеся, що <strong>Приватна мережа</strong> вибрано як “Тип мережевого профілю” (після перенесення ви можете повернути початкове значення)</p>
<p>У <strong>Windows</strong> перейдіть до Панель керування / Мережа та Інтернет і переконайтеся, що <strong>Приватна мережа</strong> вибрано як “Тип мережевого профілю” (після перенесення ви можете повернути початкове значення)</p>
</li>
<li>
<p>На <strong>iOS</strong> переконайтеся, що доступ до “Системні налаштування / Програми / Delta Chat / <strong>Локальна мережа</strong>” дозволено</p>
@@ -883,11 +875,14 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Цей спосіб рекомендований, лише якщо «Додати другий пристрій», як описано вище, не працює.</p>
<ul>
<li>На старому пристрої перейдіть до “Налаштування -&gt; Чати та медіа -&gt; Експортувати резервну копію”. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</li>
<li>На новому пристрої в меню “У мене вже є профіль” виберіть “Відновити з резервної копії”. Після імпорту ваші розмови, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.</li>
<li>Якщо ви користуєтеся iOS:** і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
<li>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізних зашифрованих повідомлень зі своїми партнерами по спілкуванню.</li>
<li>
<p>На старому пристрої перейдіть до <strong>Налаштування → Чати та медіа → Експортувати резервну копію</strong>. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</p>
</li>
<li>На новому пристрої в меню <strong>У мене вже є профіль</strong> виберіть <strong>Відновити з резервної копії</strong>. Після імпорту ваші розмови, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.</li>
<li>Якщо ви користуєтеся iOS: і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
</ul>
<p>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізних зашифрованих повідомлень зі своїми партнерами по спілкуванню.</p>
<h3 id="чи-планується-впровадження-веб-клієнта-delta-chat">
@@ -911,10 +906,10 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Експериментальні функції <a href="#experiments" class="anchor"></a>
</h3>
@@ -922,38 +917,49 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>At <strong>Settings → Advanced → Experimental Features</strong>
you can try out features we are working on.</p>
<p>The features may be <strong>unstable</strong> and may be <strong>changed or removed</strong>.</p>
<p>Ці функції можуть бути <strong>нестабільними</strong> та можуть бути <strong>змінені або видалені</strong>.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<p>Ви можете знайти додаткову інформацію
та залишити відгук на <a href="https://support.delta.chat">форумі</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -975,7 +981,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -987,7 +993,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -996,7 +1002,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1020,6 +1026,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>Коли Ви увімкнете цю функцію,
щотижнева статистика буде автоматично надсилатися боту.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>Ми <em>не</em> будемо збирати жодних персональних даних, які б могли ідентифікувати Вас особисто.</p>
<h3 id="мене-цікавлять-технічні-деталі-можете-розповісти-більше">
@@ -1028,9 +1068,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>Дивіться <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</li>
</ul>
<p>Дивіться <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</p>
<h2 id="e2ee">
@@ -1067,17 +1105,17 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
<h3 id="whene2e">
How can I know if messages are end-to-end encrypted? <a href="#whene2e" class="anchor"></a>
Як дізнатися, чи повідомлення зашифровано наскрізним шифруванням? <a href="#whene2e" class="anchor"></a>
</h3>
<p>Всі повідомлення в Delta Chat за замовчуванням <strong>наскрізно зашифровані</strong>. Починаючи з версії 2 Delta Chat (липень 2025 року) на наскрізних зашифрованих повідомленнях більше немає замків або інших подібних маркерів.</p>
<h3 id="can-i-still-receive-or-send-messages-without-end-to-end-encryption">
<h3 id="чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">
Can I still receive or send messages without end-to-end encryption? <a href="#can-i-still-receive-or-send-messages-without-end-to-end-encryption" class="anchor"></a>
Чи можу я отримувати та надсилати пошту без наскрізного шифрування? <a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування" class="anchor"></a>
</h3>
@@ -1165,21 +1203,9 @@ and there must be tangible improvements for users.</p>
</h3>
<p>If you are sending or receiving email messages without end-to-end encryption (using a classic email server),
they are still protected from cell or cable companies who can not read or modify your email messages.
But both your and your recipients email providers
may read, analyze or modify your messages, including any attachments.</p>
<p>Якщо ви надсилаєте або отримуєте електронні листи без наскрізного шифрування (використовуючи класичний сервер електронної пошти), вони все одно захищені від мобільних або кабельних компаній, які не можуть читати чи змінювати ваші повідомлення. Однак як ваш, так і поштовий провайдер одержувача можуть читати, аналізувати або змінювати ваші листи, включаючи будь-які вкладення.</p>
<p>Delta Chat by default uses strict
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS encryption</a>
which secures connections between your device and your email provider.
All of Delta Chats TLS-handling has been independently <a href="#security-audits">security audited</a>.
Moreover, the connection between your and the recipients email provider
will typically be transport-encrypted as well.
If the involved email servers support <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>
then transport encryption will be enforced between email providers
in which case Delta Chat communications will never be exposed in cleartext to the Internet
even if the message was not end-to-end encrypted.</p>
<p>За замовчуванням Delta Chat використовує суворе <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS-шифрування</a> яке захищає з’єднання між вашим пристроєм і провайдером електронної пошти. Вся робота з TLS-шифруванням Delta Chat пройшла незалежний <a href="#security-audits">аудит безпеки</a>. Крім того, з’єднання між вашим провайдером та провайдером електронної пошти одержувача зазвичай також шифрується при передачі даних. Якщо задіяні поштові сервери підтримують <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a> то між провайдерами електронної пошти буде застосовуватися транспортне шифрування в цьому випадку повідомлення Delta Chat ніколи не будуть доступні в Інтернеті у вигляді відкритого тексту навіть якщо повідомлення не було наскрізь зашифровано.</p>
<h3 id="message-metadata">
@@ -1194,11 +1220,11 @@ even if the message was not end-to-end encrypted.</p>
<p>Servers can therefore only see:</p>
<ul>
<li>the sender and receiver addresses</li>
<li>and the message size.</li>
<li>адреси відправника та одержувача</li>
<li>та розмір повідомлення.</li>
</ul>
<p>By default, the addresses are randomly generated.</p>
<p>За замовчуванням адреси генеруються випадковим чином.</p>
<p>Усі інші метадані повідомлень, контактів і груп містяться в наскрізно зашифрованій частині повідомлень.</p>
@@ -1220,6 +1246,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1284,9 +1336,12 @@ but an implementation has not been agreed as a priority yet.</p>
<p>Ні.</p>
<p>Delta Chat генерує безпечні ключі OpenPGP відповідно до специфікації Autocrypt 1.1. Ви можете експортувати свій приватний ключ, але не можете імпортувати додаткові приватні ключі.</p>
<p>Загалом, ми не рекомендуємо і не пропонуємо користувачам керувати ключами вручну. Ми хочемо гарантувати, що аудит безпеки може зосередитися на декількох перевірених криптографічних алгоритмах а не на всій широті можливих алгоритмів, дозволених у OpenPGP.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
@@ -1345,7 +1400,7 @@ but an implementation has not been agreed as a priority yet.</p>
<p>Some features require certain permissions,
e.g. you need to grant camera permission if you want to <a href="#howtoe2ee">scan an invite QR code</a>.</p>
<p>See <a href="https://delta.chat/en/gdpr#24-app-permissions">Privacy Policy</a> for a detailed overview.</p>
<p>Дивіться <a href="https://delta.chat/en/gdpr#24-app-permissions">політику конфіденційності</a> для детального огляду.</p>
<h3 id="де-мої-друзі-можуть-знайти-delta-chat">
+165 -95
View File
@@ -26,6 +26,7 @@
<li><a href="#我不小心删除了我自己">我不小心删除了我自己。</a></li>
<li><a href="#我不想再收到某个群组中的消息了">我不想再收到某个群组中的消息了。</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,11 +55,12 @@
</li>
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#experiments">Experimental Features</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#我对技术细节很感兴趣能告诉我更多吗">我对技术细节很感兴趣。能告诉我更多吗?</a></li>
</ul>
</li>
@@ -75,6 +77,7 @@
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
<li><a href="#message-metadata">Delta Chat 如何保护消息中的元数据?</a></li>
<li><a href="#device-seizure">当设备被查封时,如何保护元数据和联系人?</a></li>
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
<li><a href="#pfs">Delta Chat 是否支持完美前向保密?</a></li>
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
@@ -184,7 +187,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Your friends may share your contact with other friends,
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
<ul>
<li>
@@ -222,15 +226,10 @@ and can tap it to start chatting with the first contact.</p>
</h3>
<ul>
<li>
<p>是的。 Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
<p>是的。 Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
</li>
<li>
<p>为了提高性能,默认情况下会对图像进行优化并以较小的尺寸发送,但您也可以将其作为 “文件 “发送,以保留原始图像。</p>
</li>
</ul>
<p>为了提高性能,默认情况下会对图像进行优化并以较小的尺寸发送,但您也可以将其作为 “文件 “发送,以保留原始图像。</p>
<h3 id="multiple-accounts">
@@ -261,14 +260,9 @@ and uses the server only to relay messages.</p>
</h3>
<ul>
<li>
<p>您可以在设置中添加个人资料图片。如果您给您的联系人发消息或者通过二维码添加他们,他们会自动看到您的个人资料片。</p>
</li>
<li>
<p>出于隐私原因,在您向他们发送消息之前,没有人会看到您的个人资料照片。</p>
</li>
</ul>
<p>您可以在设置中添加个人资料图片。如果您给您的联系人发消息或者通过二维码添加他们,他们会自动看到您的个人资料图片。</p>
<p>出于隐私原因,在您向他们发送消息之前,没有人会看到您的个人资料片。</p>
<h3 id="signature">
@@ -374,22 +368,18 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
indicate your contact has read the message.</p>
</li>
</ul>
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
<p>You will only get the second tick if both you and one of the recipients who read the message
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
<h3 id="edit">
@@ -455,10 +445,9 @@ the (anyway encrypted) messages may take longer to get deleted from their server
</h3>
<ul>
<li>若要节省设备上的存储空间,可以开启自动删除旧消息。</li>
<li>找到“聊天与媒体”设置中的“从设备删除旧消息”,在从“一小时后”到“一年后”的一系列选项中选择一个。这样,设备上 <em>所有</em> 比所选择时间长度老的消息将被删除</li>
</ul>
<p>若要节省设备上的存储空间,可以开启自动删除旧消息</p>
<p>找到“聊天与媒体”设置中的“从设备删除旧消息”,在从“一小时后”到“一年后”的一系列选项中选择一个。这样,设备上 <em>所有</em> 比所选择时间长度老的消息将被删除</p>
<h3 id="remove-account">
@@ -506,9 +495,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>从右上角的菜单中选择<strong>新建聊天</strong>,然后选择<strong>新建群组</strong>或在 Android/iOS 上点击相应的按钮。</li>
<li>在随后的屏幕上,选择<strong>群组成员</strong>并起一个<strong>群组名称</strong>。您也可以选择一个<strong>群组头像</strong></li>
<li>当您在群组中发送<strong>第一条消息</strong>时,所有成员都会被告知新群组的信息并可以在该群组中应答(只要您不在群组中发送第一条消息,那么群组对成员就是不可见的)。</li>
<li>
<p>从右上角的菜单中选择<strong>新建聊天</strong>,然后选择<strong>新建群组</strong>或在 Android/iOS 上点击相应的按钮</p>
</li>
<li>
<p>在随后的屏幕上,选择<strong>群组成员</strong>并起一个<strong>群组名称</strong>。您也可以选择一个<strong>群组头像</strong></p>
</li>
<li>
<p>当您在群组中发送<strong>第一条消息</strong>时,所有成员都会被告知新群组的信息并可以在该群组中应答(只要您不在群组中发送第一条消息,那么群组对成员就是不可见的)。</p>
</li>
</ul>
<h3 id="addmembers">
@@ -519,11 +514,10 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
</h3>
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
</li>
<ul>
<li>
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
</li>
@@ -551,9 +545,7 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>由于您不再是群组成员,您无法将自己加入到群组中。但是,问题不大,只需在普通聊天中请求其他群组成员将您重新加入即可。</li>
</ul>
<p>由于您不再是群组成员,您无法将自己加入到群组中。但是,问题不大,只需在普通聊天中请求其他群组成员将您重新加入即可。</p>
<h3 id="我不想再收到某个群组中的消息了">
@@ -564,13 +556,10 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</h3>
<ul>
<li>
<p>从成员列表中删除自己,或者删除整个聊天。如果您之后想再加入该群组,请让其他群组成员添加您。</p>
</li>
<li>
<p>另外,您也可以“静音”群组——这样做意味着您会收到所有消息并且仍可以编写消息,但不会再收到任何新消息的通知。</p>
</li>
<li>从成员列表中删除自己,或者删除整个聊天。如果您之后想再加入该群组,请让其他群组成员添加您。</li>
</ul>
<p>另外,您也可以“静音”群组——这样做意味着您会收到所有消息并且仍可以编写消息,但不会再收到任何新消息的通知。</p>
<h3 id="cloning-a-group">
@@ -596,6 +585,21 @@ or right-click the group in the chat list (Desktop).</p>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<h3 id="how-many-members-can-participate-in-a-single-group">
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
</h3>
<p>There is no strict technical limit,
but more than 150 is not recommended.</p>
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbars number</a> for more insights.</p>
<h2 id="webxdc">
@@ -637,7 +641,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
</li>
@@ -881,7 +885,7 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>仔细检查两台设备是否在<strong>同一个 Wi-Fi 或网络中</strong></p>
</li>
<li>
<p><strong>Windows</strong> 上,转到<strong>控制面板 / 网络和 Internet</strong>
<p><strong>Windows</strong> 上,转到控制面板 / 网络和 Internet
并确保<strong>专用网络</strong>被选为“网络配置文件类型”
(传输后,你可以更改回原始值)</p>
</li>
@@ -933,19 +937,16 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>仅当上述“添加第二台设备”方法不起作用时,才建议使用此方法。</p>
<ul>
<li>在旧设备上,转到“设置 -&gt; 聊天和媒体 -&gt; 导出备份”。 输入你的
屏幕解锁 PIN 码、图案或密码。 然后你可以点击“开始
备份”。 这会将备份文件保存到你的设备。 现在你必须
以某种方式将其传输到另一台设备。</li>
<li>在新设备上,在“我已经有一个配置文件”菜单中,
选择“从备份还原”。 导入后,你的对话、加密
密钥和媒体应复制到新设备。</li>
<li><strong>如果你使用 iOS</strong> 并且你遇到困难,也许
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">本指南</a>
帮助你。</li>
<li>你现在已同步,并且可以使用两台设备与你的通信伙伴发送和接收
端到端加密消息。</li>
<li>
<p>在旧设备上,转到“设置 -&gt; 聊天和媒体 -&gt; 导出备份”。 输入你的 屏幕解锁 PIN 码、图案或密码。 然后你可以点击“开始 备份”。 这会将备份文件保存到你的设备。 现在你必须 以某种方式将其传输到另一台设备。</p>
</li>
<li>
<p>在新设备上,在“我已经有一个配置文件”菜单中,选择“从备份还原”。 导入后,你的对话、加密 密钥和媒体应复制到新设备。
如果你使用 iOS: 并且你遇到困难,也许 <a href="https://support.delta.chat/t/import-backup-to-ios/1628">本指南</a> 将 帮助你。</p>
</li>
</ul>
<p>你现在已同步,并且可以使用两台设备与你的通信伙伴发送和接收 端到端加密消息。</p>
<h3 id="有推出-delta-chat-web-客户端的计划吗">
@@ -969,10 +970,10 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
</h2>
<h3 id="experimental-features">
<h3 id="experiments">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimental Features <a href="#experiments" class="anchor"></a>
</h3>
@@ -985,33 +986,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, you will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1033,7 +1045,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1045,7 +1057,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1054,7 +1066,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
@@ -1078,6 +1090,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="我对技术细节很感兴趣能告诉我更多吗">
@@ -1086,9 +1132,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
</h3>
<ul>
<li>请参阅 <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Delta Chat 中使用的标准</a></li>
</ul>
<p>请参阅 <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Delta Chat 中使用的标准</a></p>
<h2 id="e2ee">
@@ -1324,6 +1368,32 @@ with the knowledge that all their data, along with all metadata, will be deleted
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<h3 id="who-sees-my-ip-address">
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
</h3>
<p>The used <a href="#relays">relay</a> needs to know your IP Address,
as well as sometimes your contacts devices if you have a <a href="#experiments">call</a>
or use <a href="#webxdc">apps</a> together.</p>
<p>IP Addresses are needed for connectivity and efficiency.
They are neither persisted nor exposed.
Note that the IP Address
is not like a detailed address you give to a delivery service,
but much more coarse, often defining region or country only.</p>
<p>As this is just how the internet and other messengers work by default,
we do not offer options here or ask upfront questions.</p>
<p>If you see your IP Address as a security or privacy risk,
we recommend to use a VPN, in combination with system lockdown mode.
Hunting down options in all apps on your system will leave gaps.
For example, tapping a link exposes IP Addresses to unknown parties and is the by far larger risk here.</p>
<h3 id="sealedsender">
@@ -1410,12 +1480,12 @@ Delta Chat 在此处显示两个指纹。
<p>不。</p>
<p>Delta Chat 采用 Autocrypt 1.1 标准规范生成 OpenPGP 加密密钥。
用户虽可导出自身私钥进行备份,但系统设计上不支持导入其他私钥。</p>
<p>基于安全考量,系统默认不开放手动密钥管理功能。
此项设计旨在让安全审计工作聚焦于少量成熟加密算法(如 Autocrypt 标准),
避免因支持 OpenPGP 协议所允许的所有算法而增加潜在安全风险。</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<h3 id="security-audits">
@@ -94,7 +94,7 @@ public abstract class BaseTransport implements Rpc.Transport {
}
if (response.error != null) {
future.setException(new RpcException(response.error.toString()));
future.setException(new RpcException(response.error.message));
} else if (response.result != null) {
future.set(response.result);
} else {
@@ -115,10 +115,15 @@ public abstract class BaseTransport implements Rpc.Transport {
}
}
private static class RpcError {
public int code;
public String message;
}
private static class Response {
public String jsonrpc;
public int id;
public JsonNode result;
public JsonNode error;
public RpcError error;
}
}
+53 -45
View File
@@ -23,17 +23,17 @@ public class Rpc {
this.mapper = transport.getObjectMapper();
}
/* Test function. */
/** Test function. */
public void sleep(Float delay) throws RpcException {
transport.call("sleep", mapper.valueToTree(delay));
}
/* Checks if an email address is valid. */
/** Checks if an email address is valid. */
public Boolean checkEmailValidity(String email) throws RpcException {
return transport.callForResult(new TypeReference<Boolean>(){}, "check_email_validity", mapper.valueToTree(email));
}
/* Returns general system info. */
/** Returns general system info. */
public java.util.Map<String, String> getSystemInfo() throws RpcException {
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_system_info");
}
@@ -73,12 +73,12 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_all_account_ids");
}
/* Select account in account manager, this saves the last used account to accounts.toml */
/** Select account in account manager, this saves the last used account to accounts.toml */
public void selectAccount(Integer id) throws RpcException {
transport.call("select_account", mapper.valueToTree(id));
}
/* Get the selected account from the account manager (on startup it is read from accounts.toml) */
/** Get the selected account from the account manager (on startup it is read from accounts.toml) */
public Integer getSelectedAccountId() throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "get_selected_account_id");
}
@@ -93,17 +93,17 @@ public class Rpc {
transport.call("set_accounts_order", mapper.valueToTree(order));
}
/* Get a list of all configured accounts. */
/** Get a list of all configured accounts. */
public java.util.List<Account> getAllAccounts() throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<Account>>(){}, "get_all_accounts");
}
/* Starts background tasks for all accounts. */
/** Starts background tasks for all accounts. */
public void startIoForAllAccounts() throws RpcException {
transport.call("start_io_for_all_accounts");
}
/* Stops background tasks for all accounts. */
/** Stops background tasks for all accounts. */
public void stopIoForAllAccounts() throws RpcException {
transport.call("stop_io_for_all_accounts");
}
@@ -123,27 +123,27 @@ public class Rpc {
transport.call("stop_background_fetch");
}
/* Starts background tasks for a single account. */
/** Starts background tasks for a single account. */
public void startIo(Integer accountId) throws RpcException {
transport.call("start_io", mapper.valueToTree(accountId));
}
/* Stops background tasks for a single account. */
/** Stops background tasks for a single account. */
public void stopIo(Integer accountId) throws RpcException {
transport.call("stop_io", mapper.valueToTree(accountId));
}
/* Get top-level info for an account. */
/** Get top-level info for an account. */
public Account getAccountInfo(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Account>(){}, "get_account_info", mapper.valueToTree(accountId));
}
/* Get the current push notification state. */
/** Get the current push notification state. */
public NotifyState getPushState(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<NotifyState>(){}, "get_push_state", mapper.valueToTree(accountId));
}
/* Get the combined filesize of an account in bytes */
/** Get the combined filesize of an account in bytes */
public Integer getAccountFileSize(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "get_account_file_size", mapper.valueToTree(accountId));
}
@@ -160,22 +160,22 @@ public class Rpc {
return transport.callForResult(new TypeReference<ProviderInfo>(){}, "get_provider_info", mapper.valueToTree(accountId), mapper.valueToTree(email));
}
/* Checks if the context is already configured. */
/** Checks if the context is already configured. */
public Boolean isConfigured(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Boolean>(){}, "is_configured", mapper.valueToTree(accountId));
}
/* Get system info for an account. */
/** Get system info for an account. */
public java.util.Map<String, String> getInfo(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_info", mapper.valueToTree(accountId));
}
/* Get storage usage report as formatted string */
/** Get storage usage report as formatted string */
public String getStorageUsageReportString(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "get_storage_usage_report_string", mapper.valueToTree(accountId));
}
/* Get the blob dir. */
/** Get the blob dir. */
public String getBlobDir(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "get_blob_dir", mapper.valueToTree(accountId));
}
@@ -195,17 +195,17 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "get_migration_error", mapper.valueToTree(accountId));
}
/* Copy file to blob dir. */
/** Copy file to blob dir. */
public String copyToBlobDir(Integer accountId, String path) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "copy_to_blob_dir", mapper.valueToTree(accountId), mapper.valueToTree(path));
}
/* Sets the given configuration key. */
/** Sets the given configuration key. */
public void setConfig(Integer accountId, String key, String value) throws RpcException {
transport.call("set_config", mapper.valueToTree(accountId), mapper.valueToTree(key), mapper.valueToTree(value));
}
/* Updates a batch of configuration values. */
/** Updates a batch of configuration values. */
public void batchSetConfig(Integer accountId, java.util.Map<String, String> config) throws RpcException {
transport.call("batch_set_config", mapper.valueToTree(accountId), mapper.valueToTree(config));
}
@@ -225,7 +225,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Qr>(){}, "check_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
}
/* Returns configuration value for the given key. */
/** Returns configuration value for the given key. */
public String getConfig(Integer accountId, String key) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "get_config", mapper.valueToTree(accountId), mapper.valueToTree(key));
}
@@ -284,7 +284,7 @@ public class Rpc {
transport.call("add_or_update_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
}
/* Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. */
/** Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. */
public void addTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
transport.call("add_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
}
@@ -315,7 +315,7 @@ public class Rpc {
transport.call("delete_transport", mapper.valueToTree(accountId), mapper.valueToTree(addr));
}
/* Signal an ongoing process to stop. */
/** Signal an ongoing process to stop. */
public void stopOngoingProcess(Integer accountId) throws RpcException {
transport.call("stop_ongoing_process", mapper.valueToTree(accountId));
}
@@ -608,7 +608,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
/* Returns contact IDs of the past chat members. */
/** Returns contact IDs of the past chat members. */
public java.util.List<Integer> getPastChatContacts(Integer accountId, Integer chatId) throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_past_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
@@ -647,7 +647,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "create_group_chat_unencrypted", mapper.valueToTree(accountId), mapper.valueToTree(name));
}
/* Deprecated 2025-07 in favor of create_broadcast(). */
/** Deprecated 2025-07 in favor of create_broadcast(). */
public Integer createBroadcastList(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "create_broadcast_list", mapper.valueToTree(accountId));
}
@@ -856,7 +856,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.Map<String, MessageLoadResult>>(){}, "get_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
}
/* Fetch info desktop needs for creating a notification for a message */
/** Fetch info desktop needs for creating a notification for a message */
public MessageNotificationInfo getMessageNotificationInfo(Integer accountId, Integer messageId) throws RpcException {
return transport.callForResult(new TypeReference<MessageNotificationInfo>(){}, "get_message_notification_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
@@ -888,12 +888,12 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "get_message_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
/* Returns additional information for single message. */
/** Returns additional information for single message. */
public MessageInfo getMessageInfoObject(Integer accountId, Integer messageId) throws RpcException {
return transport.callForResult(new TypeReference<MessageInfo>(){}, "get_message_info_object", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
/* Returns contacts that sent read receipts and the time of reading. */
/** Returns contacts that sent read receipts and the time of reading. */
public java.util.List<MessageReadReceipt> getMessageReadReceipts(Integer accountId, Integer messageId) throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<MessageReadReceipt>>(){}, "get_message_read_receipts", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
@@ -941,7 +941,7 @@ public class Rpc {
transport.call("save_msgs", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
}
/* Get a single contact options by ID. */
/** Get a single contact options by ID. */
public Contact getContact(Integer accountId, Integer contactId) throws RpcException {
return transport.callForResult(new TypeReference<Contact>(){}, "get_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
}
@@ -962,7 +962,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "create_contact", mapper.valueToTree(accountId), mapper.valueToTree(email), mapper.valueToTree(name));
}
/* Returns contact id of the created or existing DM chat with that contact */
/** Returns contact id of the created or existing DM chat with that contact */
public Integer createChatByContactId(Integer accountId, Integer contactId) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "create_chat_by_contact_id", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
}
@@ -1011,7 +1011,7 @@ public class Rpc {
transport.call("delete_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
}
/* Sets display name for existing contact. */
/** Sets display name for existing contact. */
public void changeContactName(Integer accountId, Integer contactId, String name) throws RpcException {
transport.call("change_contact_name", mapper.valueToTree(accountId), mapper.valueToTree(contactId), mapper.valueToTree(name));
}
@@ -1046,7 +1046,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "lookup_contact_id_by_addr", mapper.valueToTree(accountId), mapper.valueToTree(addr));
}
/* Parses a vCard file located at the given path. Returns contacts in their original order. */
/** Parses a vCard file located at the given path. Returns contacts in their original order. */
public java.util.List<VcardContact> parseVcard(String path) throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<VcardContact>>(){}, "parse_vcard", mapper.valueToTree(path));
}
@@ -1069,12 +1069,12 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "import_vcard_contents", mapper.valueToTree(accountId), mapper.valueToTree(vcard));
}
/* Returns a vCard containing contacts with the given ids. */
/** Returns a vCard containing contacts with the given ids. */
public String makeVcard(Integer accountId, java.util.List<Integer> contacts) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "make_vcard", mapper.valueToTree(accountId), mapper.valueToTree(contacts));
}
/* Sets vCard containing the given contacts to the message draft. */
/** Sets vCard containing the given contacts to the message draft. */
public void setDraftVcard(Integer accountId, Integer msgId, java.util.List<Integer> contacts) throws RpcException {
transport.call("set_draft_vcard", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(contacts));
}
@@ -1245,7 +1245,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "get_webxdc_status_updates", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(lastKnownSerial));
}
/* Get info from a webxdc message */
/** Get info from a webxdc message */
public WebxdcMessageInfo getWebxdcInfo(Integer accountId, Integer instanceMsgId) throws RpcException {
return transport.callForResult(new TypeReference<WebxdcMessageInfo>(){}, "get_webxdc_info", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId));
}
@@ -1285,27 +1285,27 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "init_webxdc_integration", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
/* Starts an outgoing call. */
/** Starts an outgoing call. */
public Integer placeOutgoingCall(Integer accountId, Integer chatId, String placeCallInfo) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "place_outgoing_call", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(placeCallInfo));
}
/* Accepts an incoming call. */
/** Accepts an incoming call. */
public void acceptIncomingCall(Integer accountId, Integer msgId, String acceptCallInfo) throws RpcException {
transport.call("accept_incoming_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(acceptCallInfo));
}
/* Ends incoming or outgoing call. */
/** Ends incoming or outgoing call. */
public void endCall(Integer accountId, Integer msgId) throws RpcException {
transport.call("end_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
}
/* Returns information about the call. */
/** Returns information about the call. */
public CallInfo callInfo(Integer accountId, Integer msgId) throws RpcException {
return transport.callForResult(new TypeReference<CallInfo>(){}, "call_info", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
}
/* Returns JSON with ICE servers, to be used for WebRTC video calls. */
/** Returns JSON with ICE servers, to be used for WebRTC video calls. */
public String iceServers(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "ice_servers", mapper.valueToTree(accountId));
}
@@ -1331,6 +1331,14 @@ public class Rpc {
transport.call("forward_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds), mapper.valueToTree(chatId));
}
/**
* Forward messages to a chat in another account.
* See [`Self::forward_messages`] for more info.
*/
public void forwardMessagesToAccount(Integer srcAccountId, java.util.List<Integer> srcMessageIds, Integer dstAccountId, Integer dstChatId) throws RpcException {
transport.call("forward_messages_to_account", mapper.valueToTree(srcAccountId), mapper.valueToTree(srcMessageIds), mapper.valueToTree(dstAccountId), mapper.valueToTree(dstChatId));
}
/**
* Resend messages and make information available for newly added chat members.
* Resending sends out the original message, however, recipients and webxdc-status may differ.
@@ -1361,7 +1369,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "send_reaction", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(reaction));
}
/* Returns reactions to the message. */
/** Returns reactions to the message. */
public Reactions getMessageReactions(Integer accountId, Integer messageId) throws RpcException {
return transport.callForResult(new TypeReference<Reactions>(){}, "get_message_reactions", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
@@ -1374,7 +1382,7 @@ public class Rpc {
transport.call("send_edit_request", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(newText));
}
/* Checks if messages can be sent to a given chat. */
/** Checks if messages can be sent to a given chat. */
public Boolean canSend(Integer accountId, Integer chatId) throws RpcException {
return transport.callForResult(new TypeReference<Boolean>(){}, "can_send", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
@@ -1392,7 +1400,7 @@ public class Rpc {
transport.call("remove_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
/* Get draft for a chat, if any. */
/** Get draft for a chat, if any. */
public Message getDraft(Integer accountId, Integer chatId) throws RpcException {
return transport.callForResult(new TypeReference<Message>(){}, "get_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
@@ -1401,7 +1409,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "misc_get_sticker_folder", mapper.valueToTree(accountId));
}
/* Saves a sticker to a collection/folder in the account's sticker folder. */
/** Saves a sticker to a collection/folder in the account's sticker folder. */
public void miscSaveSticker(Integer accountId, Integer msgId, String collection) throws RpcException {
transport.call("misc_save_sticker", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(collection));
}
@@ -1414,7 +1422,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.Map<String, java.util.List<String>>>(){}, "misc_get_stickers", mapper.valueToTree(accountId));
}
/* Returns the messageid of the sent message */
/** Returns the messageid of the sent message */
public Integer miscSendTextMessage(Integer accountId, Integer chatId, String text) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "misc_send_text_message", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(text));
}
@@ -18,7 +18,7 @@ public abstract class Account {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String displayName;
public Integer id;
/* Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
/** Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String privateTag;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -2,7 +2,7 @@
package chat.delta.rpc.types;
public class CallInfo {
/* True if SDP offer has a video. */
/** True if SDP offer has a video. */
public Boolean hasVideo;
/**
* SDP offer.
@@ -19,21 +19,21 @@ public abstract class CallState {
public static class Alerting extends CallState {
}
/* Active call. */
/** Active call. */
public static class Active extends CallState {
}
/* Completed call that was once active and then was terminated for any reason. */
/** Completed call that was once active and then was terminated for any reason. */
public static class Completed extends CallState {
/* Call duration in seconds. */
/** Call duration in seconds. */
public Integer duration;
}
/* Incoming call that was not picked up within a timeout or was explicitly ended by the caller before we picked up. */
/** Incoming call that was not picked up within a timeout or was explicitly ended by the caller before we picked up. */
public static class Missed extends CallState {
}
/* Incoming call that was explicitly ended on our side before picking up or outgoing call that was declined before the timeout. */
/** Incoming call that was explicitly ended on our side before picking up or outgoing call that was declined before the timeout. */
public static class Declined extends CallState {
}
@@ -16,7 +16,7 @@ public abstract class ChatListItemFetchResult {
public String avatarPath;
public ChatType chatType;
public String color;
/* contact id if this is a dm chat (for view profile entry in context menu) */
/** contact id if this is a dm chat (for view profile entry in context menu) */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer dmChatContact;
public Integer freshMessageCounter;
@@ -36,7 +36,7 @@ public abstract class ChatListItemFetchResult {
* See also `is_key_contact` on `Contact`.
*/
public Boolean isEncrypted;
/* deprecated 2025-07, use chat_type instead */
/** deprecated 2025-07, use chat_type instead */
public Boolean isGroup;
public Boolean isMuted;
public Boolean isPinned;
@@ -50,7 +50,7 @@ public abstract class ChatListItemFetchResult {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer lastUpdated;
public String name;
/* showing preview if last chat message is image */
/** showing preview if last chat message is image */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summaryPreviewImage;
public Integer summaryStatus;
@@ -14,9 +14,9 @@ public class Contact {
public Boolean e2eeAvail;
public Integer id;
public Boolean isBlocked;
/* If the contact is a bot. */
/** If the contact is a bot. */
public Boolean isBot;
/* Is the contact a key contact. */
/** Is the contact a key contact. */
public Boolean isKeyContact;
/**
* True if the contact can be added to protected chats because SELF and contact have verified their fingerprints in both directions.
@@ -24,7 +24,7 @@ public class Contact {
* See [`Self::verifier_id`]/`Contact.verifierId` for a guidance how to display these information.
*/
public Boolean isVerified;
/* the contact's last seen timestamp */
/** the contact's last seen timestamp */
public Integer lastSeen;
public String name;
public String nameAndAddr;
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public enum EnteredCertificateChecks {
/* `Automatic` means that provider database setting should be taken. If there is no provider database setting for certificate checks, check certificates strictly. */
/** `Automatic` means that provider database setting should be taken. If there is no provider database setting for certificate checks, check certificates strictly. */
automatic,
/* Ensure that TLS certificate is valid for the server hostname. */
/** Ensure that TLS certificate is valid for the server hostname. */
strict,
/* Accept certificates that are expired, self-signed or otherwise not valid for the server hostname. */
/** Accept certificates that are expired, self-signed or otherwise not valid for the server hostname. */
acceptInvalidCertificates,
}
@@ -7,27 +7,27 @@ package chat.delta.rpc.types;
* Usually it will be enough to only set `addr` and `password`, and all the other settings will be autoconfigured.
*/
public class EnteredLoginParam {
/* Email address. */
/** Email address. */
public String addr;
/* TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
/** TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public EnteredCertificateChecks certificateChecks;
/* Imap server port. */
/** Imap server port. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer imapPort;
/* Imap socket security. */
/** Imap socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket imapSecurity;
/* Imap server hostname or IP address. */
/** Imap server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imapServer;
/* Imap username. */
/** Imap username. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imapUser;
/* If true, login via OAUTH2 (not recommended anymore). Default: false */
/** If true, login via OAUTH2 (not recommended anymore). Default: false */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Boolean oauth2;
/* Password. */
/** Password. */
public String password;
/**
* SMTP Password.
@@ -36,16 +36,16 @@ public class EnteredLoginParam {
*/
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpPassword;
/* SMTP server port. */
/** SMTP server port. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer smtpPort;
/* SMTP socket security. */
/** SMTP socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket smtpSecurity;
/* SMTP server hostname or IP address. */
/** SMTP server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpServer;
/* SMTP username. */
/** SMTP username. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpUser;
}
@@ -11,11 +11,11 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonSubTypes({@Type(value = EphemeralTimer.Disabled.class, name="Disabled"), @Type(value = EphemeralTimer.Enabled.class, name="Enabled")})
public abstract class EphemeralTimer {
/* Timer is disabled. */
/** Timer is disabled. */
public static class Disabled extends EphemeralTimer {
}
/* Timer is enabled. */
/** Timer is enabled. */
public static class Enabled extends EphemeralTimer {
/**
* Timer duration in seconds.
@@ -2,8 +2,8 @@
package chat.delta.rpc.types;
public class Event {
/* Account ID. */
/** Account ID. */
public Integer contextId;
/* Event payload. */
/** Event payload. */
public EventType event;
}
+102 -94
View File
@@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = EventType.Info.class, name="Info"), @Type(value = EventType.SmtpConnected.class, name="SmtpConnected"), @Type(value = EventType.ImapConnected.class, name="ImapConnected"), @Type(value = EventType.SmtpMessageSent.class, name="SmtpMessageSent"), @Type(value = EventType.ImapMessageDeleted.class, name="ImapMessageDeleted"), @Type(value = EventType.ImapMessageMoved.class, name="ImapMessageMoved"), @Type(value = EventType.ImapInboxIdle.class, name="ImapInboxIdle"), @Type(value = EventType.NewBlobFile.class, name="NewBlobFile"), @Type(value = EventType.DeletedBlobFile.class, name="DeletedBlobFile"), @Type(value = EventType.Warning.class, name="Warning"), @Type(value = EventType.Error.class, name="Error"), @Type(value = EventType.ErrorSelfNotInGroup.class, name="ErrorSelfNotInGroup"), @Type(value = EventType.MsgsChanged.class, name="MsgsChanged"), @Type(value = EventType.ReactionsChanged.class, name="ReactionsChanged"), @Type(value = EventType.IncomingReaction.class, name="IncomingReaction"), @Type(value = EventType.IncomingWebxdcNotify.class, name="IncomingWebxdcNotify"), @Type(value = EventType.IncomingMsg.class, name="IncomingMsg"), @Type(value = EventType.IncomingMsgBunch.class, name="IncomingMsgBunch"), @Type(value = EventType.MsgsNoticed.class, name="MsgsNoticed"), @Type(value = EventType.MsgDelivered.class, name="MsgDelivered"), @Type(value = EventType.MsgFailed.class, name="MsgFailed"), @Type(value = EventType.MsgRead.class, name="MsgRead"), @Type(value = EventType.MsgDeleted.class, name="MsgDeleted"), @Type(value = EventType.ChatModified.class, name="ChatModified"), @Type(value = EventType.ChatEphemeralTimerModified.class, name="ChatEphemeralTimerModified"), @Type(value = EventType.ChatDeleted.class, name="ChatDeleted"), @Type(value = EventType.ContactsChanged.class, name="ContactsChanged"), @Type(value = EventType.LocationChanged.class, name="LocationChanged"), @Type(value = EventType.ConfigureProgress.class, name="ConfigureProgress"), @Type(value = EventType.ImexProgress.class, name="ImexProgress"), @Type(value = EventType.ImexFileWritten.class, name="ImexFileWritten"), @Type(value = EventType.SecurejoinInviterProgress.class, name="SecurejoinInviterProgress"), @Type(value = EventType.SecurejoinJoinerProgress.class, name="SecurejoinJoinerProgress"), @Type(value = EventType.ConnectivityChanged.class, name="ConnectivityChanged"), @Type(value = EventType.SelfavatarChanged.class, name="SelfavatarChanged"), @Type(value = EventType.ConfigSynced.class, name="ConfigSynced"), @Type(value = EventType.WebxdcStatusUpdate.class, name="WebxdcStatusUpdate"), @Type(value = EventType.WebxdcRealtimeData.class, name="WebxdcRealtimeData"), @Type(value = EventType.WebxdcRealtimeAdvertisementReceived.class, name="WebxdcRealtimeAdvertisementReceived"), @Type(value = EventType.WebxdcInstanceDeleted.class, name="WebxdcInstanceDeleted"), @Type(value = EventType.AccountsBackgroundFetchDone.class, name="AccountsBackgroundFetchDone"), @Type(value = EventType.ChatlistChanged.class, name="ChatlistChanged"), @Type(value = EventType.ChatlistItemChanged.class, name="ChatlistItemChanged"), @Type(value = EventType.AccountsChanged.class, name="AccountsChanged"), @Type(value = EventType.AccountsItemChanged.class, name="AccountsItemChanged"), @Type(value = EventType.EventChannelOverflow.class, name="EventChannelOverflow"), @Type(value = EventType.IncomingCall.class, name="IncomingCall"), @Type(value = EventType.IncomingCallAccepted.class, name="IncomingCallAccepted"), @Type(value = EventType.OutgoingCallAccepted.class, name="OutgoingCallAccepted"), @Type(value = EventType.CallEnded.class, name="CallEnded")})
@JsonSubTypes({@Type(value = EventType.Info.class, name="Info"), @Type(value = EventType.SmtpConnected.class, name="SmtpConnected"), @Type(value = EventType.ImapConnected.class, name="ImapConnected"), @Type(value = EventType.SmtpMessageSent.class, name="SmtpMessageSent"), @Type(value = EventType.ImapMessageDeleted.class, name="ImapMessageDeleted"), @Type(value = EventType.ImapMessageMoved.class, name="ImapMessageMoved"), @Type(value = EventType.ImapInboxIdle.class, name="ImapInboxIdle"), @Type(value = EventType.NewBlobFile.class, name="NewBlobFile"), @Type(value = EventType.DeletedBlobFile.class, name="DeletedBlobFile"), @Type(value = EventType.Warning.class, name="Warning"), @Type(value = EventType.Error.class, name="Error"), @Type(value = EventType.ErrorSelfNotInGroup.class, name="ErrorSelfNotInGroup"), @Type(value = EventType.MsgsChanged.class, name="MsgsChanged"), @Type(value = EventType.ReactionsChanged.class, name="ReactionsChanged"), @Type(value = EventType.IncomingReaction.class, name="IncomingReaction"), @Type(value = EventType.IncomingWebxdcNotify.class, name="IncomingWebxdcNotify"), @Type(value = EventType.IncomingMsg.class, name="IncomingMsg"), @Type(value = EventType.IncomingMsgBunch.class, name="IncomingMsgBunch"), @Type(value = EventType.MsgsNoticed.class, name="MsgsNoticed"), @Type(value = EventType.MsgDelivered.class, name="MsgDelivered"), @Type(value = EventType.MsgFailed.class, name="MsgFailed"), @Type(value = EventType.MsgRead.class, name="MsgRead"), @Type(value = EventType.MsgDeleted.class, name="MsgDeleted"), @Type(value = EventType.ChatModified.class, name="ChatModified"), @Type(value = EventType.ChatEphemeralTimerModified.class, name="ChatEphemeralTimerModified"), @Type(value = EventType.ChatDeleted.class, name="ChatDeleted"), @Type(value = EventType.ContactsChanged.class, name="ContactsChanged"), @Type(value = EventType.LocationChanged.class, name="LocationChanged"), @Type(value = EventType.ConfigureProgress.class, name="ConfigureProgress"), @Type(value = EventType.ImexProgress.class, name="ImexProgress"), @Type(value = EventType.ImexFileWritten.class, name="ImexFileWritten"), @Type(value = EventType.SecurejoinInviterProgress.class, name="SecurejoinInviterProgress"), @Type(value = EventType.SecurejoinJoinerProgress.class, name="SecurejoinJoinerProgress"), @Type(value = EventType.ConnectivityChanged.class, name="ConnectivityChanged"), @Type(value = EventType.SelfavatarChanged.class, name="SelfavatarChanged"), @Type(value = EventType.ConfigSynced.class, name="ConfigSynced"), @Type(value = EventType.WebxdcStatusUpdate.class, name="WebxdcStatusUpdate"), @Type(value = EventType.WebxdcRealtimeData.class, name="WebxdcRealtimeData"), @Type(value = EventType.WebxdcRealtimeAdvertisementReceived.class, name="WebxdcRealtimeAdvertisementReceived"), @Type(value = EventType.WebxdcInstanceDeleted.class, name="WebxdcInstanceDeleted"), @Type(value = EventType.AccountsBackgroundFetchDone.class, name="AccountsBackgroundFetchDone"), @Type(value = EventType.ChatlistChanged.class, name="ChatlistChanged"), @Type(value = EventType.ChatlistItemChanged.class, name="ChatlistItemChanged"), @Type(value = EventType.AccountsChanged.class, name="AccountsChanged"), @Type(value = EventType.AccountsItemChanged.class, name="AccountsItemChanged"), @Type(value = EventType.EventChannelOverflow.class, name="EventChannelOverflow"), @Type(value = EventType.IncomingCall.class, name="IncomingCall"), @Type(value = EventType.IncomingCallAccepted.class, name="IncomingCallAccepted"), @Type(value = EventType.OutgoingCallAccepted.class, name="OutgoingCallAccepted"), @Type(value = EventType.CallEnded.class, name="CallEnded"), @Type(value = EventType.TransportsModified.class, name="TransportsModified")})
public abstract class EventType {
/**
@@ -20,41 +20,41 @@ public abstract class EventType {
public String msg;
}
/* Emitted when SMTP connection is established and login was successful. */
/** Emitted when SMTP connection is established and login was successful. */
public static class SmtpConnected extends EventType {
public String msg;
}
/* Emitted when IMAP connection is established and login was successful. */
/** Emitted when IMAP connection is established and login was successful. */
public static class ImapConnected extends EventType {
public String msg;
}
/* Emitted when a message was successfully sent to the SMTP server. */
/** Emitted when a message was successfully sent to the SMTP server. */
public static class SmtpMessageSent extends EventType {
public String msg;
}
/* Emitted when an IMAP message has been marked as deleted */
/** Emitted when an IMAP message has been marked as deleted */
public static class ImapMessageDeleted extends EventType {
public String msg;
}
/* Emitted when an IMAP message has been moved */
/** Emitted when an IMAP message has been moved */
public static class ImapMessageMoved extends EventType {
public String msg;
}
/* Emitted before going into IDLE on the Inbox folder. */
/** Emitted before going into IDLE on the Inbox folder. */
public static class ImapInboxIdle extends EventType {
}
/* Emitted when an new file in the $BLOBDIR was created */
/** Emitted when an new file in the $BLOBDIR was created */
public static class NewBlobFile extends EventType {
public String file;
}
/* Emitted when an file in the $BLOBDIR was deleted */
/** Emitted when an file in the $BLOBDIR was deleted */
public static class DeletedBlobFile extends EventType {
public String file;
}
@@ -79,26 +79,26 @@ public abstract class EventType {
public String msg;
}
/* An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
/** An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
public static class ErrorSelfNotInGroup extends EventType {
public String msg;
}
/* Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
/** Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
public static class MsgsChanged extends EventType {
/* Set if only a single chat is affected by the changes, otherwise 0. */
/** Set if only a single chat is affected by the changes, otherwise 0. */
public Integer chatId;
/* Set if only a single message is affected by the changes, otherwise 0. */
/** Set if only a single message is affected by the changes, otherwise 0. */
public Integer msgId;
}
/* Reactions for the message changed. */
/** Reactions for the message changed. */
public static class ReactionsChanged extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the contact whose reaction set is changed. */
/** ID of the contact whose reaction set is changed. */
public Integer contactId;
/* ID of the message for which reactions were changed. */
/** ID of the message for which reactions were changed. */
public Integer msgId;
}
@@ -108,28 +108,28 @@ public abstract class EventType {
* In addition to this event, ReactionsChanged is emitted.
*/
public static class IncomingReaction extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the contact whose reaction set is changed. */
/** ID of the contact whose reaction set is changed. */
public Integer contactId;
/* ID of the message for which reactions were changed. */
/** ID of the message for which reactions were changed. */
public Integer msgId;
/* The reaction. */
/** The reaction. */
public String reaction;
}
/* Incoming webxdc info or summary update, should be notified. */
/** Incoming webxdc info or summary update, should be notified. */
public static class IncomingWebxdcNotify extends EventType {
/* ID of the chat. */
/** ID of the chat. */
public Integer chatId;
/* ID of the contact sending. */
/** ID of the contact sending. */
public Integer contactId;
/* Link assigned to this notification, if any. */
/** Link assigned to this notification, if any. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String href;
/* ID of the added info message or webxdc instance in case of summary change. */
/** ID of the added info message or webxdc instance in case of summary change. */
public Integer msgId;
/* Text to notify. */
/** Text to notify. */
public String text;
}
@@ -139,42 +139,42 @@ public abstract class EventType {
* There is no extra #DC_EVENT_MSGS_CHANGED event sent together with this event.
*/
public static class IncomingMsg extends EventType {
/* ID of the chat where the message is assigned. */
/** ID of the chat where the message is assigned. */
public Integer chatId;
/* ID of the message. */
/** ID of the message. */
public Integer msgId;
}
/* Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
/** Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
public static class IncomingMsgBunch extends EventType {
}
/* Messages were seen or noticed. chat id is always set. */
/** Messages were seen or noticed. chat id is always set. */
public static class MsgsNoticed extends EventType {
public Integer chatId;
}
/* A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
/** A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
public static class MsgDelivered extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the message that was successfully sent. */
/** ID of the message that was successfully sent. */
public Integer msgId;
}
/* A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
/** A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
public static class MsgFailed extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the message that could not be sent. */
/** ID of the message that could not be sent. */
public Integer msgId;
}
/* A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
/** A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
public static class MsgRead extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the message that was read. */
/** ID of the message that was read. */
public Integer msgId;
}
@@ -188,9 +188,9 @@ public abstract class EventType {
* This event does not indicate the message deletion from the server.
*/
public static class MsgDeleted extends EventType {
/* ID of the chat where the message was prior to deletion. Never 0. */
/** ID of the chat where the message was prior to deletion. Never 0. */
public Integer chatId;
/* ID of the deleted message. Never 0. */
/** ID of the deleted message. Never 0. */
public Integer msgId;
}
@@ -203,37 +203,37 @@ public abstract class EventType {
public Integer chatId;
}
/* Chat ephemeral timer changed. */
/** Chat ephemeral timer changed. */
public static class ChatEphemeralTimerModified extends EventType {
/* Chat ID. */
/** Chat ID. */
public Integer chatId;
/* New ephemeral timer value. */
/** New ephemeral timer value. */
public Integer timer;
}
/* Chat deleted. */
/** Chat deleted. */
public static class ChatDeleted extends EventType {
/* Chat ID. */
/** Chat ID. */
public Integer chat_id;
}
/* Contact(s) created, renamed, blocked or deleted. */
/** Contact(s) created, renamed, blocked or deleted. */
public static class ContactsChanged extends EventType {
/* If set, this is the contact_id of an added contact that should be selected. */
/** If set, this is the contact_id of an added contact that should be selected. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contactId;
}
/* Location of one or more contact has changed. */
/** Location of one or more contact has changed. */
public static class LocationChanged extends EventType {
/* contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
/** contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contactId;
}
/* Inform about the configuration progress started by configure(). */
/** Inform about the configuration progress started by configure(). */
public static class ConfigureProgress extends EventType {
/* Progress comment or error, something to display to the user. */
/** Progress comment or error, something to display to the user. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String comment;
/**
@@ -244,9 +244,9 @@ public abstract class EventType {
public Integer progress;
}
/* Inform about the import/export progress started by imex(). */
/** Inform about the import/export progress started by imex(). */
public static class ImexProgress extends EventType {
/* 0=error, 1-999=progress in permille, 1000=success and done */
/** 0=error, 1-999=progress in permille, 1000=success and done */
public Integer progress;
}
@@ -267,62 +267,62 @@ public abstract class EventType {
* These events are typically sent after a joiner has scanned the QR code generated by getChatSecurejoinQrCodeSvg().
*/
public static class SecurejoinInviterProgress extends EventType {
/* ID of the chat in case of success. */
/** ID of the chat in case of success. */
public Integer chatId;
/* The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
/** The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
public ChatType chatType;
/* ID of the contact that wants to join. */
/** ID of the contact that wants to join. */
public Integer contactId;
/* Progress, always 1000. */
/** Progress, always 1000. */
public Integer progress;
}
/* Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
/** Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
public static class SecurejoinJoinerProgress extends EventType {
/* ID of the inviting contact. */
/** ID of the inviting contact. */
public Integer contactId;
/* Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
/** Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
public Integer progress;
}
/* The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
/** The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
public static class ConnectivityChanged extends EventType {
}
/* Deprecated by `ConfigSynced`. */
/** Deprecated by `ConfigSynced`. */
public static class SelfavatarChanged extends EventType {
}
/* A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
/** A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
public static class ConfigSynced extends EventType {
/* Configuration key. */
/** Configuration key. */
public String key;
}
public static class WebxdcStatusUpdate extends EventType {
/* Message ID. */
/** Message ID. */
public Integer msgId;
/* Status update ID. */
/** Status update ID. */
public Integer statusUpdateSerial;
}
/* Data received over an ephemeral peer channel. */
/** Data received over an ephemeral peer channel. */
public static class WebxdcRealtimeData extends EventType {
/* Realtime data. */
/** Realtime data. */
public java.util.List<Integer> data;
/* Message ID. */
/** Message ID. */
public Integer msgId;
}
/* Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
/** Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
public static class WebxdcRealtimeAdvertisementReceived extends EventType {
/* Message ID of the webxdc instance. */
/** Message ID of the webxdc instance. */
public Integer msgId;
}
/* Inform that a message containing a webxdc instance has been deleted */
/** Inform that a message containing a webxdc instance has been deleted */
public static class WebxdcInstanceDeleted extends EventType {
/* ID of the deleted message. */
/** ID of the deleted message. */
public Integer msgId;
}
@@ -342,9 +342,9 @@ public abstract class EventType {
public static class ChatlistChanged extends EventType {
}
/* Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
/** Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
public static class ChatlistItemChanged extends EventType {
/* ID of the changed chat */
/** ID of the changed chat */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer chatId;
}
@@ -365,48 +365,56 @@ public abstract class EventType {
public static class AccountsItemChanged extends EventType {
}
/* Inform than some events have been skipped due to event channel overflow. */
/** Inform than some events have been skipped due to event channel overflow. */
public static class EventChannelOverflow extends EventType {
/* Number of events skipped. */
/** Number of events skipped. */
public Integer n;
}
/* Incoming call. */
/** Incoming call. */
public static class IncomingCall extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* True if incoming call is a video call. */
/** True if incoming call is a video call. */
public Boolean has_video;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
/* User-defined info as passed to place_outgoing_call() */
/** User-defined info as passed to place_outgoing_call() */
public String place_call_info;
}
/* Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
/** Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
public static class IncomingCallAccepted extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/* Outgoing call accepted. */
/** Outgoing call accepted. */
public static class OutgoingCallAccepted extends EventType {
/* User-defined info passed to dc_accept_incoming_call( */
/** User-defined info passed to dc_accept_incoming_call( */
public String accept_call_info;
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/* Call ended. */
/** Call ended. */
public static class CallEnded extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/**
* One or more transports has changed.
* <p>
* This event is used for tests to detect when transport synchronization messages arrives. UIs don't need to use it, it is unlikely that user modifies transports on multiple devices simultaneously.
*/
public static class TransportsModified extends EventType {
}
}
@@ -31,12 +31,12 @@ public class FullChat {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String mailingListAddress;
public String name;
/* Contact IDs of the past chat members. */
/** Contact IDs of the past chat members. */
public java.util.List<Integer> pastContactIds;
public Boolean pinned;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
/* Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
/** Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
public Boolean selfInGroup;
public Boolean wasSeenRecently;
}
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public class HttpResponse {
/* base64-encoded response body. */
/** base64-encoded response body. */
public String blob;
/* Encoding, e.g. "utf-8". */
/** Encoding, e.g. "utf-8". */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String encoding;
/* MIME type, e.g. "text/plain" or "text/html". */
/** MIME type, e.g. "text/plain" or "text/html". */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String mimetype;
}
@@ -7,7 +7,7 @@ public class Message {
public Integer dimensionsWidth;
public DownloadState downloadState;
public Integer duration;
/* An error text, if there is one. */
/** An error text, if there is one. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String error;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -20,13 +20,13 @@ public class Message {
public Integer fromId;
public Boolean hasDeviatingTimestamp;
public Boolean hasHtml;
/* Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
public Boolean hasLocation;
public Integer id;
/* if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer infoContactId;
/* True if the message was sent by a bot. */
/** True if the message was sent by a bot. */
public Boolean isBot;
public Boolean isEdited;
public Boolean isForwarded;
@@ -57,7 +57,7 @@ public class Message {
public Integer sortTimestamp;
public Integer state;
public String subject;
/* when is_info is true this describes what type of system message it is */
/** when is_info is true this describes what type of system message it is */
public SystemMessageType systemMessageType;
public String text;
public Integer timestamp;
@@ -12,7 +12,7 @@ public class MessageData {
public Pair<Float, Float> location;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String overrideSenderName;
/* Quoted message id. Takes preference over `quoted_text` (see below). */
/** Quoted message id. Takes preference over `quoted_text` (see below). */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer quotedMessageId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -3,7 +3,7 @@ package chat.delta.rpc.types;
public class MessageInfo {
public EphemeralTimer ephemeralTimer;
/* When message is ephemeral this contains the timestamp of the message expiry */
/** When message is ephemeral this contains the timestamp of the message expiry */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer ephemeralTimestamp;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -15,9 +15,9 @@ public abstract class MessageListItem {
public Integer msg_id;
}
/* Day marker, separating messages that correspond to different days according to local time. */
/** Day marker, separating messages that correspond to different days according to local time. */
public static class DayMarker extends MessageListItem {
/* Marker timestamp, for day markers, in unix milliseconds */
/** Marker timestamp, for day markers, in unix milliseconds */
public Integer timestamp;
}
@@ -17,7 +17,7 @@ public abstract class MessageLoadResult {
public Integer dimensionsWidth;
public DownloadState downloadState;
public Integer duration;
/* An error text, if there is one. */
/** An error text, if there is one. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String error;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -30,13 +30,13 @@ public abstract class MessageLoadResult {
public Integer fromId;
public Boolean hasDeviatingTimestamp;
public Boolean hasHtml;
/* Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
public Boolean hasLocation;
public Integer id;
/* if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer infoContactId;
/* True if the message was sent by a bot. */
/** True if the message was sent by a bot. */
public Boolean isBot;
public Boolean isEdited;
public Boolean isForwarded;
@@ -67,7 +67,7 @@ public abstract class MessageLoadResult {
public Integer sortTimestamp;
public Integer state;
public String subject;
/* when is_info is true this describes what type of system message it is */
/** when is_info is true this describes what type of system message it is */
public SystemMessageType systemMessageType;
public String text;
public Integer timestamp;
@@ -12,9 +12,9 @@ public class MessageNotificationInfo {
public String image;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imageMimeType;
/* also known as summary_text1 */
/** also known as summary_text1 */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summaryPrefix;
/* also known as summary_text2 */
/** also known as summary_text2 */
public String summaryText;
}
@@ -18,7 +18,7 @@ public abstract class MessageQuote {
public static class WithMessage extends MessageQuote {
public String authorDisplayColor;
public String authorDisplayName;
/* The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
/** The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
public Integer chatId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String image;
@@ -4,7 +4,7 @@ package chat.delta.rpc.types;
public class MessageSearchResult {
public String authorColor;
public Integer authorId;
/* if sender name if overridden it will show it as ~alias */
/** if sender name if overridden it will show it as ~alias */
public String authorName;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String authorProfileImage;
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public enum NotifyState {
/* Not subscribed to push notifications. */
/** Not subscribed to push notifications. */
NotConnected,
/* Subscribed to heartbeat push notifications. */
/** Subscribed to heartbeat push notifications. */
Heartbeat,
/* Subscribed to push notifications for new messages. */
/** Subscribed to push notifications for new messages. */
Connected,
}
@@ -3,7 +3,7 @@ package chat.delta.rpc.types;
public class ProviderInfo {
public String beforeLoginHint;
/* Unique ID, corresponding to provider database filename. */
/** Unique ID, corresponding to provider database filename. */
public String id;
public String overviewPage;
public Integer status;
+71 -71
View File
@@ -17,45 +17,45 @@ public abstract class Qr {
* If the user agrees, pass this QR code to [`crate::securejoin::join_securejoin`].
*/
public static class AskVerifyContact extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* ID of the contact. */
/** ID of the contact. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user whether to join the group. */
/** Ask the user whether to join the group. */
public static class AskVerifyGroup extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* ID of the contact. */
/** ID of the contact. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Group ID. */
/** Group ID. */
public String grpid;
/* Group name. */
/** Group name. */
public String grpname;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user whether to join the broadcast channel. */
/** Ask the user whether to join the broadcast channel. */
public static class AskJoinBroadcast extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* ID of the contact who owns the broadcast channel and created the QR code. */
/** ID of the contact who owns the broadcast channel and created the QR code. */
public Integer contact_id;
/* Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
/** Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
public String fingerprint;
/* A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
/** A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
public String grpid;
/* Invite number. */
/** Invite number. */
public String invitenumber;
/* The user-visible name of this broadcast channel */
/** The user-visible name of this broadcast channel */
public String name;
}
@@ -65,41 +65,41 @@ public abstract class Qr {
* Ask the user if they want to start chatting.
*/
public static class FprOk extends Qr {
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
}
/* Scanned fingerprint does not match the last seen fingerprint. */
/** Scanned fingerprint does not match the last seen fingerprint. */
public static class FprMismatch extends Qr {
/* Contact ID. */
/** Contact ID. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contact_id;
}
/* The scanned QR code contains a fingerprint but no e-mail address. */
/** The scanned QR code contains a fingerprint but no e-mail address. */
public static class FprWithoutAddr extends Qr {
/* Key fingerprint. */
/** Key fingerprint. */
public String fingerprint;
}
/* Ask the user if they want to create an account on the given domain. */
/** Ask the user if they want to create an account on the given domain. */
public static class Account extends Qr {
/* Server domain name. */
/** Server domain name. */
public String domain;
}
/* Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
/** Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
public static class Backup2 extends Qr {
/* Authentication token. */
/** Authentication token. */
public String auth_token;
/* Iroh node address. */
/** Iroh node address. */
public String node_addr;
}
public static class BackupTooNew extends Qr {
}
/* Ask the user if they want to use the given service for video chats. */
/** Ask the user if they want to use the given service for video chats. */
public static class WebrtcInstance extends Qr {
public String domain;
public String instance_pattern;
@@ -111,9 +111,9 @@ public abstract class Qr {
* Note that HTTP(S) URLs without a path and query parameters are treated as HTTP(S) proxy URL. UI may want to still offer to open the URL in the browser if QR code contents starts with `http://` or `https://` and the QR code was not scanned from the proxy configuration screen.
*/
public static class Proxy extends Qr {
/* Host extracted from the URL to display in the UI. */
/** Host extracted from the URL to display in the UI. */
public String host;
/* Port extracted from the URL to display in the UI. */
/** Port extracted from the URL to display in the UI. */
public Integer port;
/**
* Proxy URL.
@@ -129,9 +129,9 @@ public abstract class Qr {
* Optionally, a draft message could be provided. Ask the user if they want to start chatting.
*/
public static class Addr extends Qr {
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Draft message. */
/** Draft message. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String draft;
}
@@ -154,91 +154,91 @@ public abstract class Qr {
public String text;
}
/* Ask the user if they want to withdraw their own QR code. */
/** Ask the user if they want to withdraw their own QR code. */
public static class WithdrawVerifyContact extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to withdraw their own group invite QR code. */
/** Ask the user if they want to withdraw their own group invite QR code. */
public static class WithdrawVerifyGroup extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Group ID. */
/** Group ID. */
public String grpid;
/* Group name. */
/** Group name. */
public String grpname;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to withdraw their own broadcast channel invite QR code. */
/** Ask the user if they want to withdraw their own broadcast channel invite QR code. */
public static class WithdrawJoinBroadcast extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. Always `ContactId::SELF`. */
/** Contact ID. Always `ContactId::SELF`. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* ID, uniquely identifying this chat. Called grpid for historic reasons. */
/** ID, uniquely identifying this chat. Called grpid for historic reasons. */
public String grpid;
/* Invite number. */
/** Invite number. */
public String invitenumber;
/* Broadcast name. */
/** Broadcast name. */
public String name;
}
/* Ask the user if they want to revive their own QR code. */
/** Ask the user if they want to revive their own QR code. */
public static class ReviveVerifyContact extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to revive their own group invite QR code. */
/** Ask the user if they want to revive their own group invite QR code. */
public static class ReviveVerifyGroup extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Group ID. */
/** Group ID. */
public String grpid;
/* Contact ID. */
/** Contact ID. */
public String grpname;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to revive their own broadcast channel invite QR code. */
/** Ask the user if they want to revive their own broadcast channel invite QR code. */
public static class ReviveJoinBroadcast extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. Always `ContactId::SELF`. */
/** Contact ID. Always `ContactId::SELF`. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Globally unique chat ID. Called grpid for historic reasons. */
/** Globally unique chat ID. Called grpid for historic reasons. */
public String grpid;
/* Invite number. */
/** Invite number. */
public String invitenumber;
/* Broadcast name. */
/** Broadcast name. */
public String name;
}
@@ -1,12 +1,12 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* A single reaction emoji. */
/** A single reaction emoji. */
public class Reaction {
/* Emoji frequency. */
/** Emoji frequency. */
public Integer count;
/* Emoji. */
/** Emoji. */
public String emoji;
/* True if we reacted with this emoji. */
/** True if we reacted with this emoji. */
public Boolean isFromSelf;
}
@@ -1,10 +1,10 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* Structure representing all reactions to a particular message. */
/** Structure representing all reactions to a particular message. */
public class Reactions {
/* Unique reactions and their count, sorted in descending order. */
/** Unique reactions and their count, sorted in descending order. */
public java.util.List<Reaction> reactions;
/* Map from a contact to it's reaction to message. */
/** Map from a contact to it's reaction to message. */
public java.util.Map<String, java.util.List<String>> reactionsByContact;
}
@@ -2,21 +2,21 @@
package chat.delta.rpc.types;
public enum SecurejoinSource {
/* Because of some problem, it is unknown where the QR code came from. */
/** Because of some problem, it is unknown where the QR code came from. */
Unknown,
/* The user opened a link somewhere outside Delta Chat */
/** The user opened a link somewhere outside Delta Chat */
ExternalLink,
/* The user clicked on a link in a message inside Delta Chat */
/** The user clicked on a link in a message inside Delta Chat */
InternalLink,
/* The user clicked "Paste from Clipboard" in the QR scan activity */
/** The user clicked "Paste from Clipboard" in the QR scan activity */
Clipboard,
/* The user clicked "Load QR code as image" in the QR scan activity */
/** The user clicked "Load QR code as image" in the QR scan activity */
ImageLoaded,
/* The user scanned a QR code */
/** The user scanned a QR code */
Scan,
}
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public enum SecurejoinUiPath {
/* The UI path is unknown, or the user didn't open the QR code screen at all. */
/** The UI path is unknown, or the user didn't open the QR code screen at all. */
Unknown,
/* The user directly clicked on the QR icon in the main screen */
/** The user directly clicked on the QR icon in the main screen */
QrIcon,
/* The user first clicked on the `+` button in the main screen, and then on "New Contact" */
/** The user first clicked on the `+` button in the main screen, and then on "New Contact" */
NewContact,
}
@@ -2,15 +2,15 @@
package chat.delta.rpc.types;
public enum Socket {
/* Unspecified socket security, select automatically. */
/** Unspecified socket security, select automatically. */
automatic,
/* TLS connection. */
/** TLS connection. */
ssl,
/* STARTTLS connection. */
/** STARTTLS connection. */
starttls,
/* No TLS, plaintext connection. */
/** No TLS, plaintext connection. */
plain,
}
@@ -19,21 +19,21 @@ public enum SystemMessageType {
CallAccepted,
CallEnded,
/* 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
/** 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
SecurejoinWait,
/* 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
/** 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
SecurejoinWaitTimeout,
/* Chat ephemeral message timer is changed. */
/** Chat ephemeral message timer is changed. */
EphemeralTimerChanged,
/* Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
/** Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
MultiDeviceSync,
/* Webxdc info added with `info` set in `send_webxdc_status_update()`. */
/** Webxdc info added with `info` set in `send_webxdc_status_update()`. */
WebxdcInfoMessage,
/* This message contains a users iroh node address. */
/** This message contains a users iroh node address. */
IrohNodeAddr,
}
@@ -2,19 +2,19 @@
package chat.delta.rpc.types;
public class VcardContact {
/* Email address. */
/** Email address. */
public String addr;
/* Contact color as hex string. */
/** Contact color as hex string. */
public String color;
/* The contact's name, or the email address if no name was given. */
/** The contact's name, or the email address if no name was given. */
public String displayName;
/* Public PGP key in Base64. */
/** Public PGP key in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String key;
/* Profile image in Base64. */
/** Profile image in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
/* Last update timestamp. */
/** Last update timestamp. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer timestamp;
}
@@ -4,13 +4,13 @@ package chat.delta.rpc.types;
public enum Viewtype {
Unknown,
/* Text message. */
/** Text message. */
Text,
/* Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
/** Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
Image,
/* Animated GIF message. */
/** Animated GIF message. */
Gif,
/**
@@ -20,24 +20,24 @@ public enum Viewtype {
*/
Sticker,
/* Message containing an Audio file. */
/** Message containing an Audio file. */
Audio,
/* A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
/** A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
Voice,
/* Video messages. */
/** Video messages. */
Video,
/* Message containing any file, eg. a PDF. */
/** Message containing any file, eg. a PDF. */
File,
/* Message is a call. */
/** Message is a call. */
Call,
/* Message is an webxdc instance. */
/** Message is an webxdc instance. */
Webxdc,
/* Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
/** Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
Vcard,
}
@@ -2,7 +2,7 @@
package chat.delta.rpc.types;
public class WebxdcMessageInfo {
/* if the Webxdc represents a document, then this is the name of the document */
/** if the Webxdc represents a document, then this is the name of the document */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String document;
/**
@@ -13,7 +13,7 @@ public class WebxdcMessageInfo {
* App icons should should be square, the implementations will add round corners etc. as needed.
*/
public String icon;
/* True if full internet access should be granted to the app. */
/** True if full internet access should be granted to the app. */
public Boolean internetAccess;
/**
* The name of the app.
@@ -21,16 +21,16 @@ public class WebxdcMessageInfo {
* Defaults to the filename if not set in the manifest.
*/
public String name;
/* Address to be used for `window.webxdc.selfAddr` in JS land. */
/** Address to be used for `window.webxdc.selfAddr` in JS land. */
public String selfAddr;
/* Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
/** Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
public Integer sendUpdateInterval;
/* Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
/** Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
public Integer sendUpdateMaxSize;
/* URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
/** URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String sourceCodeUrl;
/* short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
/** short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summary;
}
@@ -35,6 +35,7 @@ public class DcContext {
public final static int DC_EVENT_INCOMING_CALL_ACCEPTED = 2560;
public final static int DC_EVENT_OUTGOING_CALL_ACCEPTED = 2570;
public final static int DC_EVENT_CALL_ENDED = 2580;
public final static int DC_EVENT_TRANSPORTS_MODIFIED = 2600;
public final static int DC_IMEX_EXPORT_SELF_KEYS = 1;
public final static int DC_IMEX_IMPORT_SELF_KEYS = 2;
@@ -70,8 +70,6 @@ public class AllMediaDocumentsFragment
this.noMedia = ViewUtil.findById(view, R.id.no_documents);
this.gridManager = new StickyHeaderGridLayoutManager(1);
// allow content to be drawn behind the navigation bar
recyclerView.setClipToPadding(false);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
@@ -66,8 +66,6 @@ public class AllMediaGalleryFragment
this.noMedia = ViewUtil.findById(view, R.id.no_images);
this.gridManager = new StickyHeaderGridLayoutManager(getCols());
// allow content to be drawn behind the navigation bar
recyclerView.setClipToPadding(false);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
@@ -57,13 +57,16 @@ import chat.delta.rpc.RpcException;
public class ApplicationContext extends MultiDexApplication {
private static final String TAG = ApplicationContext.class.getSimpleName();
private static final Object initLock = new Object();
private static volatile boolean isInitialized = false;
public static DcAccounts dcAccounts;
public Rpc rpc;
public DcContext dcContext;
public DcLocationManager dcLocationManager;
public DcEventCenter eventCenter;
public NotificationCenter notificationCenter;
private static DcAccounts dcAccounts;
private Rpc rpc;
private DcContext dcContext;
private DcLocationManager dcLocationManager;
private DcEventCenter eventCenter;
private NotificationCenter notificationCenter;
private JobManager jobManager;
private int debugOnAvailableCount;
@@ -75,6 +78,84 @@ public class ApplicationContext extends MultiDexApplication {
return (ApplicationContext)context.getApplicationContext();
}
private static void ensureInitialized() {
synchronized (initLock) {
while (!isInitialized) {
try {
initLock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("Interrupted while waiting for initialization", e);
}
}
}
}
/**
* Get DcAccounts instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public static DcAccounts getDcAccounts() {
ensureInitialized();
return dcAccounts;
}
/**
* Get Rpc instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public Rpc getRpc() {
ensureInitialized();
return rpc;
}
/**
* Get DcContext instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public DcContext getDcContext() {
ensureInitialized();
return dcContext;
}
/**
* Set DcContext instance. This should only be called by AccountManager when switching accounts,
* which only happens after initial initialization is complete.
* This method is thread-safe but does NOT trigger initialization or notify waiting threads.
*/
public void setDcContext(DcContext dcContext) {
synchronized (initLock) {
this.dcContext = dcContext;
}
}
/**
* Get DcLocationManager instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public DcLocationManager getLocationManager() {
ensureInitialized();
return dcLocationManager;
}
/**
* Get DcEventCenter instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public DcEventCenter getEventCenter() {
ensureInitialized();
return eventCenter;
}
/**
* Get NotificationCenter instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public NotificationCenter getNotificationCenter() {
ensureInitialized();
return notificationCenter;
}
@Override
public void onCreate() {
super.onCreate();
@@ -110,62 +191,91 @@ public class ApplicationContext extends MultiDexApplication {
System.loadLibrary("native-utils");
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
AccountManager.getInstance().migrateToDcAccounts(this);
// Initialize DcAccounts in background to avoid ANR during SQL migrations
Util.runOnBackground(() -> {
synchronized (initLock) {
try {
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
Log.i(TAG, "DcAccounts created");
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
Log.i(TAG, "Rpc created");
AccountManager.getInstance().migrateToDcAccounts(this);
int[] allAccounts = dcAccounts.getAll();
Log.i(TAG, "Number of profiles: " + allAccounts.length);
for (int accountId : allAccounts) {
DcContext ac = dcAccounts.getAccount(accountId);
if (!ac.isOpen()) {
try {
DatabaseSecret secret = DatabaseSecretProvider.getOrCreateDatabaseSecret(this, accountId);
boolean res = ac.open(secret.asString());
if (res) Log.i(TAG, "Successfully opened account " + accountId + ", path: " + ac.getBlobdir());
else Log.e(TAG, "Error opening account " + accountId + ", path: " + ac.getBlobdir());
} catch (Exception e) {
Log.e(TAG, "Failed to open account " + accountId + ", path: " + ac.getBlobdir() + ": " + e);
e.printStackTrace();
}
}
// 2025-12-16: The setting was removed.
// Revert it to the default if it was changed in the past.
ac.setConfigInt("webxdc_realtime_enabled", 1);
// 2025-11-12: this is needed until core starts ignoring "delete_server_after" for chatmail
if (ac.isChatmail()) {
ac.setConfig("delete_server_after", null); // reset
}
}
if (allAccounts.length == 0) {
try {
rpc.addAccount();
} catch (RpcException e) {
e.printStackTrace();
}
}
dcContext = dcAccounts.getSelectedAccount();
notificationCenter = new NotificationCenter(this);
eventCenter = new DcEventCenter(this);
dcLocationManager = new DcLocationManager(this, dcContext);
// Mark as initialized before starting threads that depend on it
isInitialized = true;
initLock.notifyAll();
Log.i(TAG, "DcAccounts initialization complete");
new Thread(() -> {
Log.i(TAG, "Starting event loop");
DcEventEmitter emitter = dcAccounts.getEventEmitter();
Log.i(TAG, "DcEventEmitter obtained");
while (true) {
DcEvent event = emitter.getNextEvent();
if (event==null) {
break;
}
eventCenter.handleEvent(event);
}
Log.i("DeltaChat", "shutting down event handler");
}, "eventThread").start();
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
DcHelper.setStockTranslations(this);
dcAccounts.startIo();
} catch (Exception e) {
Log.e(TAG, "Fatal error during DcAccounts initialization", e);
// Mark as initialized even on error to avoid deadlock
isInitialized = true;
initLock.notifyAll();
throw new RuntimeException("Failed to initialize DcAccounts", e);
}
}
});
// October-2025 migration: delete deprecated "permanent channel" id
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.deleteNotificationChannel("dc_foreground_notification_ch");
// end October-2025 migration
int[] allAccounts = dcAccounts.getAll();
for (int accountId : allAccounts) {
DcContext ac = dcAccounts.getAccount(accountId);
if (!ac.isOpen()) {
try {
DatabaseSecret secret = DatabaseSecretProvider.getOrCreateDatabaseSecret(this, accountId);
boolean res = ac.open(secret.asString());
if (res) Log.i(TAG, "Successfully opened account " + accountId + ", path: " + ac.getBlobdir());
else Log.e(TAG, "Error opening account " + accountId + ", path: " + ac.getBlobdir());
} catch (Exception e) {
Log.e(TAG, "Failed to open account " + accountId + ", path: " + ac.getBlobdir() + ": " + e);
e.printStackTrace();
}
}
// 2025.11.12: this is needed until core starts ignoring "delete_server_after" for chatmail
if (ac.isChatmail()) {
ac.setConfig("delete_server_after", null); // reset
}
}
if (allAccounts.length == 0) {
try {
rpc.addAccount();
} catch (RpcException e) {
e.printStackTrace();
}
}
dcContext = dcAccounts.getSelectedAccount();
notificationCenter = new NotificationCenter(this);
eventCenter = new DcEventCenter(this);
new Thread(() -> {
DcEventEmitter emitter = dcAccounts.getEventEmitter();
while (true) {
DcEvent event = emitter.getNextEvent();
if (event==null) {
break;
}
eventCenter.handleEvent(event);
}
Log.i("DeltaChat", "shutting down event handler");
}, "eventThread").start();
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
DcHelper.setStockTranslations(this);
dcAccounts.startIo();
new ForegroundDetector(ApplicationContext.getInstance(this));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -175,7 +285,7 @@ public class ApplicationContext extends MultiDexApplication {
@Override
public void onAvailable(@NonNull android.net.Network network) {
Log.i("DeltaChat", "++++++++++++++++++ NetworkCallback.onAvailable() #" + debugOnAvailableCount++);
dcAccounts.maybeNetwork();
getDcAccounts().maybeNetwork();
}
@Override
@@ -204,7 +314,6 @@ public class ApplicationContext extends MultiDexApplication {
initializeJobManager();
InChatSounds.getInstance(this);
dcLocationManager = new DcLocationManager(this);
DynamicTheme.setDefaultDayNightMode(this);
IntentFilter filter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
@@ -253,6 +362,8 @@ public class ApplicationContext extends MultiDexApplication {
"WebxdcGarbageCollectionWorker",
ExistingPeriodicWorkPolicy.KEEP,
webxdcGarbageCollectionRequest);
Log.i("DeltaChat", "+++++++++++ ApplicationContext.onCreate() finished ++++++++++");
}
public JobManager getJobManager() {
@@ -37,8 +37,8 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
onPreCreate();
super.onCreate(savedInstanceState);
// Only enable Edge-to-Edge on API 30+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// Only enable Edge-to-Edge if it is well supported
if (ViewUtil.isEdgeToEdgeSupported()) {
// docs says to use: WindowCompat.enableEdgeToEdge(getWindow());
// but it actually makes things worse, the next takes care of setting the 3-buttons navigation bar background
EdgeToEdge.enable(this);
@@ -1,10 +1,10 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedText;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedUris;
import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedText;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedUris;
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -36,7 +36,7 @@ import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionB
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.connect.DirectShareUtil;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask;
@@ -382,7 +382,7 @@ public abstract class BaseConversationListFragment extends Fragment implements A
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
if (isRelayingMessageContent(getActivity())) {
if (RelayUtil.getSharedContactId(getActivity()) != 0) {
if (ShareUtil.getSharedContactId(getActivity()) != 0) {
return false; // no sharing of a contact to multiple recipients at the same time, we can reconsider when that becomes a real-world need
}
Context context = getContext();
@@ -60,8 +60,6 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity
recyclerView = ViewUtil.findById(view, R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// allow content to be drawn behind the navigation bar
recyclerView.setClipToPadding(false);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView);
@@ -17,7 +17,7 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import android.app.Activity;
import android.content.Intent;
@@ -114,8 +114,6 @@ public class ContactSelectionListFragment extends Fragment
recyclerView = ViewUtil.findById(view, R.id.recycler_view);
// allow content to be drawn behind the navigation bar
recyclerView.setClipToPadding(false);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
@@ -17,12 +17,9 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.TransportOption.Type;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedHtml;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedSubject;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedText;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedType;
import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding;
import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedText;
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
import static org.thoughtcrime.securesms.util.ShareUtil.isSharing;
import android.Manifest;
import android.annotation.SuppressLint;
@@ -109,7 +106,7 @@ import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.Util;
@@ -748,18 +745,18 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
private void handleSharing() {
ArrayList<Uri> uriList = RelayUtil.getSharedUris(this);
int sharedContactId = RelayUtil.getSharedContactId(this);
ArrayList<Uri> uriList = ShareUtil.getSharedUris(this);
int sharedContactId = ShareUtil.getSharedContactId(this);
if (uriList.size() > 1) {
askSendingFiles(uriList, () -> SendRelayedMessageUtil.immediatelyRelay(this, chatId));
} else {
if (sharedContactId != 0) {
addAttachmentContactInfo(sharedContactId);
} else if (getSharedHtml(this) != null || getSharedSubject(this) != null || ("sticker".equals(getSharedType(this)) && !uriList.isEmpty())) {
} else if (ShareUtil.getSharedHtml(this) != null || ShareUtil.getSharedSubject(this) != null || ("sticker".equals(ShareUtil.getSharedType(this)) && !uriList.isEmpty())) {
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
} else {
Uri uri = uriList.isEmpty()? null : uriList.get(0);
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, getSharedType(this), null, null, getSharedText(this)));
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, ShareUtil.getSharedType(this), null, null, getSharedText(this)));
}
initializeDraft();
}
@@ -775,7 +772,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
isEditing = false;
final SettableFuture<Boolean> future = new SettableFuture<>();
DcMsg draft = dcContext.getDraft(chatId);
final String sharedText = RelayUtil.getSharedText(this);
final String sharedText = ShareUtil.getSharedText(this);
if (!draft.isOk()) {
if (TextUtils.isEmpty(sharedText)) {
@@ -789,6 +786,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
return future;
}
inputPanel.setSubject(draft.getSubject());
final String text = TextUtils.isEmpty(sharedText)? draft.getText() : sharedText;
if(!text.isEmpty()) {
composeText.setText(text);
@@ -883,6 +882,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
ImageButton quickCameraToggle = ViewUtil.findById(this, R.id.quick_camera_toggle);
if (!ViewUtil.isEdgeToEdgeSupported()) {
// since insets will not be applied, we need to set top padding to avoid drawing behind toolbar
try (TypedArray typedArray = obtainStyledAttributes(new int[]{android.R.attr.actionBarSize})) {
int paddingTop = typedArray.getDimensionPixelSize(0, 0);
container.setPadding(container.getPaddingLeft(), paddingTop, container.getPaddingRight() , container.getPaddingBottom());
}
}
// apply padding top to avoid drawing behind top bar
ViewUtil.applyWindowInsets(findViewById(R.id.fragment_content), false, true, false, false);
// apply padding to root to avoid collision with system bars
@@ -955,8 +961,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
if (accountId != dcContext.getAccountId()) {
AccountManager.getInstance().switchAccount(context, accountId);
dcContext = context.dcContext;
fragment.dcContext = context.dcContext;
fragment.dcContext = dcContext = context.getDcContext();
initializeBackground();
}
chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, -1);
@@ -974,10 +979,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
if (dcChat.canSend()) {
composePanel.setVisibility(View.VISIBLE);
attachmentManager.setHidden(false);
inputPanel.setSubjectVisible(!dcChat.isEncrypted());
} else {
composePanel.setVisibility(View.GONE);
attachmentManager.setHidden(true);
hideSoftKeyboard();
inputPanel.setSubjectVisible(false);
}
}
@@ -1060,12 +1067,14 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
Optional<QuoteModel> quote = inputPanel.getQuote();
boolean editing = isEditing;
final String subject = inputPanel.getSubject();
// for a quick ui feedback, we clear the related controls immediately on sending messages.
// for drafts, however, we do not change the controls, the activity may be resumed.
if (action==ACTION_SEND_OUT) {
composeText.setText("");
inputPanel.clearQuote();
inputPanel.clearSubject();
}
Util.runOnAnyBackgroundThread(() -> {
@@ -1130,6 +1139,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
msg.setQuote(quote.get().getQuotedMsg());
}
if (!subject.isEmpty() && msg != null) {
msg.setSubject(subject);
}
if (action==ACTION_SEND_OUT) {
// for WEBXDC, drafts are just sent out as is.
@@ -17,7 +17,7 @@
package org.thoughtcrime.securesms;
import static com.b44t.messenger.DcContact.DC_CONTACT_ID_SELF;
import static org.thoughtcrime.securesms.util.RelayUtil.setForwardingMessageIds;
import static org.thoughtcrime.securesms.util.ShareUtil.setForwardingMessageIds;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -60,13 +60,13 @@ import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.reactions.AddReactionView;
import org.thoughtcrime.securesms.reactions.ReactionsDetailsFragment;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.relay.EditRelayActivity;
import org.thoughtcrime.securesms.util.AccessibilityUtil;
import org.thoughtcrime.securesms.util.Debouncer;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.ConversationAdaptiveActionsToolbar;
import org.thoughtcrime.securesms.calls.CallUtil;
import java.util.Collections;
import java.util.LinkedList;
@@ -763,6 +763,9 @@ public class ConversationFragment extends MessageSelectorFragment
else if(DozeReminder.isDozeReminderMsg(getContext(), messageRecord)) {
DozeReminder.dozeReminderTapped(getContext());
}
else if(StatsSending.isStatsSendingDeviceMsg(getContext(), messageRecord)) {
StatsSending.statsDeviceMsgTapped(getActivity());
}
else if(messageRecord.getInfoType() == DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE) {
if (messageRecord.getParent() != null) {
// if the parent webxdc message still exists
@@ -785,7 +788,9 @@ public class ConversationFragment extends MessageSelectorFragment
&& messageRecord.getText().contains(self_mail)
&& getListAdapter().getChat().isDeviceTalk()) {
// This is a device message informing the user that the password is wrong
startActivity(new Intent(getActivity(), EditTransportActivity.class));
Intent intent = new Intent(getActivity(), EditRelayActivity.class);
intent.putExtra(EditRelayActivity.EXTRA_ADDR, self_mail);
startActivity(intent);
}
}
}
@@ -411,8 +411,11 @@ public class ConversationItem extends BaseConversationItem
bodyText.setClickable(false);
bodyText.setFocusable(false);
String subject = messageRecord.getSubject();
String text = messageRecord.getText();
if (!subject.isEmpty() && messageRecord.isOutgoing() && !messageRecord.isSecure()) text = subject + "\n\n" + text;
if (messageRecord.getType() == DcMsg.DC_MSG_CALL || text.isEmpty()) {
bodyText.setVisibility(View.GONE);
}
@@ -20,13 +20,13 @@ import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedTitle;
import static org.thoughtcrime.securesms.util.RelayUtil.isDirectSharing;
import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.resetRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.getDirectSharingChatId;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedTitle;
import static org.thoughtcrime.securesms.util.ShareUtil.isDirectSharing;
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.resetRelayingMessageContent;
import android.Manifest;
import android.content.Intent;
@@ -76,12 +76,15 @@ import org.thoughtcrime.securesms.search.SearchFragment;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ScreenLockUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.StorageUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import chat.delta.rpc.types.SecurejoinSource;
import chat.delta.rpc.types.SecurejoinUiPath;
import java.util.ArrayList;
import java.util.Date;
@@ -95,6 +98,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
public static final String CLEAR_NOTIFICATIONS = "clear_notifications";
public static final String ACCOUNT_ID_EXTRA = "account_id";
public static final String FROM_WELCOME = "from_welcome";
private static final int REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE = ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS+1;
private ConversationListFragment conversationListFragment;
public TextView title;
@@ -106,6 +110,11 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
private ViewGroup fragmentContainer;
private ViewGroup selfAvatarContainer;
/** used to store temporarily scanned QR to pass it back to QrCodeHandler when ScreenLockUtil is used */
private String qrData = null;
/** used to store temporarily profile ID to delete after authorization is granted via ScreenLockUtil */
private int deleteProfileId = 0;
@Override
protected void onPreCreate() {
dynamicTheme = new DynamicNoActionBarTheme();
@@ -118,7 +127,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
// it is not needed to keep all past update messages, however, when deleted, also the strings should be deleted.
try {
DcContext dcContext = DcHelper.getContext(this);
final String deviceMsgLabel = "update_2_25_0_android-b";
final String deviceMsgLabel = "update_2_33_1_android";
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
DcMsg msg = null;
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
@@ -129,7 +138,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
// Util.copy(inputStream, new FileOutputStream(outputFile));
// msg.setFile(outputFile, "image/jpeg");
msg.setText(getString(R.string.update_2_25, "https://i.delta.chat/#0A45953086F0C166D3BAF1D4BB2025496E4C2704&x=MVPi07rQBEmHO4FRb3brpwDe&j=n8mkKqu42WAKKUCx1bQOVh23&s=RxuXoa0vhvTs0QLsWM45Ues0&a=adb%40arcanechat.me&n=adb&b=ArcaneChat+Channel", "https://arcanechat.me/#contribute"));
msg.setText(getString(R.string.update_2_33, "https://arcanechat.me/#contribute"));
}
dcContext.addDeviceMsg(deviceMsgLabel, msg);
@@ -363,7 +372,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
if (isRelayingMessageContent(this)) {
inflater.inflate(R.menu.forwarding_menu, menu);
menu.findItem(R.id.menu_export_attachment).setVisible(
RelayUtil.isFromWebxdc(this) && RelayUtil.getSharedUris(this).size() == 1
ShareUtil.isFromWebxdc(this) && ShareUtil.getSharedUris(this).size() == 1
);
} else {
inflater.inflate(R.menu.text_secure_normal, menu);
@@ -473,7 +482,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
}
private void performSave() {
ArrayList<Uri> uriList = RelayUtil.getSharedUris(this);
ArrayList<Uri> uriList = ShareUtil.getSharedUris(this);
Uri uri = uriList.get(0);
String mimeType = PersistentBlobProvider.getMimeType(this, uri);
String fileName = PersistentBlobProvider.getFileName(this, uri);
@@ -495,7 +504,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
if (uri.getScheme().equalsIgnoreCase(OPENPGP4FPR) || Util.isInviteURL(uri)) {
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.handleQrData(uri.toString());
qrCodeHandler.handleOnlySecureJoinQr(uri.toString(), SecurejoinSource.ExternalLink, null);
}
}
}
@@ -570,14 +579,55 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
startActivity(Intent.createChooser(intent, getString(R.string.chat_share_with_title)));
}
public void onDeleteProfile(int profileId) {
deleteProfileId = profileId;
boolean result = ScreenLockUtil.applyScreenLock(this, getString(R.string.delete_account), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE);
if (!result) {
deleteProfile(profileId);
}
}
private void deleteProfile(int profileId) {
DcAccounts accounts = DcHelper.getAccounts(this);
boolean selected = profileId == accounts.getSelectedAccount().getAccountId();
DcHelper.getNotificationCenter(this).removeAllNotifications(profileId);
accounts.removeAccount(profileId);
if (selected) {
DcContext selAcc = accounts.getSelectedAccount();
AccountManager.getInstance().switchAccountAndStartActivity(this, selAcc.isOk()? selAcc.getAccountId() : 0);
} else {
AccountManager.getInstance().showSwitchAccountMenu(this);
}
// title update needed to show "Delta Chat" in case there is only one profile left
refreshTitle();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) return;
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
switch (requestCode) {
case IntentIntegrator.REQUEST_CODE:
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.onScanPerformed(scanResult);
IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data);
qrData = scanResult.getContents();
qrCodeHandler.handleQrData(qrData, SecurejoinSource.Scan, SecurejoinUiPath.QrIcon);
break;
case ScreenLockUtil.REQUEST_CODE_CONFIRM_CREDENTIALS:
// QrCodeHandler requested user authorization before adding a relay
// and it was granted, so proceed to add the relay
if (qrData != null) {
qrCodeHandler.addRelay(qrData);
qrData = null;
}
break;
case REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE:
if (deleteProfileId != 0) {
deleteProfile(deleteProfileId);
deleteProfileId = 0;
}
break;
default:
break;
@@ -2,9 +2,9 @@ package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.FROM_ARCHIVED_CHATS_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isSharing;
import android.content.Intent;
import android.os.Bundle;
@@ -48,7 +48,7 @@ import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.notifications.FcmReceiveService;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
@@ -108,8 +108,6 @@ public class ConversationListFragment extends BaseConversationListFragment
emptyState = ViewUtil.findById(view, R.id.empty_state);
emptySearch = ViewUtil.findById(view, R.id.empty_search);
// allow content to be drawn behind the navigation bar
list.setClipToPadding(false);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(list, true, archive, true, true);
@@ -266,7 +264,7 @@ public class ConversationListFragment extends BaseConversationListFragment
int listflags = 0;
if (archive) {
listflags |= DcContext.DC_GCL_ARCHIVED_ONLY;
} else if (RelayUtil.isRelayingMessageContent(getActivity())) {
} else if (ShareUtil.isRelayingMessageContent(getActivity())) {
listflags |= DcContext.DC_GCL_FOR_FORWARDING;
} else {
listflags |= DcContext.DC_GCL_ADD_ALLDONE_HINT;
@@ -149,7 +149,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
initializeAvatarView();
SelectedContactsAdapter adapter = new SelectedContactsAdapter(this, GlideApp.with(this), broadcast, unencrypted);
SelectedContactsAdapter adapter = new SelectedContactsAdapter(this, GlideApp.with(this), broadcast);
adapter.setItemClickListener(this);
lv.setAdapter(adapter);
@@ -51,6 +51,8 @@ import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
import org.thoughtcrime.securesms.relay.EditRelayActivity;
import org.thoughtcrime.securesms.relay.RelayListActivity;
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
@@ -74,7 +76,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
private static final String INSTANCES_URL = "https://chatmail.at/relays";
private static final String DEFAULT_CHATMAIL_HOST = "arcanechat.me";
public static final String QR_ACCOUNT_EXTRA = "qr_account_extra";
public static final String FROM_WELCOME = "from_welcome";
private static final int REQUEST_CODE_AVATAR = 1;
@@ -107,11 +108,22 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
boolean fromWelcome = getIntent().getBooleanExtra(FROM_WELCOME, false);
if (DcHelper.getContext(this).isConfigured() == 1) {
// if account is configured it means we didn't come from Welcome screen nor from QR scanner,
// instead, user clicked a dcaccount:// URI directly, so we need to switch to a new account:
// instead, user clicked a dcaccount:// URI directly, so we need to just offer to add a new relay
Uri uri = getIntent().getData();
if (uri != null) {
Intent intent = new Intent(this, RelayListActivity.class);
intent.putExtra(RelayListActivity.EXTRA_QR_DATA, uri.toString());
startActivity(intent);
finish();
return;
}
// if URI is unexpectedly null, then fallback to new profile creation
AccountManager.getInstance().beginAccountCreation(this);
}
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(!fromWelcome) {
@Override
public void handleOnBackPressed() {
@@ -198,10 +210,8 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
case IntentIntegrator.REQUEST_CODE:
String qrRaw = data.getStringExtra(RegistrationQrActivity.QRDATA_EXTRA);
if (qrRaw == null) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanResult != null && scanResult.getFormatName() != null) {
qrRaw = scanResult.getContents();
}
IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data);
qrRaw = scanResult.getContents();
}
if (qrRaw != null) {
setProviderFromQr(qrRaw);
@@ -232,16 +242,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
@Override
public void onStart() {
super.onStart();
String accountQr = getIntent().getStringExtra(QR_ACCOUNT_EXTRA);
if (accountQr != null) {
getIntent().removeExtra(QR_ACCOUNT_EXTRA);
setProviderFromQr(accountQr);
}
}
@Override
protected void onPause() {
super.onPause();
@@ -345,18 +345,13 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
IntentUtils.showInBrowser(this, INSTANCES_URL);
});
findViewById(R.id.login_button).setOnClickListener((v) -> {
startRegistrationActivity();
startActivity(new Intent(this, EditRelayActivity.class));
});
findViewById(R.id.scan_qr_button).setOnClickListener((v) -> {
new IntentIntegrator(this).setCaptureActivity(RegistrationQrActivity.class).initiateScan();
});
}
private void startRegistrationActivity() {
Intent intent = new Intent(this, EditTransportActivity.class);
startActivity(intent);
}
private void updateProvider() {
if (isDcLogin) {
signUpBtn.setText(R.string.login_title);
@@ -344,9 +344,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
DcMsg dcMsg = dcContext.getMsg(mediaItem.msgId);
DcChat dcChat = dcContext.getChat(dcMsg.getChatId());
String text = getResources().getQuantityString(
dcChat.isDeviceTalk() ? R.plurals.ask_delete_messages_simple : R.plurals.ask_delete_messages,
1, 1);
String text = getResources().getQuantityString(R.plurals.ask_delete_messages,1, 1);
int positiveBtnLabel = dcChat.isSelfTalk() ? R.string.delete : R.string.delete_for_me;
final int[] messageIds = new int[]{mediaItem.msgId};
@@ -76,9 +76,7 @@ public abstract class MessageSelectorFragment
canDeleteForAll = false;
}
String text = getActivity().getResources().getQuantityString(
dcChat.isDeviceTalk() ? R.plurals.ask_delete_messages_simple : R.plurals.ask_delete_messages,
messageIds.length, messageIds.length);
String text = getActivity().getResources().getQuantityString(R.plurals.ask_delete_messages, messageIds.length, messageIds.length);
int positiveBtnLabel = dcChat.isSelfTalk() ? R.string.delete : R.string.delete_for_me;
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity())
@@ -18,8 +18,8 @@ package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import android.content.Intent;
import android.net.Uri;
@@ -39,6 +39,9 @@ import org.thoughtcrime.securesms.qr.QrActivity;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.util.MailtoUtil;
import chat.delta.rpc.types.SecurejoinSource;
import chat.delta.rpc.types.SecurejoinUiPath;
/**
* Activity container for starting a new conversation.
*
@@ -138,11 +141,13 @@ public class NewConversationActivity extends ContactSelectionActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) return;
switch (requestCode) {
case IntentIntegrator.REQUEST_CODE:
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data);
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.onScanPerformed(scanResult);
qrCodeHandler.handleOnlySecureJoinQr(scanResult.getContents(), SecurejoinSource.Scan, SecurejoinUiPath.NewContact);
break;
default:
break;
@@ -28,7 +28,7 @@ import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
@@ -393,9 +393,9 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
Intent composeIntent = new Intent();
DcContact dcContact = dcContext.getContact(contactId);
if (dcContact.isKeyContact()) {
RelayUtil.setSharedContactId(composeIntent, contactId);
ShareUtil.setSharedContactId(composeIntent, contactId);
} else {
RelayUtil.setSharedText(composeIntent, dcContact.getAddr());
ShareUtil.setSharedText(composeIntent, dcContact.getAddr());
}
ConversationListRelayingActivity.start(this, composeIntent);
}
@@ -163,11 +163,7 @@ public class ProfileAdapter extends RecyclerView.Adapter
String addr = null;
if (contactId == DcContact.DC_CONTACT_ID_ADD_MEMBER) {
if (isOutBroadcast) {
name = context.getString(R.string.add_recipients);
} else {
name = context.getString(R.string.group_add_members);
}
name = context.getString(R.string.group_add_members);
}
else if (contactId == DcContact.DC_CONTACT_ID_QR_INVITE) {
name = context.getString(R.string.qrshow_title);
@@ -69,8 +69,6 @@ public class ProfileFragment extends Fragment
RecyclerView list = ViewUtil.findById(view, R.id.recycler_view);
// allow content to be drawn behind the navigation bar
list.setClipToPadding(false);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(list);
@@ -39,7 +39,7 @@ import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.MailtoUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import java.util.ArrayList;
import java.util.List;
@@ -274,7 +274,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
startActivity(composeIntent);
} else {
composeIntent = getBaseShareIntent(ConversationListRelayingActivity.class);
RelayUtil.setIsFromWebxdc(composeIntent, RelayUtil.isFromWebxdc(this));
ShareUtil.setIsFromWebxdc(composeIntent, ShareUtil.isFromWebxdc(this));
ConversationListRelayingActivity.start(this, composeIntent);
}
finish();
@@ -283,11 +283,11 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
private Intent getBaseShareIntent(final @NonNull Class<?> target) {
final Intent intent = new Intent(this, target);
RelayUtil.setSharedTitle(intent, RelayUtil.getSharedTitle(this));
RelayUtil.setSharedType(intent, RelayUtil.getSharedType(this));
RelayUtil.setSharedSubject(intent, RelayUtil.getSharedSubject(this));
RelayUtil.setSharedHtml(intent, RelayUtil.getSharedHtml(this));
RelayUtil.setSharedUris(intent, resolvedExtras);
ShareUtil.setSharedTitle(intent, ShareUtil.getSharedTitle(this));
ShareUtil.setSharedType(intent, ShareUtil.getSharedType(this));
ShareUtil.setSharedSubject(intent, ShareUtil.getSharedSubject(this));
ShareUtil.setSharedHtml(intent, ShareUtil.getSharedHtml(this));
ShareUtil.setSharedUris(intent, resolvedExtras);
String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
if (text==null) {
@@ -298,7 +298,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
}
if (text != null) {
RelayUtil.setSharedText(intent, text.toString());
ShareUtil.setSharedText(intent, text.toString());
}
if (resolvedExtras.size() > 0) {
@@ -0,0 +1,100 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_STATS_SENDING;
import static org.thoughtcrime.securesms.connect.DcHelper.openHelp;
import android.app.Activity;
import android.content.Context;
import android.text.util.Linkify;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcMsg;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import java.util.Locale;
public class StatsSending {
/** @noinspection unused: We will start adding a device message once stats-sending is tested a bit */
public static void maybeAddStatsSendingDeviceMsg(Context context) {
if (Prefs.getStatsDeviceMsgId(context) != 0) {
return;
}
if (DcHelper.getInt(context, CONFIG_STATS_SENDING) != 0) {
return; // Stats-sending is already enabled
}
DcContext dcContext = DcHelper.getContext(context);
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText(context.getString(R.string.stats_device_message));
int msgId = dcContext.addDeviceMsg("stats_device_message", msg);
if (msgId!=0) {
Prefs.setStatsDeviceMsgId(context, msgId);
}
}
public static boolean isStatsSendingDeviceMsg(Context context, DcMsg msg) {
return msg != null
&& msg.getFromId() == DcContact.DC_CONTACT_ID_DEVICE
&& msg.getId() == Prefs.getStatsDeviceMsgId(context);
}
public static void statsDeviceMsgTapped(Activity activity) {
if (DcHelper.getInt(activity, CONFIG_STATS_SENDING) != 0) {
showStatsDisableDialog(activity);
} else {
showStatsConfirmationDialog(activity, () -> {});
}
}
public static void showStatsConfirmationDialog(Activity activity, Runnable onConfigChangedListener) {
AlertDialog d = new AlertDialog.Builder(activity)
.setMessage(R.string.stats_confirmation_dialog)
.setNegativeButton(R.string.cancel, (_d, i) -> {})
.setPositiveButton(R.string.yes, (_d, i) -> {
DcHelper.set(activity, DcHelper.CONFIG_STATS_SENDING, "1");
onConfigChangedListener.run();
showStatsThanksDialog(activity);
})
.setNeutralButton(R.string.more_info_desktop, (_d, i) -> openHelp(activity, "#statssending"))
.create();
d.show();
try {
//noinspection DataFlowIssue
Linkify.addLinks((TextView) d.findViewById(android.R.id.message), Linkify.WEB_URLS);
} catch (NullPointerException e) {
//noinspection CallToPrintStackTrace
e.printStackTrace();
}
}
private static void showStatsThanksDialog(Activity activity) {
String stats_id = DcHelper.get(activity, DcHelper.CONFIG_STATS_ID);
new AlertDialog.Builder(activity)
.setMessage(R.string.stats_thanks)
.setNeutralButton(R.string.no, (d, i) -> {})
.setPositiveButton(R.string.yes, (d, i) -> {
String ln = Locale.getDefault().getLanguage();
IntentUtils.showInBrowser(activity, "https://cispa.qualtrics.com/jfe/form/SV_9YmhkpGa48KxfLg?id=" + stats_id + "&ln=" + ln);
})
.show();
}
public static void showStatsDisableDialog(Activity activity) {
AlertDialog d = new AlertDialog.Builder(activity)
.setMessage(R.string.stats_disable_dialog)
.setNegativeButton(R.string.disable, (_d, i) -> {
DcHelper.set(activity, DcHelper.CONFIG_STATS_SENDING, "0");
})
.setPositiveButton(R.string.stats_keep_sending, (_d, i) -> {
})
.setNeutralButton(R.string.more_info_desktop, (_d, i) -> openHelp(activity, "#statssending"))
.create();
d.show();
}
}
@@ -28,6 +28,8 @@ import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import chat.delta.rpc.types.SecurejoinSource;
import java.net.IDN;
public class WebViewActivity extends PassphraseRequiredActionBarActivity
@@ -102,6 +104,8 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
case "mailto":
case "openpgp4fpr":
case "geo":
case "dcaccount":
case "dclogin":
return openOnlineUrl(url);
}
}
@@ -300,7 +304,7 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
// invite-links should be handled directly
String schema = url.split(":")[0].toLowerCase();
if (schema.equals("openpgp4fpr") || url.startsWith("https://" + Util.INVITE_DOMAIN + "/")) {
new QrCodeHandler(this).handleQrData(url);
new QrCodeHandler(this).handleOnlySecureJoinQr(url, SecurejoinSource.InternalLink, null);
return true; // abort internal loading
}
@@ -22,7 +22,6 @@ import androidx.appcompat.app.AlertDialog;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
import com.b44t.messenger.DcLot;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
@@ -33,6 +32,7 @@ import org.thoughtcrime.securesms.mms.AttachmentManager;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.qr.BackupTransferActivity;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
import org.thoughtcrime.securesms.service.GenericForegroundService;
import org.thoughtcrime.securesms.service.NotificationController;
@@ -320,39 +320,14 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
if (requestCode==IntentIntegrator.REQUEST_CODE) {
String qrRaw = data.getStringExtra(RegistrationQrActivity.QRDATA_EXTRA);
if (qrRaw == null) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanResult == null || scanResult.getFormatName() == null) {
return; // aborted
}
IntentResult scanResult = IntentIntegrator.parseActivityResult(resultCode, data);
qrRaw = scanResult.getContents();
}
DcLot qrParsed = dcContext.checkQr(qrRaw);
switch (qrParsed.getState()) {
case DcContext.DC_QR_BACKUP2:
final String finalQrRaw = qrRaw;
new AlertDialog.Builder(this)
.setTitle(R.string.multidevice_receiver_title)
.setMessage(R.string.multidevice_receiver_scanning_ask)
.setPositiveButton(R.string.perm_continue, (dialog, which) -> startBackupTransfer(finalQrRaw))
.setNegativeButton(R.string.cancel, null)
.setCancelable(false)
.show();
break;
case DcContext.DC_QR_BACKUP_TOO_NEW:
new AlertDialog.Builder(this)
.setTitle(R.string.multidevice_receiver_title)
.setMessage(R.string.multidevice_receiver_needs_update)
.setPositiveButton(R.string.ok, null)
.show();
break;
default:
new AlertDialog.Builder(this)
.setMessage(R.string.qraccount_qr_code_cannot_be_used)
.setPositiveButton(R.string.ok, null)
.show();
break;
if (!new QrCodeHandler(this).handleBackupQr(qrRaw)) {
new AlertDialog.Builder(this)
.setMessage(R.string.qraccount_qr_code_cannot_be_used)
.setPositiveButton(R.string.ok, null)
.show();
}
} else if (requestCode == PICK_BACKUP) {
Uri uri = (data != null ? data.getData() : null);
@@ -47,9 +47,15 @@ import chat.delta.rpc.RpcException;
public class AccountSelectionListFragment extends DialogFragment implements DcEventCenter.DcEventDelegate
{
private static final String TAG = AccountSelectionListFragment.class.getSimpleName();
private final ConversationListActivity activity;
private RecyclerView recyclerView;
private AccountSelectionListAdapter adapter;
public AccountSelectionListFragment(ConversationListActivity activity) {
super();
this.activity = activity;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
@@ -132,7 +138,7 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
private void onContextItemSelected(MenuItem item, int accountId) {
int itemId = item.getItemId();
if (itemId == R.id.delete) {
onDeleteAccount(accountId);
onDeleteProfile(accountId);
} else if (itemId == R.id.menu_mute_notifications) {
onToggleMute(accountId);
} else if (itemId == R.id.menu_set_tag) {
@@ -167,8 +173,6 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
}
private void onSetTag(int accountId) {
Activity activity = getActivity();
if (activity == null) return;
AccountSelectionListFragment.this.dismiss();
DcContext dcContext = DcHelper.getAccounts(activity).getAccount(accountId);
@@ -190,10 +194,8 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
.show();
}
private void onDeleteAccount(int accountId) {
Activity activity = getActivity();
private void onDeleteProfile(int accountId) {
AccountSelectionListFragment.this.dismiss();
if (activity == null) return;
DcAccounts accounts = DcHelper.getAccounts(activity);
Rpc rpc = DcHelper.getRpc(activity);
@@ -229,22 +231,7 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
.setTitle(R.string.delete_account)
.setView(dialogView)
.setNegativeButton(R.string.cancel, (d, which) -> AccountManager.getInstance().showSwitchAccountMenu(activity))
.setPositiveButton(R.string.delete, (d2, which2) -> {
boolean selected = accountId == accounts.getSelectedAccount().getAccountId();
DcHelper.getNotificationCenter(activity).removeAllNotifications(accountId);
accounts.removeAccount(accountId);
if (selected) {
DcContext selAcc = accounts.getSelectedAccount();
AccountManager.getInstance().switchAccountAndStartActivity(activity, selAcc.isOk()? selAcc.getAccountId() : 0);
} else {
AccountManager.getInstance().showSwitchAccountMenu(activity);
}
// title update needed to show "Delta Chat" in case there is only one profile left
if (activity instanceof ConversationListActivity) {
((ConversationListActivity)activity).refreshTitle();
}
})
.setPositiveButton(R.string.delete, (d2, w2) -> activity.onDeleteProfile(accountId))
.show();
Util.redPositiveButton(dialog);
}
@@ -87,10 +87,6 @@ public class AccountSelectionListItem extends LinearLayout {
}
addrOrTag = dcContext.getConfig(CONFIG_PRIVATE_TAG);
if ("".equals(addrOrTag) && !dcContext.isChatmail()) {
addrOrTag = self.getAddr();
}
unreadCount = dcContext.getFreshMsgs().length;
enableSwitch.setChecked(dcContext.isEnabled());
@@ -56,6 +56,7 @@ public class InputPanel extends ConstraintLayout
private QuoteView quoteView;
private EmojiToggle emojiToggle;
private ComposeText composeText;
private android.widget.EditText subjectText;
private View quickCameraToggle;
private View quickAudioToggle;
private View buttonToggle;
@@ -91,6 +92,7 @@ public class InputPanel extends ConstraintLayout
this.quoteView = findViewById(R.id.quote_view);
this.emojiToggle = findViewById(R.id.emoji_toggle);
this.composeText = findViewById(R.id.embedded_text_editor);
this.subjectText = findViewById(R.id.subject_text);
this.quickCameraToggle = findViewById(R.id.quick_camera_toggle);
this.quickAudioToggle = findViewById(R.id.quick_audio_toggle);
this.buttonToggle = findViewById(R.id.button_toggle);
@@ -198,6 +200,31 @@ public class InputPanel extends ConstraintLayout
composeText.performClick();
}
public void setSubjectVisible(boolean visible) {
subjectText.setVisibility(visible ? View.VISIBLE : View.GONE);
// don't make it visible if visible is false to avoid showing it while recording audio and an event triggers setSubjectVisible(false)
if (visible) emojiToggle.setVisibility(View.GONE);
}
public String getSubject() {
if (subjectText != null && subjectText.getVisibility() == View.VISIBLE) {
return subjectText.getText().toString().trim();
}
return "";
}
public void clearSubject() {
if (subjectText != null) {
subjectText.setText("");
}
}
public void setSubject(String subject) {
if (subjectText != null && subject != null) {
subjectText.setText(subject);
}
}
public void setMediaKeyboard(@NonNull MediaKeyboard mediaKeyboard) {
mediaKeyboard.setKeyboardListener(this);
}
@@ -110,7 +110,7 @@ public class DozeReminder {
}
private static boolean isPushAvailableAndSufficient() {
return ApplicationContext.dcAccounts.isAllChatmail()
return ApplicationContext.getDcAccounts().isAllChatmail()
&& FcmReceiveService.getToken() != null;
}
@@ -31,7 +31,7 @@ public class AccountManager {
private void resetDcContext(Context context) {
ApplicationContext appContext = (ApplicationContext)context.getApplicationContext();
appContext.dcContext = ApplicationContext.dcAccounts.getSelectedAccount();
appContext.setDcContext(ApplicationContext.getDcAccounts().getSelectedAccount());
DcHelper.setStockTranslations(context);
DirectShareUtil.resetAllShortcuts(appContext);
}
@@ -55,7 +55,7 @@ public class AccountManager {
for (File file : files) {
// old accounts have the pattern "messenger*.db"
if (!file.isDirectory() && file.getName().startsWith("messenger") && file.getName().endsWith(".db")) {
int accountId = ApplicationContext.dcAccounts.migrateAccount(file.getAbsolutePath());
int accountId = ApplicationContext.getDcAccounts().migrateAccount(file.getAbsolutePath());
if (accountId != 0) {
String selName = PreferenceManager.getDefaultSharedPreferences(context)
.getString("curr_account_db_name", "messenger.db");
@@ -70,7 +70,7 @@ public class AccountManager {
}
if (selectAccountId != 0) {
ApplicationContext.dcAccounts.selectAccount(selectAccountId);
ApplicationContext.getDcAccounts().selectAccount(selectAccountId);
}
} catch (Exception e) {
Log.e(TAG, "Error in migrateToDcAccounts()", e);
@@ -147,19 +147,11 @@ public class AccountManager {
// ui
public void showSwitchAccountMenu(Activity activity) {
AccountSelectionListFragment dialog = new AccountSelectionListFragment();
public void showSwitchAccountMenu(ConversationListActivity activity) {
AccountSelectionListFragment dialog = new AccountSelectionListFragment(activity);
dialog.show(((FragmentActivity) activity).getSupportFragmentManager(), null);
}
public void addAccountFromQr(Activity activity, String qr) {
beginAccountCreation(activity);
activity.finishAffinity();
Intent intent = new Intent(activity, InstantOnboardingActivity.class);
intent.putExtra(InstantOnboardingActivity.QR_ACCOUNT_EXTRA, qr);
activity.startActivity(intent);
}
public void addAccountFromSecondDevice(Activity activity, String backupQr) {
switchAccountAndStartActivity(activity, 0, backupQr);
}
@@ -220,7 +220,7 @@ public class DcEventCenter {
break;
}
if (accountId != context.dcContext.getAccountId()) {
if (accountId != context.getDcContext().getAccountId()) {
return 0;
}

Some files were not shown because too many files have changed in this diff Show More