Compare commits
661 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c0717237ad | |||
| 5716372453 | |||
| d362cf4467 | |||
| 56118d3732 | |||
| a03f51f7c5 | |||
| 6cf59133c2 | |||
| ef8d833f5e | |||
| b110c1f91e | |||
| e53a1f0b22 | |||
| 5a5cbfceb7 | |||
| 57a557a9b4 | |||
| 2328bf1e2a | |||
| ce4c9aaba0 | |||
| 71a2cb7a5b | |||
| 68f5d1ae27 | |||
| 77caced5ed | |||
| 42544fd447 | |||
| 5ff869cd4a | |||
| 4af1666a31 | |||
| 786fd3f47d | |||
| a0d9315ff4 | |||
| 86954a3c42 | |||
| 9e4b744046 | |||
| 8db4604224 | |||
| 43f9094c04 | |||
| 1217e65889 | |||
| 4fbb8d2b78 | |||
| 7cebd04086 | |||
| b584fdfd89 | |||
| db35fef6db | |||
| 068102a0d8 | |||
| 02ff8a2a6b | |||
| 321b5a223b | |||
| ab7fd960ca | |||
| dec685023e | |||
| 168d2ae16c | |||
| e55249182a | |||
| 0966487978 | |||
| fd057485db | |||
| a68f3a7024 | |||
| 1dad6ebf8a | |||
| a77b1a5dd6 | |||
| c0a65e2e9f | |||
| 82ef0560a5 | |||
| 9166b2a42a | |||
| 1b91c1c482 | |||
| 0d8962f76c | |||
| e98535418c | |||
| 5eb9065d89 | |||
| 9e70c43ab8 | |||
| fc8bfabeb2 | |||
| 681c22293f | |||
| bed8d511fe | |||
| eeeb686868 | |||
| 76dda10a31 | |||
| 6a7c4f24e9 | |||
| 8cdfafd7c3 | |||
| 1c6faeac04 | |||
| 7ecf0a7daa | |||
| b2bf7e8ae7 | |||
| 0a34456302 | |||
| 3ebcc1dd99 | |||
| ff7df0e1e6 | |||
| 68cd070b98 | |||
| 8ff8cffa15 | |||
| dc216feb30 | |||
| 84fc885617 | |||
| 72bcbe80c0 | |||
| b4ed26b842 | |||
| 7be6b0a1ee | |||
| 9a2fdcdcbd | |||
| e81960f98a | |||
| a37fcfcaf7 | |||
| fd4a377752 | |||
| d40652d394 | |||
| aacca5531c | |||
| 51cb844e63 | |||
| ef0b8efcfa | |||
| 3e943483da | |||
| a9013bb574 | |||
| aa5fcb139e | |||
| c526c42d19 | |||
| f66003c6b1 | |||
| cc64142e7b | |||
| a280407370 | |||
| dda5efedc4 | |||
| 1cd4ec1ec9 | |||
| 1a8b905071 | |||
| de13a70c66 | |||
| 2caa98e08a | |||
| ba997d9f71 | |||
| 3985f2f468 | |||
| 86bd38bdad | |||
| ffa1c69be2 | |||
| 3a3388ed59 | |||
| 8c04c199e6 | |||
| ecdbbed8c1 | |||
| e6f4a616fb | |||
| 68f270eea3 | |||
| 52aeec8d17 | |||
| bdcaffde3d | |||
| d19dcb41ec | |||
| 5525cfa5a9 | |||
| 8715e9eba2 | |||
| 3cc58c2a0f | |||
| 5cc5a80990 | |||
| 52c0197682 | |||
| c75adbe93c | |||
| f16c59897d | |||
| 636235148f | |||
| 46226a7ab5 | |||
| f11ae0a5ff | |||
| 2264e1bf22 | |||
| c095510a42 | |||
| fe6838e315 | |||
| 6dbbdae2df | |||
| a5070c879a | |||
| 1bbf352c4c | |||
| 011ba4595b | |||
| 10345ab8c3 | |||
| b5d0878511 | |||
| 8a393ad274 | |||
| 84e8be9776 | |||
| da6aa901ca | |||
| 8b52a99327 | |||
| 9c6271b1d1 | |||
| 8564259787 | |||
| 9e7ee3170e | |||
| b2cdff820a | |||
| f1789950a6 | |||
| 0bc8750984 | |||
| 6351bcc11e | |||
| 66ae731a37 | |||
| cc1fd53021 | |||
| 3937f0e149 | |||
| 2839250011 | |||
| 5844563de4 | |||
| a8698a03df | |||
| 6a6044c77d | |||
| 2a0be883c2 | |||
| 5ff8101c2c | |||
| 9e87a4b2a8 | |||
| 9740921f25 | |||
| de2892a4c2 | |||
| c344b18326 | |||
| 54d2516f6c | |||
| 8f61bec805 | |||
| 107fe00afa | |||
| 8642563c86 | |||
| c9d4d2bdbc | |||
| 83f5d0793a | |||
| 16dd79aa9a | |||
| d7c3303cec | |||
| 54f2d2e991 | |||
| 8daaa45aa3 | |||
| fa40d4fb44 | |||
| a26ce76964 | |||
| 2e798c5b04 | |||
| 9104971baa | |||
| 3d6dc80d8a | |||
| 410072358d | |||
| 1d7d0dd329 | |||
| 15ed570dce | |||
| 90cf75421b | |||
| a8aecea814 | |||
| fcf98ab7e9 | |||
| e1d6b8f3b8 | |||
| 629532a996 | |||
| 36798a2f57 | |||
| 717777f628 | |||
| 5af2d4fa8f | |||
| 23d521beed | |||
| b699451c2a | |||
| fa6fad5787 | |||
| ab641df8f9 | |||
| 90ced3efb0 | |||
| 0d50af1aa5 | |||
| 7f982e6302 | |||
| 0ba20e9fc8 | |||
| cf0df03d9f | |||
| 111629ace2 | |||
| 8afe5739a8 | |||
| b9520c95ed | |||
| 1cf01c6414 | |||
| 98d5259d0e | |||
| 0945696450 | |||
| 59ec5826aa | |||
| e6415abda2 | |||
| f9885fbcad | |||
| 4663299951 | |||
| 0ee08fee42 | |||
| bd8698c3f3 | |||
| 0f694876f5 | |||
| 55ea8bbbce | |||
| ae2c152382 | |||
| 825ee6a79e | |||
| edd7938497 | |||
| f0d62f41c9 | |||
| b5e7f13819 | |||
| 9a1c6ce2ad | |||
| 966d8784f3 | |||
| 9caf94d035 | |||
| 7593ec1831 | |||
| 0cc58006ba | |||
| 60e3f475de | |||
| 8f47783aaf | |||
| a521974b3b | |||
| 2aa71e3eb2 | |||
| 005cf835a1 | |||
| 5fb61b008b | |||
| dd93de3833 | |||
| a13e31a5f7 | |||
| 3d891d07a9 | |||
| bd3c4f9186 | |||
| f4f0df3adb | |||
| 6fbe5e2f56 | |||
| edeec415a1 | |||
| 90350729d5 | |||
| 7ae4cd4dd3 | |||
| 0b50dd445f | |||
| bd40f4eb04 | |||
| cfdfab1716 | |||
| f8d0fd3f77 | |||
| 7186afa321 | |||
| 201f6e46b0 | |||
| 813d4324f7 | |||
| 27875b83bc | |||
| 29d04afc51 | |||
| e6655fa21d | |||
| 7712ada816 | |||
| 52788976e3 | |||
| 56f55be938 | |||
| 47350b1809 | |||
| bb410a1bb1 | |||
| 04ed9e27c1 | |||
| 93c52ec527 | |||
| a7b86dd59a | |||
| 5587eda657 | |||
| b8a1daff45 | |||
| deddc5dd29 | |||
| 2f371c69cf | |||
| c4aa00d40d | |||
| 46b5ae4831 | |||
| 16e89bb58a | |||
| 1566ea87d3 | |||
| cf653f41b7 | |||
| 785729272a | |||
| a881f84a03 | |||
| d3b2f2df97 | |||
| f518a3eea9 | |||
| 20819912ee | |||
| 25ad133e1f | |||
| 4eef4a86b5 | |||
| fb50b03af4 | |||
| b6ffc8df9e | |||
| 9a71de6944 | |||
| f6ab0b18a2 | |||
| f023961239 | |||
| aeb78d579e | |||
| cdc47423f9 | |||
| 9790730d75 | |||
| 6cc9a2594f | |||
| 6814df2976 | |||
| 8e8b49508d | |||
| 619ac2bb21 | |||
| f6750a1583 | |||
| ce895355f5 | |||
| 17e45fd2ab | |||
| 8f2b761361 | |||
| bc72fce060 | |||
| 501a77e1dc | |||
| ad6f232d34 | |||
| efbe43ec70 | |||
| 5e38b25c43 | |||
| 6f3f356997 | |||
| d6f485511c | |||
| a527b2f404 | |||
| 7c77b946ed | |||
| ca77886012 | |||
| fa5e305dff | |||
| 9e70bfb5ae | |||
| f4c7a9439d | |||
| 5d05e99ad6 | |||
| 79bd1c7cb3 | |||
| 848a86c718 | |||
| e759efc389 | |||
| 63ea218b98 | |||
| 07f4a859f3 | |||
| 34eeec4a39 | |||
| 7f1734b57c | |||
| 83fa4c493d | |||
| cbc8d2b659 | |||
| 6ff1c7a689 | |||
| b10185b6b9 | |||
| 6ef35c6ce1 | |||
| e04e6dfe06 | |||
| 60b322d83e | |||
| 94e597d2d1 | |||
| c1168566f3 | |||
| 72fc6ca4dc | |||
| b2a3042d02 | |||
| ed4c5e7a72 | |||
| 29a0f3dadb | |||
| 1820af288e | |||
| be48179a25 | |||
| 2aa4245563 | |||
| 54b5dba6ea | |||
| 60fa0c98df | |||
| ea60418a70 | |||
| 2bd1493a42 | |||
| 04a22cc8c6 | |||
| d2780c4c03 | |||
| bc73e1a2ba | |||
| 0522aef0fd | |||
| d5a0be0c9c | |||
| d66acbb71e | |||
| 5c06156463 | |||
| c07b2b4aa1 | |||
| 389dddc9ea | |||
| 5dfdc94468 | |||
| 52d65c1bbb | |||
| f0f07055cf | |||
| c6c66f19f2 | |||
| fb3d95264a | |||
| 92e67bd80a | |||
| 1518bab671 | |||
| 632da643af | |||
| 7353873281 | |||
| f9ac0375b9 | |||
| 78820ec18a | |||
| 3c0e4fd853 | |||
| 31c9de1f03 | |||
| 4240c8b324 | |||
| f47fff292f | |||
| 9106f12b77 | |||
| be709fb6df | |||
| fca0c03087 | |||
| 2613be7216 | |||
| 43941f9075 | |||
| 765e2b490e | |||
| cfae361b88 | |||
| bdebd98627 | |||
| be159407ff | |||
| 9daa2d77cd | |||
| 05d2d0964f | |||
| 10c4a105bb | |||
| fe602004c7 | |||
| e2d7f2c3d3 | |||
| 6996836f80 | |||
| 7d689dc1d6 | |||
| 9960423b57 | |||
| 06183a9135 | |||
| 796acf1bb0 | |||
| 64e4816f5e | |||
| 1680d332f5 | |||
| 77ee5c6bc0 | |||
| f8c678b7ff | |||
| cde74ae2e1 | |||
| 5fd3352d81 | |||
| e41b7a4701 | |||
| dd85322333 | |||
| c7bffb85fd | |||
| 3518f3d213 | |||
| b31774c899 | |||
| eebb64ff04 | |||
| ee1a6ea5c6 | |||
| 063e80bbf7 | |||
| 9f30ebd62c | |||
| ae53415545 | |||
| 8a495411a3 | |||
| 2f432bfd3b | |||
| b2b006c512 | |||
| 7b63d383ee | |||
| 2b3a56bb26 | |||
| e3408af5be | |||
| b14b8eea9d | |||
| 5e6c5d7c5e | |||
| c1eff8362f | |||
| fbca401488 | |||
| 39fe0dd523 | |||
| 0491018c24 | |||
| f91ceb8463 | |||
| 9f1def20cd | |||
| 64a8c7755d | |||
| 12807763d6 | |||
| fbf8637c97 | |||
| 8aedbc60a4 | |||
| 38c3b5561b | |||
| 3e21f9be4d | |||
| ad1159c05c | |||
| 314ecf1639 | |||
| df6ac480c6 | |||
| 8974a62a0c | |||
| d2c8e2e63a | |||
| 11600184be | |||
| ee78397614 | |||
| b33311b9fb | |||
| b90f6e296a | |||
| 5789390451 | |||
| 1a84cd05a5 | |||
| 3578a9bef1 | |||
| 52280bf744 | |||
| 26645da56d | |||
| 828ff3d8ca | |||
| 7954e94d45 | |||
| c1e47f4a9c | |||
| d3193221f6 | |||
| e7b4accea0 | |||
| 67baedc0dc | |||
| 74c02932c3 | |||
| 2968d033f2 | |||
| 43d48fa510 | |||
| 337f353220 | |||
| 218295c4f3 | |||
| bf86d4f1b7 | |||
| d383bcc451 | |||
| 2e1a40b606 | |||
| 10c538ac8e | |||
| 35852604ea | |||
| 0c8ecaf8df | |||
| cbe70a93db | |||
| 7768ef3ff9 | |||
| d337230a4b | |||
| de76377f3b | |||
| f223b22ff8 | |||
| 9850e6fff7 | |||
| 6ab94814ca | |||
| e0db504b18 | |||
| fe44eec6c8 | |||
| 7bc595a889 | |||
| 5133461eb7 | |||
| b4b12862fd | |||
| 1340166a91 | |||
| 1663502d35 | |||
| 9a67f5b32a | |||
| 773913409f | |||
| e6988e3f61 | |||
| 0047259457 | |||
| 3e9c977b3f | |||
| 3a49e30d93 | |||
| 11addb6522 | |||
| 6353bb94f4 | |||
| 5df2ba4325 | |||
| 2f79310db6 | |||
| 129278443d | |||
| 0e27692c32 | |||
| 92be6947db | |||
| 884ba32ce9 | |||
| fe2ac243c7 | |||
| 4b978c0124 | |||
| 8bf799ec2a | |||
| f92225528c | |||
| 796b723be7 | |||
| 544ab41aa4 | |||
| cca9dfb04a | |||
| faa94acbcb | |||
| e7517c23ad | |||
| 370afbf2ce | |||
| bcee64317d | |||
| 6fe4d57b48 | |||
| 906db9155a | |||
| 9b7b35acb1 | |||
| 5d25ed7715 | |||
| 5691ab9e84 | |||
| 64aa0fb49c | |||
| d3fe672ec0 | |||
| 4e199c0080 | |||
| 8fd8927293 | |||
| 320f0ba27d | |||
| c7d903f64a | |||
| f394b22e45 | |||
| e7ced91670 | |||
| 35836ad18f | |||
| 2e99f6ee93 | |||
| 5c551cb2a8 | |||
| 6490a641da | |||
| 06164d240d | |||
| b729e93b8a | |||
| d7345f75e2 | |||
| 695e1e06dd | |||
| 42561266ba | |||
| f7f1f29531 | |||
| 8377f23c58 | |||
| 7a44182c3f | |||
| 5e88059283 | |||
| 96e635f0bd | |||
| 8aa7dfabe6 | |||
| cd344daf5a | |||
| 4658adc2cd | |||
| 62ad0e942f | |||
| 7e0fc59687 | |||
| 4ec02a59de | |||
| bcad4a7302 | |||
| 55eab9dd0b | |||
| 6f6cd80516 | |||
| c88a1b53b0 | |||
| 669d8f4cba | |||
| c083195acf | |||
| 7c6d47bfae | |||
| ef4f79b4a3 | |||
| 491bbfade0 | |||
| dce7d56fb2 | |||
| 1787d8665c | |||
| 2134f97956 | |||
| bf138aa2e7 | |||
| cbd4e2b520 | |||
| 713623c11d | |||
| 66339d77bf | |||
| 8b5b2d2f95 | |||
| 19c158d1c4 | |||
| be6f30da24 | |||
| c38c5a5d36 | |||
| 9d9630041e | |||
| ff0e004e20 | |||
| a8f17d618b | |||
| ca8767e0b0 | |||
| 04d8437b89 | |||
| f08d5a64b0 | |||
| d467285036 | |||
| 205a7fd10e | |||
| ddd4cacd1d | |||
| 4ca4d81345 | |||
| ba34971d2b | |||
| deed7a569c | |||
| 24d1ca9015 | |||
| e6325578ca | |||
| 669a1a769d | |||
| ab7b2f4b1b | |||
| 07b55b739e | |||
| 78b3c3883d | |||
| e28e6b9b73 | |||
| 4ed51b6b56 | |||
| 084707eb67 | |||
| 00d411dd5a | |||
| 1816a50dee | |||
| 6c6c04ba53 | |||
| 145432a57d | |||
| 20acd38ab4 | |||
| bf7095d0ee | |||
| a6b168f4eb | |||
| 883536a3a5 | |||
| 3013af2a7a | |||
| 7b52bb6c85 | |||
| 1439bc0a86 | |||
| 9a5415eb66 | |||
| 5da3748a6a | |||
| 2308feea8c | |||
| a3b0ee1ef9 | |||
| 4fa5f1f5c6 | |||
| f4701b92e2 | |||
| 6649165b56 | |||
| 1c9b5977a8 | |||
| 49471999b9 | |||
| 86a8fbf463 | |||
| 238ec5b299 | |||
| 4c810c2b50 | |||
| f4d5547da7 | |||
| 52850c25b0 | |||
| 5117e103bb | |||
| 056f9bd4fb | |||
| 877989b5c1 | |||
| eef8609a66 | |||
| b43685bcdf | |||
| 794062b9ed | |||
| 876721fae5 | |||
| 0fdac57c68 | |||
| b3375f4f19 | |||
| b607ca21ff | |||
| d6efa3c7e5 | |||
| e461e2f7f1 | |||
| 684f8834fa | |||
| b440a31820 | |||
| 568a3f383f | |||
| 6c212a5d3d | |||
| b6e43a6994 | |||
| d1f85e6dc4 | |||
| 74ef8dc1c6 | |||
| 1da2d35af4 | |||
| bb3f4a2e06 | |||
| 8e4c5d6b63 | |||
| 1b46edaddf | |||
| aa0c72356f | |||
| ee8fd429f4 | |||
| bc022f5196 | |||
| d4dcdcf3bd | |||
| 74b2369ca9 | |||
| 9eafdbd817 | |||
| 0a21d1d1b4 | |||
| b0cb6c73ba | |||
| b6367416e5 | |||
| 0b582dd287 | |||
| d5cf919bcb | |||
| 490f1efe36 | |||
| c125d4fa24 | |||
| 389098699a | |||
| df696e5fab | |||
| e8801d1b64 | |||
| 8bfc44c8ca | |||
| 36e963e717 | |||
| 9e8fcf8ed7 | |||
| 6412d25420 | |||
| a470366f03 | |||
| 1434ce6f57 | |||
| 654ba5b460 | |||
| e3835f70f7 | |||
| bbb803f91c | |||
| 6a4c73c821 | |||
| 853ce3c7a3 | |||
| d2ab4817b1 | |||
| 9ff1cafd5e | |||
| 40a79fbad5 | |||
| bf6b678e2b | |||
| 6c1f787a38 | |||
| b059741161 | |||
| fdd5cc5d4b | |||
| 77465b5802 | |||
| d17567029d | |||
| 4610a64732 | |||
| 0358e8ffcb | |||
| 406c263d82 | |||
| 6ed070e437 | |||
| 1e4cfa124e | |||
| c42ba0f599 | |||
| 8798275170 | |||
| ac6495ff20 | |||
| 8ae47e97cf | |||
| 6a1ff0bace | |||
| 047cd9a121 | |||
| 555547b6cc | |||
| 5fe355fe90 | |||
| 6af3b0d985 | |||
| 92d6147644 | |||
| 72fb9992a1 | |||
| e8413019ff | |||
| 289118e671 | |||
| 286a84b1d4 | |||
| 8c8c003f2b | |||
| a06e36993d | |||
| ce054d93a8 | |||
| cabc159cd8 | |||
| c78cbbe145 | |||
| a297c71a90 | |||
| 247de63362 | |||
| 20f7c7c616 | |||
| 6364903a28 | |||
| 48bb77cfae | |||
| 53bfe52797 | |||
| a8bc01e6c1 | |||
| 3fbccf3408 | |||
| 86656f1155 | |||
| 89473b8067 | |||
| 887f5881f0 | |||
| aee757e71c | |||
| 30d5eeeb45 | |||
| d2c2f2cf07 | |||
| f83d5a0dbb | |||
| c30ddf9c77 | |||
| e14b878aef | |||
| 9e3ebda12a | |||
| 4bb42b9995 | |||
| 59b158fe09 |
@@ -0,0 +1,22 @@
|
||||
version: 2
|
||||
mergeable:
|
||||
- when: pull_request.*
|
||||
name: "Changelog check"
|
||||
validate:
|
||||
- do: or
|
||||
validate:
|
||||
- do: description
|
||||
must_include:
|
||||
regex: '#skip-changelog'
|
||||
- do: and
|
||||
validate:
|
||||
- do: dependent
|
||||
changed:
|
||||
file: '**/*.java'
|
||||
required: ['CHANGELOG.md']
|
||||
fail:
|
||||
- do: checks
|
||||
status: 'action_required'
|
||||
payload:
|
||||
title: CHANGELOG.md might need an update
|
||||
summary: "Please update CHANGELOG.md or add #skip-changelog to the description"
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
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-IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="48">](https://apt.izzysoft.de/fdroid/index/apk/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)'
|
||||
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
|
||||
|
||||
@@ -1,4 +1,133 @@
|
||||
# ArcaneChat Android Changelog
|
||||
# Delta Chat Android Changelog
|
||||
|
||||
## v2.11.0
|
||||
2025-08
|
||||
|
||||
* add "After 1 year" option to disappearing messages
|
||||
* improve image quality when setting group avatars
|
||||
* add Estonian translation, update other translations
|
||||
* allow to clone email chats
|
||||
* fix some small bugs
|
||||
* update to core 2.11.0
|
||||
|
||||
## v2.10.0
|
||||
2025-08
|
||||
|
||||
* fix "Archived" item's layout in chat-list
|
||||
* don't enlarge "Saved Messages" and "Devices Messages" avatars on click
|
||||
* share email address for email contacts instead of vCard
|
||||
* open existing encrypted chat when opening a mailto link or clicking an email address in a message bubble
|
||||
* update to core 2.10.0
|
||||
|
||||
## v2.9.0
|
||||
2025-07
|
||||
|
||||
* hide contact email addresses in search results
|
||||
* disable non-functional message editing and ephemeral messages timer settings in classic email thread chat
|
||||
* don't enlarge email chats avatar placeholder
|
||||
* improve message date/status footer layout, also in RTL languages
|
||||
* display correct text when receiving a "Disappearing messages enabled" system message
|
||||
* Update to core 2.9.0
|
||||
|
||||
## v2.8.0
|
||||
2025-07
|
||||
|
||||
* Profiles focus on recognizing contacts
|
||||
* See the number of media directly in the profile, no need to tap around
|
||||
* Clearer app lists by removing redundant "App" subtitle
|
||||
* New button for quick access to the apps sent in current chat
|
||||
* New icon for the in-chat apps button
|
||||
* Improve hint for app drafts
|
||||
* Add Text-To-Speech (TTS) support for in-chat apps
|
||||
* New icon for the QR icon
|
||||
* Start rebuilding the experimental broadcast lists
|
||||
into proper channels - note that this is work-in-progress
|
||||
* Improved separation between unencrypted chats/contacts and encrypted ones, avoiding mixing of encrypted and unencrypted messages in the same chat
|
||||
* Removed padlocks, as encrypted is the default "normal" state. Instead, unencrypted email is marked with a small email / letter (✉️) icon
|
||||
* Classic email chats/threads get a big email / letter icon making it easy to recognize
|
||||
* After some time, add a device message asking to donate. Can't wait? Donate today at https://delta.chat/donate
|
||||
* Allow to sort profiles up in the profile switcher
|
||||
* Add new option to create unencrypted email thread
|
||||
* Green checkmarks are removed where they mostly refer to guaranteed encryption, which is the default now. They are still used for profile's "Introduced by"
|
||||
* Update to core 2.8.0
|
||||
|
||||
## v1.58.4
|
||||
2025-05
|
||||
|
||||
* make in-chat apps properly work when they are not sent yet, in draft mode
|
||||
* better avatar quality
|
||||
* some more bug fixes and updated translations
|
||||
* update to core 1.159.5
|
||||
|
||||
## v1.58.3
|
||||
2025-05
|
||||
|
||||
* fix: webxdc.selfName uses the name otherwise displayed
|
||||
* fix potential crash on startup
|
||||
* add donation link to app settings
|
||||
* update to core 1.159.3
|
||||
|
||||
## v1.58.2
|
||||
2025-04
|
||||
|
||||
* fix draft writing area disappearing for some chats
|
||||
* update to core 1.159.2
|
||||
|
||||
## v1.58.1
|
||||
2025-04
|
||||
|
||||
* tapping info messages with contacts open the contact's profile
|
||||
* hide superfluous "Show Classic E-mails" advanced setting for chatmail
|
||||
* show profile bio/status under name in main settings screen
|
||||
* remove mostly non-telling transport addresses when referring to a contact;
|
||||
the contact's profile gives a much better overview
|
||||
* Disable AEAP to enable us to overhaul some things - there are big changes underway in this area, which will come in a few months
|
||||
* don't display email address in contact list and member list for contacts with green-checkmark
|
||||
* avoid crash in Notifications preferences if ringtone title can't be read
|
||||
* don't display forwarded messages as "edited" if original message was edited
|
||||
* support importing contact from ProtonMail vCard attachments received in chats
|
||||
* send encrypted in the experimental broadcast lists feature
|
||||
* wait for QR scan (or invite link click) process to complete before allowing to send messages
|
||||
* show connectivity status dot when profile is connecting or not connected
|
||||
* never send Autocrypt-Gossip in broadcast lists.
|
||||
* update to core 1.159.1
|
||||
|
||||
## v1.56.1
|
||||
2025-03
|
||||
|
||||
* ignore click in info-messages from deleted in-chat apps
|
||||
* data saving: do not send messages to the server if user is the only member of the chat in single-device usage
|
||||
* protect metadata: encrypt message's sent date
|
||||
* do not fail to send messages in groups if some encryption keys are missing
|
||||
* synchronize contact name changes across devices
|
||||
* fix changing group names that was not working in some situations
|
||||
* fix: do not show outdated message text in "Message Info" of an edited message
|
||||
* some more small bug fixes and updated translations
|
||||
* update to core 1.158.0
|
||||
|
||||
## v1.56.0
|
||||
2025-03
|
||||
|
||||
* allow to edit messages
|
||||
* allow to delete messages for everyone
|
||||
* add mute option "8 hours"
|
||||
* add menu option to easily save/unsave selected message
|
||||
* improve deletion confirmation for "Device Messages"
|
||||
* remove dangerous encryption options
|
||||
* always paste as plain text in message draft area
|
||||
* some small bug fixes and updated translations
|
||||
* update to core 1.157.2
|
||||
|
||||
## v1.54.4
|
||||
2025-03
|
||||
|
||||
* allow better avatar (profile picture) quality
|
||||
* remove notifications from chat that was deleted from other device
|
||||
* when a chat is deleted, also delete its messages from server
|
||||
* avoid freezing when opening the app for the first time after install
|
||||
* avoid crash when adding chat shortcut to home screen
|
||||
* some small bug fixes and updated translations
|
||||
* update to core 1.156.3
|
||||
|
||||
## v1.54.3
|
||||
2025-03
|
||||
@@ -4,7 +4,6 @@ A [Delta Chat](https://delta.chat/) client for Android. Learn more at: https://a
|
||||
|
||||
[<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-IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="48">](https://apt.izzysoft.de/fdroid/index/apk/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)
|
||||
|
||||
|
||||
@@ -16,7 +15,6 @@ This app has some extended support for WebXDC apps:
|
||||
|
||||
- `window.webxdc.arcanechat` a string with the ArcaneChat version and can be used by app developers
|
||||
to detect when they can use the ArcaneChat-specific features.
|
||||
- `window.webxdc.isCommunity` true if the current account is a community account
|
||||
- `sendToChat()`: extra property `subject` can be set to a text string to set message/email's subject.
|
||||
- `sendToChat()`: extra property `html` can be set to a string of html markup to set the HTML part of the email/message.
|
||||
- `sendToChat()`: the file object parameter also accepts a `type` field that can be one of:
|
||||
@@ -32,4 +30,4 @@ This app has some extended support for WebXDC apps:
|
||||
|
||||
This app is based on the [official Delta Chat client](https://github.com/deltachat/deltachat-android) with several improvements.
|
||||
|
||||
This app uses a [modified](https://github.com/ArcaneChat/core) version of the [Delta Chat Core Library](https://github.com/deltachat/deltachat-core-rust).
|
||||
This app uses a [modified](https://github.com/ArcaneChat/core) version of the [Chatmail Core Library](https://github.com/chatmail/core).
|
||||
|
||||
@@ -13,25 +13,24 @@ on the command-line, in a PR called "update-core-and-stuff-DATE":
|
||||
./scripts/ndk-make.sh
|
||||
```
|
||||
|
||||
a) Update `CHANGELOG.md`
|
||||
from <https://github.com/chatmail/core/blob/main/CHANGELOG.md>,
|
||||
do not just copy and avoid technical terms.
|
||||
The changelog is for the end user and shall show impacts form that angle.
|
||||
Add used core version to end of changelog entry
|
||||
as `update to core 1.2.3` or `using core 1.2.3`
|
||||
|
||||
|
||||
2. update translations and local help:
|
||||
```
|
||||
./scripts/tx-pull-translations.sh
|
||||
./scripts/create-local-help.sh # requires deltachat-pages checked out at ../deltachat-pages
|
||||
```
|
||||
|
||||
the "update-core-and-stuff-DATE" PR can be merged without review
|
||||
(as everything was already reviewed in their repos).
|
||||
|
||||
the following steps are done in a PR called `prep-VERSION` (no leading "v"):
|
||||
|
||||
3. a) update `CHANGELOG.md`
|
||||
from <https://github.com/deltachat/deltachat-core-rust/blob/main/CHANGELOG.md>
|
||||
and <https://github.com/deltachat/deltachat-android/pulls?q=is%3Apr+is%3Aclosed+sort%3Aupdated-desc>.
|
||||
do not just copy and avoid technical terms.
|
||||
the changelog is for the end user and shall show impacts form that angle.
|
||||
b) update changelog date as `YYYY-MM`
|
||||
c) add used core version to end of changelog entry
|
||||
as `update to core 1.2.3` or `using core 1.2.3`
|
||||
3. Update `CHANGELOG.md`:
|
||||
Rename header with version number and add date as `YYYY-MM`
|
||||
|
||||
in case previous entries of the changelog refer to betas or to not officially released versions,
|
||||
the entries can be summarized.
|
||||
@@ -131,7 +130,7 @@ on <https://developer.huawei.com/consumer/en/appgallery>:
|
||||
d) Hit "Submit"; on the next page, confirm version and language
|
||||
|
||||
|
||||
## Releases on Apklis, Passkoocheh
|
||||
## Releases on other stores (ex. Passkoocheh)
|
||||
|
||||
These stores are not under our control.
|
||||
On important updates **ping store maintainers** and ask to update.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id 'com.android.application' version '8.5.2'
|
||||
id 'com.android.application' version '8.11.1'
|
||||
id 'com.google.gms.google-services' version '4.4.1'
|
||||
}
|
||||
|
||||
@@ -33,8 +33,8 @@ android {
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
|
||||
defaultConfig {
|
||||
versionCode 30000714
|
||||
versionName "1.54.4"
|
||||
versionCode 30000728
|
||||
versionName "2.11.0"
|
||||
|
||||
applicationId "chat.delta.lite"
|
||||
multiDexEnabled true
|
||||
@@ -209,9 +209,9 @@ dependencies {
|
||||
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
|
||||
|
||||
implementation 'androidx.sharetarget:sharetarget:1.2.0'
|
||||
implementation 'androidx.webkit:webkit:1.12.1'
|
||||
implementation 'androidx.webkit:webkit:1.14.0'
|
||||
implementation 'androidx.multidex:multidex:2.0.1'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.1'
|
||||
implementation 'com.google.android.material:material:1.12.0'
|
||||
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
|
||||
implementation ('androidx.preference:preference:1.2.1') {
|
||||
@@ -219,7 +219,7 @@ dependencies {
|
||||
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel-ktx'
|
||||
}
|
||||
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
|
||||
implementation 'androidx.exifinterface:exifinterface:1.3.7'
|
||||
implementation 'androidx.exifinterface:exifinterface:1.4.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.2'
|
||||
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.2'
|
||||
@@ -234,51 +234,47 @@ dependencies {
|
||||
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
|
||||
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library
|
||||
implementation 'com.google.code.gson:gson:2.12.1' // used as JSON library.
|
||||
implementation "me.leolin:ShortcutBadger:1.1.16" // display messagecount on the home screen icon.
|
||||
implementation 'com.jpardogo.materialtabstrip:library:1.0.9' // used in the emoji selector for the tab selection.
|
||||
implementation 'com.github.chrisbanes:PhotoView:2.1.3' // does the zooming on photos / media
|
||||
implementation 'com.github.penfeizhou.android.animation:awebp:3.0.2' // animated webp support.
|
||||
implementation 'com.github.Baseflow:PhotoView:2.3.0' // does the zooming on photos / media
|
||||
implementation 'com.github.penfeizhou.android.animation:awebp:3.0.5' // animated webp support.
|
||||
implementation 'com.caverock:androidsvg-aar:1.4' // SVG support.
|
||||
implementation 'com.github.bumptech.glide:glide:4.12.0'
|
||||
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
|
||||
implementation 'com.github.bumptech.glide:glide:4.16.0'
|
||||
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
|
||||
annotationProcessor 'androidx.annotation:annotation:1.9.1'
|
||||
implementation 'com.makeramen:roundedimageview:2.1.0' // crops the avatars to circles
|
||||
implementation 'com.pnikosis:materialish-progress:1.5' // used only in the "Progress Wheel" in Share Activity.
|
||||
implementation 'com.makeramen:roundedimageview:2.3.0' // crops the avatars to circles
|
||||
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
|
||||
// the one-letter circle for the contacts (when there is not avatar) and a white background.
|
||||
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
|
||||
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.6.0') { // for the zooming on photos / media
|
||||
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') { // for the zooming on photos / media
|
||||
exclude group: 'com.android.support', module: 'support-annotations'
|
||||
}
|
||||
implementation 'com.annimon:stream:1.1.8' // brings future java streams api to SDK Version < 24
|
||||
|
||||
// Replacement for ContentResolver
|
||||
// that protects against the Surreptitious Sharing attack.
|
||||
// <https://github.com/cketti/SafeContentResolver>
|
||||
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
|
||||
|
||||
gplayImplementation('com.google.firebase:firebase-messaging:24.1.0') { // for PUSH notifications
|
||||
gplayImplementation('com.google.firebase:firebase-messaging:24.1.2') { // for PUSH notifications, don't upgrade: v25.0.0 requires minSdk>=23
|
||||
exclude group: 'com.google.firebase', module: 'firebase-core'
|
||||
exclude group: 'com.google.firebase', module: 'firebase-analytics'
|
||||
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
|
||||
}
|
||||
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.assertj:assertj-core:1.7.1'
|
||||
testImplementation 'org.mockito:mockito-core:1.9.5'
|
||||
testImplementation 'org.powermock:powermock-api-mockito:1.6.1'
|
||||
testImplementation 'org.powermock:powermock-module-junit4:1.6.1'
|
||||
testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1'
|
||||
testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1'
|
||||
testImplementation 'org.assertj:assertj-core:3.27.3'
|
||||
testImplementation 'org.mockito:mockito-core:5.18.0'
|
||||
testImplementation 'org.powermock:powermock-api-mockito:1.7.4'
|
||||
testImplementation 'org.powermock:powermock-module-junit4:2.0.9'
|
||||
testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.9'
|
||||
testImplementation 'org.powermock:powermock-classloading-xstream:2.0.9'
|
||||
|
||||
androidTestImplementation 'androidx.test:runner:1.6.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.6.1'
|
||||
androidTestImplementation 'androidx.test:rules:1.6.1'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
||||
androidTestImplementation 'androidx.test:runner:1.7.0'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.7.0'
|
||||
androidTestImplementation 'androidx.test:rules:1.7.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
|
||||
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
|
||||
|
||||
androidTestImplementation ('org.assertj:assertj-core:1.7.1') {
|
||||
androidTestImplementation ('org.assertj:assertj-core:3.27.3') {
|
||||
exclude group: 'org.hamcrest', module: 'hamcrest-core'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
ArcaneChat is a decentralized and secure messenger app that is compatible with the existing e-mail infrastructure.
|
||||
ArcaneChat is a decentralized and secure instant messenger that is easy to use for friends and family.
|
||||
|
||||
Some features at a glance:
|
||||
• Anonymous. Instant onboarding without a phone number, e-mail or other private data.
|
||||
|
||||
💬 Reliable instant messaging with multi-profile and multi-device support.
|
||||
• Flexible. Supports multiple chat profiles and is easy to setup on multiple devices.
|
||||
|
||||
⚡️ Sign-up easily using secure fast chatmail servers. You don’t need a phone number or any private data.
|
||||
• Extensible. Use mini-apps in chats like shopping lists, calendars or games.
|
||||
|
||||
📧 Alternatively, use your existing classic e-mail address to read your inbox as chats.
|
||||
• Reliable. Works under bad and adversarial network conditions.
|
||||
|
||||
🎮 Interactive mini-apps in chats for gaming and collaboration.
|
||||
• Secure. Audited End-to-End encryption safe against network and server attacks.
|
||||
|
||||
🔒 Audited end-to-end encryption safe against network and server attacks.
|
||||
• Sovereign. Can be run with your own e-mail address or server.
|
||||
|
||||
ArcaneChat is a Delta Chat client and was created with a focus on usability, good user experience, and saving data plan. Also the app usually experiments with new features that eventually might get added to the official Delta Chat client.
|
||||
|
||||
@@ -24,7 +24,7 @@ ArcaneChat is a Delta Chat client and was created with a focus on usability, goo
|
||||
<li>It is possible to disable profiles to completely disconnect them saving data/bandwidth</li>
|
||||
<li>You can easily see the connection status of all your profiles in the profile switcher</li>
|
||||
<li>A videochat instance is set by default</li>
|
||||
<li>Location streaming feature enabled by default and extra option to share location for 12 hours</li>
|
||||
<li>Extra option to share location for 12 hours</li>
|
||||
<li>Clicking on a message with a POI location, will open the POI on the map</li>
|
||||
<li>Last-seen status of contacts is shown in your contact list, like in WhatsApp, Telegram, etc.</li>
|
||||
<li>Videos are played in loop, useful for short GIF videos</li>
|
||||
|
||||
@@ -111,11 +111,11 @@
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1728538411,
|
||||
"narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=",
|
||||
"lastModified": 1744536153,
|
||||
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221",
|
||||
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -138,11 +138,11 @@
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1733970833,
|
||||
"narHash": "sha256-sPEKtSaZk2CtfF9cdhtbY93S6qGq+d2PKI1fcoDfDaI=",
|
||||
"lastModified": 1747017456,
|
||||
"narHash": "sha256-C/U12fcO+HEF071b5mK65lt4XtAIZyJSSJAg9hdlvTk=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "f7f4c59ccdf1bec3f1547d27398e9589aa94e3e8",
|
||||
"rev": "5b07506ae89b025b14de91f697eba23b48654c52",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -19,15 +19,18 @@
|
||||
cmdline-tools-latest
|
||||
platform-tools
|
||||
platforms-android-34
|
||||
ndk-27-0-11902837
|
||||
ndk-27-2-12479018
|
||||
]);
|
||||
rust-version = pkgs.lib.removeSuffix "\n"
|
||||
(builtins.readFile ./scripts/rust-toolchain);
|
||||
in {
|
||||
in
|
||||
{
|
||||
formatter = pkgs.nixpkgs-fmt;
|
||||
|
||||
devShells.default = pkgs.mkShell {
|
||||
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
|
||||
ANDROID_NDK_ROOT =
|
||||
"${android-sdk}/share/android-sdk/ndk/27.0.11902837";
|
||||
"${android-sdk}/share/android-sdk/ndk/27.2.12479018";
|
||||
buildInputs = [
|
||||
android-sdk
|
||||
pkgs.openjdk17
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||
distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -922,15 +922,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_initiateKeyTransfer(JNIEnv *
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_continueKeyTransfer(JNIEnv *env, jobject obj, jint msg_id, jstring setupCode)
|
||||
{
|
||||
CHAR_REF(setupCode);
|
||||
jboolean ret = dc_continue_key_transfer(get_dc_context(env, obj), msg_id, setupCodePtr);
|
||||
CHAR_UNREF(setupCode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcContext_imex(JNIEnv *env, jobject obj, jint what, jstring dir)
|
||||
{
|
||||
CHAR_REF(dir);
|
||||
@@ -1246,6 +1237,12 @@ JNIEXPORT jint Java_com_b44t_messenger_DcChat_getColor(JNIEnv *env, jobject obj)
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isEncrypted(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_chat_is_encrypted(get_dc_chat(env, obj))!=0;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isUnpromoted(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_chat_is_unpromoted(get_dc_chat(env, obj))!=0;
|
||||
@@ -1275,11 +1272,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtected(JNIEnv *env, jobje
|
||||
return dc_chat_is_protected(get_dc_chat(env, obj))!=0;
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtectionBroken(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_chat_is_protection_broken(get_dc_chat(env, obj))!=0;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isSendingLocations(JNIEnv *env, jobject obj)
|
||||
{
|
||||
@@ -1382,11 +1374,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getId(JNIEnv *env, jobject obj)
|
||||
return dc_msg_get_id(get_dc_msg(env, obj));
|
||||
}
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getSenderColor(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_msg_get_sender_color(get_dc_msg(env, obj));
|
||||
}
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getText(JNIEnv *env, jobject obj)
|
||||
{
|
||||
char* temp = dc_msg_get_text(get_dc_msg(env, obj));
|
||||
@@ -1441,6 +1428,12 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getInfoType(JNIEnv *env, jobject ob
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getInfoContactId(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_msg_get_info_contact_id(get_dc_msg(env, obj));
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getState(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_msg_get_state(get_dc_msg(env, obj));
|
||||
@@ -1600,12 +1593,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isInfo(JNIEnv *env, jobject obj
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isSetupMessage(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_msg_is_setupmessage(get_dc_msg(env, obj));
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_hasHtml(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_msg_has_html(get_dc_msg(env, obj))!=0;
|
||||
@@ -1823,15 +1810,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getAddr(JNIEnv *env, jobject
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getNameNAddr(JNIEnv *env, jobject obj)
|
||||
{
|
||||
char* temp = dc_contact_get_name_n_addr(get_dc_contact(env, obj));
|
||||
jstring ret = JSTRING_NEW(temp);
|
||||
dc_str_unref(temp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getProfileImage(JNIEnv *env, jobject obj)
|
||||
{
|
||||
char* temp = dc_contact_get_profile_image(get_dc_contact(env, obj));
|
||||
@@ -1879,6 +1857,12 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isVerified(JNIEnv *env, job
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isKeyContact(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_contact_is_key_contact(get_dc_contact(env, obj))==1;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcContact_getVerifierId(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_contact_get_verifier_id(get_dc_contact(env, obj));
|
||||
|
||||
@@ -11,13 +11,13 @@ echo "==================== ANDROID USAGE ===================="
|
||||
grep --exclude={*.apk,*.a,*.o,*.so,strings.xml,*symbols.zip} --exclude-dir={.git,.gradle,obj,release,.idea,build,deltachat-core-rust} -ri $TEXT .
|
||||
|
||||
echo "==================== IOS USAGE ===================="
|
||||
grep --exclude=*.strings --exclude-dir={.git,libraries,Pods,deltachat-ios.xcodeproj,deltachat-ios.xcworkspace} -ri $TEXT ../deltachat-ios/
|
||||
grep --exclude=*.strings* --exclude-dir={.git,libraries,Pods,deltachat-ios.xcodeproj,deltachat-ios.xcworkspace} -ri $TEXT ../deltachat-ios/
|
||||
|
||||
echo "==================== DESKTOP USAGE ===================="
|
||||
grep --exclude-dir={.cache,.git,html-dist,node_modules,_locales} -ri $TEXT ../deltachat-desktop/
|
||||
|
||||
echo "==================== JSONRPC USAGE ===================="
|
||||
grep --exclude-dir={.git} -ri $TEXT ../deltachat-core-rust/deltachat-jsonrpc
|
||||
grep --exclude-dir={.git} -ri $TEXT ../chatmail/core/deltachat-jsonrpc
|
||||
|
||||
echo "==================== UBUNTU TOUCH USAGE ===================="
|
||||
grep --exclude-dir={.git} -ri $TEXT ../deltatouch/
|
||||
|
||||
@@ -53,7 +53,6 @@ fi
|
||||
# for reproducible build:
|
||||
export RUSTFLAGS="-C link-args=-Wl,--build-id=none --remap-path-prefix=$HOME/.cargo= --remap-path-prefix=$(realpath $(dirname $(dirname "$0")))="
|
||||
export SOURCE_DATE_EPOCH=1
|
||||
export CARGO_TARGET_DIR=/tmp/arcanechat-build
|
||||
# always use the same path to NDK:
|
||||
rm -f /tmp/android-ndk-root
|
||||
ln -s "$ANDROID_NDK_ROOT" /tmp/android-ndk-root
|
||||
@@ -74,6 +73,10 @@ if test -z "$NDK_HOST_TAG"; then
|
||||
NDK_HOST_TAG="$KERNEL-$ARCH"
|
||||
fi
|
||||
|
||||
if test -z "$CARGO_TARGET_DIR"; then
|
||||
export CARGO_TARGET_DIR=/tmp/arcanechat-build
|
||||
fi
|
||||
|
||||
TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$NDK_HOST_TAG"
|
||||
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang"
|
||||
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/aarch64-linux-android21-clang"
|
||||
@@ -127,7 +130,7 @@ if test -z $1 || test $1 = armeabi-v7a; then
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi
|
||||
cp $CARGO_TARGET_DIR/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
|
||||
cp "$CARGO_TARGET_DIR/armv7-linux-androideabi/$RELEASE/libdeltachat.a" "$jnidir/armeabi-v7a"
|
||||
fi
|
||||
|
||||
if test -z $1 || test $1 = arm64-v8a; then
|
||||
@@ -136,7 +139,7 @@ if test -z $1 || test $1 = arm64-v8a; then
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi
|
||||
cp $CARGO_TARGET_DIR/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
|
||||
cp "$CARGO_TARGET_DIR/aarch64-linux-android/$RELEASE/libdeltachat.a" "$jnidir/arm64-v8a"
|
||||
fi
|
||||
|
||||
if test -z $1 || test $1 = x86; then
|
||||
@@ -145,17 +148,17 @@ if test -z $1 || test $1 = x86; then
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi
|
||||
cp $CARGO_TARGET_DIR/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
|
||||
cp "$CARGO_TARGET_DIR/i686-linux-android/$RELEASE/libdeltachat.a" "$jnidir/x86"
|
||||
fi
|
||||
|
||||
if test -z $1 || test $1 = x86_64; then
|
||||
echo "-- cross compiling to x86_64-linux-android (x86_64) --"
|
||||
TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi
|
||||
cp $CARGO_TARGET_DIR/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
|
||||
fi
|
||||
if test -z $1 || test $1 = x86_64; then
|
||||
echo "-- cross compiling to x86_64-linux-android (x86_64) --"
|
||||
TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \
|
||||
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
|
||||
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
|
||||
cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi
|
||||
cp "$CARGO_TARGET_DIR/x86_64-linux-android/$RELEASE/libdeltachat.a" "$jnidir/x86_64"
|
||||
fi
|
||||
|
||||
echo -- ndk-build --
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
# replace Delta Chat with ArcaneChat
|
||||
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/get.delta.chat/github.com\/ArcaneChat/g'
|
||||
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/Delta Chat/ArcaneChat/g'
|
||||
|
||||
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'
|
||||
|
||||
@@ -1 +1 @@
|
||||
1.83.0
|
||||
1.86.0
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/github.com\/ArcaneChat/get.delta.chat/g'
|
||||
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/ArcaneChat/Delta Chat/g'
|
||||
|
||||
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'
|
||||
|
||||
# don't revert the app name
|
||||
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
|
||||
|
||||
@@ -78,17 +78,6 @@
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
||||
android:exported="true">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<action android:name="android.intent.action.GET_CONTENT"/>
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="content"/>
|
||||
<data android:scheme="file"/>
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:mimeType="application/octet-stream" />
|
||||
</intent-filter>
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
@@ -224,8 +213,6 @@
|
||||
|
||||
<intent-filter>
|
||||
<data android:scheme="mailto"/>
|
||||
<data android:scheme="http"/>
|
||||
<data android:scheme="https"/>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
@@ -300,6 +287,10 @@
|
||||
android:theme="@style/TextSecure.LightNoActionBar"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
<activity android:name=".AllMediaActivity"
|
||||
android:theme="@style/TextSecure.LightNoActionBar"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
<activity android:name=".DummyActivity"
|
||||
android:theme="@android:style/Theme.NoDisplay"
|
||||
android:enabled="true"
|
||||
@@ -379,6 +370,13 @@
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||
</activity>
|
||||
|
||||
<activity android:name=".videochat.VideochatActivity"
|
||||
android:label=""
|
||||
android:theme="@style/TextSecure.LightTheme"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
|
||||
android:exported="true">
|
||||
</activity>
|
||||
|
||||
<activity android:name=".WebxdcActivity"
|
||||
android:label=""
|
||||
android:theme="@style/TextSecure.LightTheme"
|
||||
@@ -511,5 +509,8 @@
|
||||
<intent>
|
||||
<action android:name="android.media.action.IMAGE_CAPTURE" />
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.TTS_SERVICE" />
|
||||
</intent>
|
||||
</queries>
|
||||
</manifest>
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
<li><a href="#wer-sieht-mein-profilbild">Wer sieht mein Profilbild?</a></li>
|
||||
<li><a href="#signature">Kann ich eine Signatur (Status/Motto) festlegen?</a></li>
|
||||
<li><a href="#was-bedeutet-anheften-stummschalten-archivieren">Was bedeutet Anheften, Stummschalten, Archivieren?</a></li>
|
||||
<li><a href="#save">Wie funktionieren “Gespeicherte Nachrichten”?</a></li>
|
||||
<li><a href="#was-bedeutet-der-grüne-punkt">Was bedeutet der grüne Punkt?</a></li>
|
||||
<li><a href="#edit">Schreibfehler korrigieren und Nachrichten nach dem Senden löschen</a></li>
|
||||
<li><a href="#ephemeralmsgs">Wie funktionieren “Verschwindende Nachrichten”?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -34,29 +36,25 @@
|
||||
<li><a href="#warum-integriert-sich-delta-chat-in-zentralisierte-proprietäre-applegoogle-push-dienste">Warum integriert sich Delta Chat in zentralisierte, proprietäre Apple/Google-Push-Dienste?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#verschlüsselung-und-sicherheit">Verschlüsselung und Sicherheit</a>
|
||||
<li><a href="#e2ee">Verschlüsselung und Sicherheit</a>
|
||||
<ul>
|
||||
<li><a href="#welche-standards-werden-für-die-ende-zu-ende-verschlüsselung-verwendet">Welche Standards werden für die Ende-zu-Ende-Verschlüsselung verwendet?</a></li>
|
||||
<li><a href="#whene2e">Wie kann ich wissen, ob Nachrichten Ende-zu-Ende-verschlüsselt sind?</a></li>
|
||||
<li><a href="#howtoe2ee">Wie kann ich garantierte Ende-zu-Ende-Verschlüsselung und grüne Häkchen erhalten?</a></li>
|
||||
<li><a href="#e2eeguarantee">Was bedeuten das “Grüne Häkchen” und die “garantierte Ende-zu-Ende-Verschlüsselung”?</a></li>
|
||||
<li><a href="#nocryptanymore">Ein Kontakt hat eine Nachricht von einem anderen Gerät gesendet”, was kann ich tun?</a></li>
|
||||
<li><a href="#kann-ich-e-mails-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden">Kann ich E-Mails ohne Ende-zu-Ende-Verschlüsselung empfangen oder senden?</a></li>
|
||||
<li><a href="#howtoe2ee">Wie kann ich einen Chat mit einem neuen Kontakt erstellen?</a></li>
|
||||
<li><a href="#e2eeguarantee">Was bedeutet das grüne Häkchen in einem Kontaktprofil?</a></li>
|
||||
<li><a href="#sind-anhänge-bilder-dateien-audio-usw-ende-zu-ende-verschlüsselt">Sind Anhänge (Bilder, Dateien, Audio usw.) Ende-zu-Ende-verschlüsselt?</a></li>
|
||||
<li><a href="#openpgp-secure">Ist OpenPGP sicher?</a></li>
|
||||
<li><a href="#openpgp-alternatives">Wurden Alternativen zu OpenPGP für die Ende-zu-Ende-Verschlüsselung in Betracht gezogen?</a></li>
|
||||
<li><a href="#ist-delta-chat-anfällig-für-efail">Ist Delta Chat anfällig für EFAIL?</a></li>
|
||||
<li><a href="#tls">Wird eine Nachricht im Klartext gesendet, wenn keine Ende-zu-Ende-Verschlüsselung verfügbar ist?</a></li>
|
||||
<li><a href="#tls">Sind mit dem Mail-Symbol markierte Nachrichten im Internet sichtbar?</a></li>
|
||||
<li><a href="#message-metadata">Wie schützt Delta Chat Metadaten in Nachrichten?</a></li>
|
||||
<li><a href="#device-seizure">Wie schützt man Metadaten und Kontakte, wenn ein Gerät beschlagnahmt wird?</a></li>
|
||||
<li><a href="#wie-kann-ich-die-verschlüsselungsinformationen-überprüfen">Wie kann ich die Verschlüsselungsinformationen überprüfen?</a></li>
|
||||
<li><a href="#wie-kann-ich-den-verschlüsselungsstatus-von-nachrichten-überprüfen">Wie kann ich den Verschlüsselungsstatus von Nachrichten überprüfen?</a></li>
|
||||
<li><a href="#warum-sehe-ich-unverschlüsselte-nachrichten">Warum sehe ich unverschlüsselte Nachrichten?</a></li>
|
||||
<li><a href="#wie-kann-ich-einen-ende-zu-ende-verschlüsselten-chat-mit-einem-delta-chat-kontakt-führen-der-manchmal-webmail-oder-eine-andere-e-mail-anwendung-ohne-autocrypt-verwendet">Wie kann ich einen Ende-zu-Ende-verschlüsselten Chat mit einem Delta-Chat-Kontakt führen, der manchmal Webmail oder eine andere E-Mail-Anwendung ohne Autocrypt verwendet?</a></li>
|
||||
<li><a href="#wie-kann-ich-ende-zu-ende-verschlüsselung-und-löschen-von-nachrichten-sicherstellen">Wie kann ich Ende-zu-Ende-Verschlüsselung und Löschen von Nachrichten sicherstellen?</a></li>
|
||||
<li><a href="#sealedsender">Unterstützt Delta Chat „Sealed Sender“?</a></li>
|
||||
<li><a href="#pfs">Unterstützt Delta Chat “Perfect Forward Secrecy”?</a></li>
|
||||
<li><a href="#ist-die-ende-zu-ende-verschlüsselung-von-delta-chat-genauso-sicher-wie-die-von-signal">Ist die Ende-zu-Ende-Verschlüsselung von Delta Chat genauso sicher wie die von Signal?</a></li>
|
||||
<li><a href="#pqc">Unterstützt Delta Chat Post-Quantum-Verschlüsselung?</a></li>
|
||||
<li><a href="#wie-kann-ich-die-verschlüsselung-manuell-überprüfen">Wie kann ich die Verschlüsselung manuell überprüfen?</a></li>
|
||||
<li><a href="#importkey">Kann ich meinen existierenden privaten Schlüssel weiter verwenden?</a></li>
|
||||
<li><a href="#ich-kann-meinen-existierenden-pgp-schlüssel-nicht-in-delta-chat-importieren">Ich kann meinen existierenden PGP-Schlüssel nicht in Delta Chat importieren.</a></li>
|
||||
<li><a href="#security-audits">Wurde Delta Chat unabhängig auf Sicherheitslücken geprüft?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -65,6 +63,7 @@
|
||||
<li><a href="#kann-ich-delta-chat-auf-mehreren-geräten-zur-selben-zeit-verwenden">Kann ich Delta Chat auf mehreren Geräten zur selben Zeit verwenden?</a></li>
|
||||
<li><a href="#fehlersuche">Fehlersuche</a></li>
|
||||
<li><a href="#backup">Manueller Transfer</a></li>
|
||||
<li><a href="#wird-löschen-anheften-archivieren-speichern-stummschalten-usw-über-alle-geräte-synchronisiert">Wird Löschen, Anheften, Archivieren, Speichern, Stummschalten usw. über alle Geräte synchronisiert?</a></li>
|
||||
<li><a href="#gibt-es-pläne-für-eine-delta-chat-web-anwendung">Gibt es Pläne für eine Delta-Chat-Web-Anwendung?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -88,7 +87,7 @@
|
||||
<ul>
|
||||
<li><a href="#welche-app-berechtigungen-benötigt-delta-chat">Welche App-Berechtigungen benötigt Delta Chat?</a></li>
|
||||
<li><a href="#funktioniert-delta-chat-mit-meinem-e-mail-anbieter">Funktioniert Delta Chat mit <em>meinem</em> E-Mail-Anbieter?</a></li>
|
||||
<li><a href="#ich-möchte-meinen-eigenen-e-mail-server-für-delta-chat-verwalten-gibt-es-empfehlungen">Ich möchte meinen eigenen E-Mail-Server für Delta Chat verwalten. Gibt es Empfehlungen?</a></li>
|
||||
<li><a href="#ich-möchte-meinen-eigenen-server-für-delta-chat-verwalten-gibt-es-empfehlungen">Ich möchte meinen eigenen Server für Delta Chat verwalten. Gibt es Empfehlungen?</a></li>
|
||||
<li><a href="#weshalb-muss-ich-mein-e-mail-kennwort-in-delta-chat-eingeben-ist-das-sicher">Weshalb muss ich mein E-Mail-Kennwort in Delta Chat eingeben? Ist das sicher?</a></li>
|
||||
<li><a href="#welche-nachrichten-erscheinen-in-delta-chat">Welche Nachrichten erscheinen in Delta Chat?</a></li>
|
||||
<li><a href="#unterstützt-delta-chat-html-e-mails">Unterstützt Delta Chat HTML-E-Mails?</a></li>
|
||||
@@ -96,7 +95,7 @@
|
||||
<li><a href="#was-macht-die-option-kopie-an-mich-selbst-senden">Was macht die Option “Kopie an mich selbst senden”?</a></li>
|
||||
<li><a href="#warum-gibt-es-die-funktion-gesendet-ordner-beobachten">Warum gibt es die Funktion “Gesendet-Ordner beobachten”?</a></li>
|
||||
<li><a href="#warum-kann-ich-deltachat-ordner-beobachten-ausschalten">Warum kann ich “DeltaChat-Ordner beobachten” ausschalten?</a></li>
|
||||
<li><a href="#ist-delta-chat-kompatibel-mit-protonmail--tutanota--criptext">Ist Delta Chat kompatibel mit Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#ist-delta-chat-kompatibel-mit-proton-mail--tutanota--criptext">Ist Delta Chat kompatibel mit Proton Mail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#remove-account">Wie kann ich mein Konto löschen?</a></li>
|
||||
<li><a href="#ich-bin-an-technischen-details-interessiert-gibt-es-hierzu-weitere-infos">Ich bin an technischen Details interessiert. Gibt es hierzu weitere Infos?</a></li>
|
||||
<li><a href="#wo-können-meine-freunde-delta-chat-finden">Wo können meine Freunde Delta Chat finden?</a></li>
|
||||
@@ -164,7 +163,7 @@ sicher gegen Netzwerk- und Serverangriffe.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Freie und quelloffene Software, sowohl app- als auch serverseitig.
|
||||
Basiert auf <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">E-Mail- und Web-Internet-Standards</a>,
|
||||
Basiert auf <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">E-Mail- und Web-Internet-Standards</a>,
|
||||
um das <a href="https://xkcd.com/927/">„Noch-ein-Standard-Syndrom“ (xkcd 927)</a> zu vermeiden.</p>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -177,10 +176,20 @@ um das <a href="https://xkcd.com/927/">„Noch-ein-Standard-Syndrom“ (xkcd 927
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Wenn eine Nachricht von einem unbekannten Kontakt stammt, erscheint sie als <strong>Anfrage</strong>.</p>
|
||||
|
||||
<ul>
|
||||
<li>Wenn eine Nachricht von einem unbekannten Kontakt stammt, erscheint sie als <strong>Anfrage</strong>. Sie müssen die Anfrage akzeptieren, bevor Sie antworten können.</li>
|
||||
<li>Sie können sie auch “löschen”, wenn Sie vorerst nicht mit ihm chatten möchten. Dadurch wird die Nachricht <em>nicht</em> auf dem Server gelöscht, sondern nur auf Ihrem Gerät. Sie können die Nachricht also weiterhin in einer anderen E-Mail-App bearbeiten.</li>
|
||||
<li>Wenn Sie eine Anfrage löschen, werden zukünftige Nachrichten von diesem Kontakt weiterhin als Nachrichtenanfrage angezeigt, sodass Sie Ihre Meinung ändern können. Wenn Sie wirklich keine Nachrichten von dieser Person erhalten möchten, sollten Sie sie <em>blockieren</em>.</li>
|
||||
<li>
|
||||
<p>Sie müssen die Anfrage <strong>akzeptieren</strong>, bevor Sie antworten können.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sie können sie auch “löschen”, wenn Sie vorerst nicht mit ihm chatten möchten.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you delete a request, future messages from that contact will still appear
|
||||
as message request, so you can change your mind. If you really don’t want to
|
||||
receive messages from this person, consider <strong>blocking</strong> them.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="unterstützt-delta-chat-bilder-videos-und-dateianhänge">
|
||||
@@ -193,7 +202,7 @@ um das <a href="https://xkcd.com/927/">„Noch-ein-Standard-Syndrom“ (xkcd 927
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Ja. Alle E-Mail-Anhänge werden als separate Nachrichten angezeigt. Ausgehende Nachrichten erhalten bei Bedarf automatisch Anhänge.</p>
|
||||
<p>Ja. Bilder, Videos, Dokumente, Sprachnachrichten usw. funktionieren wie üblich.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Um die Leistung zu verbessern, werden die Bilder standardmäßig optimiert und in einer kleineren Größe gesendet, aber Sie können sie auch als “Datei” senden, um das Original zu erhalten.</p>
|
||||
@@ -289,6 +298,41 @@ unter dem Text Ihrer Nachrichten.</p>
|
||||
|
||||
<p>Um die Funktionen zu nutzen, lang auf einen Chat in der Chatliste tippen oder den Chat mit der rechten Maustaste anklicken.</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
Wie funktionieren “Gespeicherte Nachrichten”? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Gespeicherte Nachrichten</strong> ist ein Chat, den Sie verwenden können, um sich Nachrichten zu merken und wiederzufinden.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Tippen Sie in einem beliebigen Chat lange auf eine Nachricht oder klicken Sie mit der rechten Maustaste darauf und wählen <strong>Speichern</strong>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Gespeicherte Nachrichten werden mit dem Symbol
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
|
||||
neben dem Datum markiert</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Öffnen Sie später den Chat „Gespeicherte Nachrichten“, sehen Sie dort die gespeicherten Nachrichten.
|
||||
Durch Tippen auf <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
|
||||
können Sie zu der ursprünglichen Nachricht im ursprünglichen Chat zurückkehren</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Schließlich können Sie auch „Gespeicherte Nachrichten“ verwenden, um <strong>persönliche Notizen</strong> zu machen - öffnen Sie den Chat, geben Sie etwas ein, fügen Sie ein Foto oder eine Sprachnachricht hinzu usw.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Da „Gespeicherte Nachrichten“ synchronisiert werden, können sie sehr praktisch für die Übertragung von Daten zwischen Geräten sein</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Nachrichten bleiben gespeichert, auch wenn sie bearbeitet oder gelöscht werden -
|
||||
sei es durch den <a href="#edit">Absender</a>, durch <a href="#delold">Automatisches Löschen</a> oder durch <a href="#ephemeralmsgs">verschwindende Nachrichten anderer Chats</a>.</p>
|
||||
|
||||
<h3 id="was-bedeutet-der-grüne-punkt">
|
||||
|
||||
|
||||
@@ -297,19 +341,45 @@ unter dem Text Ihrer Nachrichten.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sie können manchmal einen “grünen Punkt” <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> neben dem Avatar eines Kontakts sehen. Es bedeutet, dass der Kontakt <strong>kürzlich gesehen</strong> wurde, in den letzten 10 Minuten:</p>
|
||||
|
||||
<ul>
|
||||
<li>Seit Delta Chat 1.34 sehen Sie manchmal einen “grünen Punkt” neben dem Avatar eines Kontakts. Es bedeutet, dass der Kontakt “kürzlich gesehen” wurde.</li>
|
||||
<li>Im Detail: Das bedeutet, dass Delta Chat den Kontakt in den letzten 10 Minuten gesehen hat:
|
||||
<ul>
|
||||
<li>entweder weil der Kontakt Ihnen direkt eine Nachricht gesendet hat,</li>
|
||||
<li>weil der Kontakt etwas an eine Gruppe geschrieben hat, in der sie beide Mitglied sind,</li>
|
||||
<li>weil der Kontakt Ihnen eine Lesebestätigung für eine von Ihnen geschriebene Nachricht gesendet hat</li>
|
||||
<li>oder weil der Kontakt Daten mithilfe einer <a href="#webxdc">Webxdc-App</a> an Ihre Delta-Chat-App gesendet hat.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Dies ist also kein Echtzeit-Online-Status - und wenn jemand nicht sofort antwortet, obwohl er online zu sein scheint, machen Sie sich keine Sorgen und geben Sie ihm etwas Raum. ;-)</li>
|
||||
<li>Andererseits werden andere nicht immer “sehen, dass Sie online sind”. Wenn Sie Lesebestätigungen deaktiviert haben, sehen sie den grünen Punkt erst, wenn Sie ihnen eine Nachricht senden oder einer Gruppe schreiben, in der sie sich ebenfalls befinden.</li>
|
||||
<li>entweder weil der Kontakt Ihnen direkt eine Nachricht gesendet hat,</li>
|
||||
<li>weil der Kontakt etwas an eine Gruppe geschrieben hat, in der sie beide Mitglied sind,</li>
|
||||
<li>weil der Kontakt Ihnen eine Lesebestätigung für eine von Ihnen geschriebene Nachricht gesendet hat</li>
|
||||
<li>weil der Kontakt eine Nachricht bearbeitet oder gelöscht hat</li>
|
||||
<li>oder weil der Kontakt Daten mithilfe einer <a href="#webxdc">App</a> in einem geteilten Chat gesendet hat.</li>
|
||||
</ul>
|
||||
|
||||
<p>Dies ist also kein Echtzeit-Online-Status - und wenn jemand nicht sofort antwortet, obwohl er online zu sein scheint, machen Sie sich keine Sorgen und geben Sie ihm etwas Raum. ;-)</p>
|
||||
|
||||
<p>Andererseits werden andere nicht immer “sehen, dass Sie online sind”. Wenn Sie Lesebestätigungen deaktiviert haben, sehen sie den grünen Punkt erst, wenn einer der oben aufgeführten Punkte erfüllt ist.</p>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Schreibfehler korrigieren und Nachrichten nach dem Senden löschen <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Sie können den Text Ihrer Nachrichten nach dem Senden bearbeiten.
|
||||
Tippen Sie dazu lange auf die Nachricht oder klicken Sie mit der rechten Maustaste auf die Nachricht und wählen Sie <strong>Bearbeiten</strong> oder <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" /></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Wenn Sie versehentlich eine Nachricht gesendet haben,
|
||||
wählen Sie im selben Menü <strong>Löschen</strong> und dann <strong>Für alle löschen</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Während bei bearbeiteten Nachrichten das „Bearbeitet“ neben dem Datum erscheint,
|
||||
werden gelöschte Nachrichten ohne Markierung im Chat entfernt.
|
||||
Es werden keine Benachrichtigungen verschickt und es gibt kein Zeitlimit.</p>
|
||||
|
||||
<p>Beachten Sie, dass die ursprüngliche Nachricht dennoch von Chatteilnehmern empfangen werden konnte,
|
||||
die die Nachricht bereits beantwortet, weitergeleitet, gespeichert, mit einem Screenshot versehen oder anderweitig kopiert haben könnten.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
@@ -600,7 +670,7 @@ keine privaten Informationen preisgeben, die den zentralen Push-Diensten nicht b
|
||||
|
||||
<p>Delta Chat ist ein freier, quelloffener, dezentraler Messenger mit freier Serverwahl,
|
||||
aber wir wollen, dass die Nutzer eine zuverlässige „Sofortzustellung“ von Nachrichten haben,
|
||||
wie sie es von Whatsapp, Signal oder Telegram kennen,
|
||||
wie sie es von WhatsApp, Signal oder Telegram kennen,
|
||||
ohne im Vorfeld Fragen zu stellen, die eher für erfahrene Nutzer oder Entwickler geeignet sind.</p>
|
||||
|
||||
<p>Beachten Sie, dass Delta Chat ein <a href="#privacy-notifications">kleines, die Privatsphäre wahrendes Push-Benachrichtigungssystem</a>
|
||||
@@ -608,10 +678,10 @@ hat, das eine „sofortige Zustellung“ von Nachrichten für alle Chatmail-Serv
|
||||
Einschließlich dem Chatmail-Server, <a href="https://delta.chat/chatmail#selfhosted">den Sie selbst ohne unsere Erlaubnis einrichten könnten</a>.
|
||||
Willkommen bei der Macht des interoperablen und massiven Chatmail- und E-Mail-Systems :)</p>
|
||||
|
||||
<h2 id="verschlüsselung-und-sicherheit">
|
||||
<h2 id="e2ee">
|
||||
|
||||
|
||||
Verschlüsselung und Sicherheit <a href="#verschlüsselung-und-sicherheit" class="anchor"></a>
|
||||
Verschlüsselung und Sicherheit <a href="#e2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
@@ -624,17 +694,23 @@ Willkommen bei der Macht des interoperablen und massiven Chatmail- und E-Mail-Sy
|
||||
|
||||
</h3>
|
||||
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> wird verwendet, um automatisch
|
||||
eine Ende-zu-Ende-Verschlüsselung mit Kontakten und Gruppenchats herzustellen.
|
||||
Autocrypt verwendet eine begrenzte und <a href="#openpgp-secure">sichere Untermenge des OpenPGP-Standards</a>.
|
||||
Ende-zu-Ende-verschlüsselte Nachrichten sind mit einem Vorhängeschloss gekennzeichnet <img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" /></p>
|
||||
<p>Delta Chat verwendet eine <a href="#openpgp-secure">sichere Teilmenge des OpenPGP-Standards</a>, um eine automatische End-to-End-Verschlüsselung mit folgenden Protokollen bereitzustellen:</p>
|
||||
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join-Protokolle</a>
|
||||
werden für Chats mit garantierter Ende-zu-Ende-Verschlüsselung verwendet,
|
||||
die vor Netzwerkangriffen und kompromittierten Servern schützt.
|
||||
Chats, die mit einem grünen Häkchen markiert sind
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
garantieren Ende-zu-Ende-verschlüsselte Nachrichten.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a>
|
||||
zum Austausch von Verschlüsselungsinformationen durch Scannen von QR-Codes oder „Einladungslinks“.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> wird verwendet, um automatisch eine Ende-zu-Ende-Verschlüsselung zwischen Kontakten und allen Mitgliedern einer Gruppe herzustellen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Teilen eines Kontakts im Chat</a>
|
||||
ermöglicht es den Empfängern, eine Ende-zu-Ende-Verschlüsselung mit dem Kontakt zu verwenden.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Delta Chat fragt keine OpenPGP-Keyserver ab, veröffentlicht dort keine Daten und interagiert auch sonst nicht mit diesen.</p>
|
||||
|
||||
<h3 id="whene2e">
|
||||
|
||||
@@ -644,28 +720,36 @@ garantieren Ende-zu-Ende-verschlüsselte Nachrichten.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ende-zu-Ende-verschlüsselten Nachrichten sind mit einem Vorhängeschloss versehen:</p>
|
||||
|
||||
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
|
||||
|
||||
<p>Die Ende-zu-Ende-Verschlüsselung ist garantiert, wenn neben dem Chat-Titel ein grünes Häkchen zu sehen ist:</p>
|
||||
|
||||
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
|
||||
<p>All messages in Delta Chat are <strong>end-to-end encrypted by default</strong>.
|
||||
Since the Delta Chat Version 2 release series (July 2025)
|
||||
there are no lock or similar markers on end-to-end encrypted messages, anymore.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
<h3 id="kann-ich-e-mails-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden">
|
||||
|
||||
|
||||
Wie kann ich garantierte Ende-zu-Ende-Verschlüsselung und grüne Häkchen erhalten? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Kann ich E-Mails ohne Ende-zu-Ende-Verschlüsselung empfangen oder senden? <a href="#kann-ich-e-mails-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Wenn Sie einen zweiten Kommunikationskanal mit Ihrem Chatpartner haben,
|
||||
wie einen Video-Chat oder einen anderen Messenger,
|
||||
können Sie einen Einladungslink erstellen.</p>
|
||||
<p>Wenn Sie die Standard-<a href="https://chatmail.at/relays">Chatmail-Relays</a> verwenden, ist es unmöglich, Nachrichten ohne End-to-End-Verschlüsselung zu empfangen oder zu senden.</p>
|
||||
|
||||
<p>Wenn Sie persönlich zusammen sind,
|
||||
können Sie Ihrem Chat-Partner einen QR-Code zeigen.</p>
|
||||
<p>Wenn Sie stattdessen ein Profil mit einem klassischen E-Mail-Server erstellen,
|
||||
können Sie Nachrichten ohne End-to-End-Verschlüsselung senden und empfangen.
|
||||
Solche Nachrichten werden mit einem E-Mail-Symbol gekennzeichnet
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
Wie kann ich einen Chat mit einem neuen Kontakt erstellen? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can send an invite link through another private chat,
|
||||
show an invitation QR code when next to each other or in a video call,
|
||||
or click on a “contact” that was shared in a chat.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -674,133 +758,60 @@ tippen Sie auf den Titel der Gruppe, um die Mitgliederliste anzuzeigen,
|
||||
und wählen Sie „QR-Einladungscode“.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Für <strong>Direktchat-Einladungen</strong>,
|
||||
tippen Sie auf das QR-Code-Symbol <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
|
||||
auf dem Hauptbildschirm der Delta-Chat-App.</p>
|
||||
<p>For <strong>direct 1:1 chat invitations</strong>,
|
||||
tap the QR Code icon <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
|
||||
on the Delta Chat app main screen.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Lassen Sie Ihren Chat-Partner den QR-Code mit der Delta-Chat-App scannen.
|
||||
Oder Sie klicken auf „Kopieren“ oder „Teilen“, um einen Einladungslink zu erstellen und diesen mit Ihrem Chat-Partner zu teilen.</p>
|
||||
<p>Ask your chat partner to scan the QR image
|
||||
with their Delta Chat app,
|
||||
or click “Copy” or “Share” to create an invite link
|
||||
and share it with your chat partner.</p>
|
||||
|
||||
<p>Warten Sie nun, während das <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">Secure-Join-Protokoll</a> zwischen beiden Geräten abläuft.</p>
|
||||
<p>Now wait while <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">end-to-end encryption is getting established</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Wenn beide Geräte online sind,
|
||||
sehen beide Seiten schließlich einen Gruppen- oder Direkt-Chat mit einem grünen Häkchen
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
neben dem Titel.</p>
|
||||
<p>If both sides are online, they will soon see a (group or direct) chat
|
||||
and can start messaging securely.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Wenn eines der Geräte offline ist, erscheinen die grünen Häkchen erst
|
||||
später, wenn das Gerät wieder mit dem Internet verbunden ist
|
||||
und das Secure-Join-Protokoll abgeschlossen werden kann.</p>
|
||||
<p>If one side is offline or in bad network,
|
||||
the ability to chat is delayed until connectivity is restored.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Herzlichen Glückwunsch! 🎉
|
||||
Sie verwenden nun eine garantierte Ende-zu-Ende-Verschlüsselung
|
||||
mit diesem Kontakt und Sie beide können sich gegenseitig zu grün markierten Gruppen hinzufügen
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />,
|
||||
Dadurch wird die garantierte Ende-zu-Ende-Verschlüsselung automatisch unter den Mitgliedern dieser Gruppe verbreitet.</p>
|
||||
<p>Congratulations!
|
||||
You now will automatically use end-to-end encryption
|
||||
with this contact.
|
||||
If you add each other to chat groups,
|
||||
end-to-end encryption will be established among all members.</p>
|
||||
|
||||
<h3 id="e2eeguarantee">
|
||||
|
||||
|
||||
Was bedeuten das “Grüne Häkchen” und die “garantierte Ende-zu-Ende-Verschlüsselung”? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
Was bedeutet das grüne Häkchen in einem Kontaktprofil? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Chat-Titel mit grünen Häkchen</strong>
|
||||
<p>A contact profile might show a green checkmark
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
bedeuten, dass alle Nachrichten im Chat Ende-zu-Ende-verschlüsselt werden
|
||||
und nicht von kompromittierten E-Mail-Servern oder Internet-Providern gelesen oder verändert werden können.
|
||||
Beim Beitritt zu Gruppenchats mit grünen Häkchen
|
||||
werden Verschlüsselungsinformationen (und die grünen Häkchen) aller Teilnehmer sicher so weitergegeben,
|
||||
dass die Ende-zu-Ende-Verschlüsselung in der Gruppe und zwischen den Mitgliedern garantiert werden kann.</p>
|
||||
|
||||
<p><strong>Kontaktprofile mit grünen Häkchen</strong>
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
bedeuten, dass die Nachrichtenübermittlung an einen Kontakt derzeit garantiert Ende-zu-Ende-verschlüsselt ist.
|
||||
Jeder grün markierte Kontakt hat entweder einen direkten <a href="#howtoe2ee">QR-Scan</a> mit Ihnen durchgeführt
|
||||
oder wurde von einem anderen Kontakt mit grünem Häkchen eingeführt.
|
||||
Das Einführen geschieht automatisch, wenn Sie Mitglieder zu Gruppen hinzufügen.
|
||||
Wer einen Kontakt zu einer Gruppe mit grünem Häkchen hinzufügt, wird zum Einführenden
|
||||
für die Mitglieder, die noch nichts von dem hinzugefügten Kontakt wussten.
|
||||
In einem Kontaktprofil können Sie wiederholt auf den Text “Eingeführt von …” tippen
|
||||
bis Sie zu demjenigen gelangen, mit dem Sie einen direkten <a href="#howtoe2ee">QR-Scan</a> gemacht haben.</p>
|
||||
|
||||
<p>Beachten Sie, dass Sie in einem Kontaktprofil unter Umständen Einführende sehen und antippen können, aber kein grünes Häkchen im Profiltitel vorhanden ist.
|
||||
Dies bedeutet normalerweise, dass der Kontakt <a href="#nocryptanymore">“eine Nachricht von einem anderen Gerät gesendet hat”</a>.</p>
|
||||
and an “Introduced by” line.
|
||||
Every green-checkmarked contact either did a direct <a href="#howtoe2ee">QR-scan</a> with you
|
||||
or was introduced by a another green-checkmarked contact.
|
||||
Introductions happen automatically when adding members to groups.
|
||||
Whoever adds a green-checkmarked contact to a group with only green-checkmarked members
|
||||
becomes an introducer.
|
||||
In a contact profile you can tap on the “Introduced by …” text repeatedly
|
||||
until you get to the one with whom you directly did a <a href="#howtoe2ee">QR-scan</a>.</p>
|
||||
|
||||
<p>Für eine ausführlichere Diskussion der “Garantierten Ende-zu-Ende-Verschlüsselung”,
|
||||
siehe <a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join-Protokolle</a>
|
||||
und dort speziell den Abschnitt zu “Verified Groups”, dem technischen Begriff
|
||||
für “Chats mit grünem Häkchen” oder “Garantierter Ende-zu-Ende-Verschlüsselung”.</p>
|
||||
|
||||
<h3 id="nocryptanymore">
|
||||
|
||||
|
||||
Ein Kontakt hat eine Nachricht von einem anderen Gerät gesendet”, was kann ich tun? <a href="#nocryptanymore" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Wenn Sie diese Warnung sehen, wurde das grüne Häkchen entfernt, da für den Kontakt die Ende-zu-Ende-Verschlüsselung nicht mehr garantiert werden kann.
|
||||
<strong>Wenn Sie den Wegfall der garantierten Ende-zu-Ende-Verschlüsselung
|
||||
für diesen Kontakt überraschend finden, akzeptieren Sie die Warnung nicht!</strong>
|
||||
Versuchen Sie stattdessen mit Ihrem Kontakt über einen zweiten Kanal (z.B. Videoanruf, Telefon oder ein anderer Messenger) herauszufinden, was passiert ist.</p>
|
||||
|
||||
<p>Wenn Ihr Kontakt tatsächlich den Ausfall der garantierten Ende-zu-Ende-Verschlüsselung verursacht hat,
|
||||
finden Sie in den nächsten Abschnitten häufige Gründe und Abhilfe.
|
||||
Unabhängig davon bleiben alle anderen Chats mit einem grünen Häkchen garantiert Ende-zu-Ende-verschlüsselt,
|
||||
auch wenn der Kontakt dort Mitglied ist.</p>
|
||||
|
||||
<p><strong>Ihr Kontakt verwendet Delta Chat auf einem zweiten Gerät (Smartphone oder Laptop)</strong></p>
|
||||
|
||||
<p>Wenn Ihr Kontakt ein weiteres Gerät mit Delta Chat eingerichtet hat,
|
||||
sollte das Konto von dem neuen Gerät entfernen werden und <a href="#multiclient">als zweites Gerät, wie hier beschrieben</a>, erneut hinzugefügt werden.
|
||||
Sobald sie sich danach schreiben, wird die Warnung verschwinden
|
||||
und die Verschlüsselung ist mit beiden Geräten Ihres Kontakts garantiert.</p>
|
||||
|
||||
<p><strong>Ihr Kontakt hat Delta Chat mit seinem alten Login neu installiert</strong></p>
|
||||
|
||||
<p>Wenn Ihr Kontakt <a href="#backup">ein Backup</a> hat,
|
||||
sollte das Profil auf dem neuen Gerät
|
||||
entfernt werden und stattdessen das Backup importiert werden, um das Konto neu zu erstellen.
|
||||
Sobald sie sich danach schreiben, wird die Warnung verschwinden
|
||||
und die garantierte Verschlüsselung wird für diesen Kontakt wiederhergestellt.</p>
|
||||
|
||||
<p>Wenn Ihr Kontakt kein Backup hat, ist es am besten, einen <a href="#howtoe2ee">QR-Code-Scan</a>
|
||||
mit Ihrem Chat-Partner durchzuführen, um die garantierte Ende-zu-Ende-Verschlüsselung wiederherzustellen.</p>
|
||||
|
||||
<p><strong>Ihr Kontakt hat eine E-Mail über Webmail oder eine andere E-Mail-Anwendung gesendet,
|
||||
wird Delta Chat aber bald wieder benutzen.</strong></p>
|
||||
|
||||
<p>Wenn Sie wissen, dass der Kontakt manchmal Webmail,
|
||||
oder andere E-Mail-Anwendungen ohne Ende-zu-Ende-Verschlüsselung verwendet,
|
||||
dann können Sie die Warnung akzeptieren.
|
||||
Sobald Ihr Kontakt Delta Chat wieder benutzt,
|
||||
wird die garantierte Ende-zu-Ende-Verschlüsselung automatisch wiederhergestellt.</p>
|
||||
|
||||
<p><strong>Ihr Kontakt hat die Nutzung von Delta Chat komplett eingestellt</strong></p>
|
||||
|
||||
<p>Manchmal ist es wichtiger, in Kontakt zu bleiben als eine Ende-zu-Ende-Verschlüsselung zu haben;
|
||||
die <a href="#tls">“Transport Layer Encryption” (TLS)</a> kann die Vertraulichkeit
|
||||
Ihrer Nachrichten zwischen Ihrem Gerät und dem E-Mail-Server dennoch schützen.
|
||||
Ohne Ende-zu-Ende-Verschlüsselung vertrauen Sie und Ihr Chat-Partner jedoch darauf, dass Ihr E-Mail-Server Nachrichten nicht liest oder manipuliert und sie nicht an Dritte weitergibt.</p>
|
||||
|
||||
<p>In jedem Fall können Sie nicht viel mehr tun, als die Warnung zu akzeptieren.
|
||||
Bitte entfernen Sie den Kontakt auch aus allen aktiven, grün markierten Gruppen
|
||||
die Sie unter “Gemeinsame Chats” im Profil des Kontakts finden können.
|
||||
So vermeiden Sie, dass Ihr Kontakt “unlesbare” Nachrichten erhält.</p>
|
||||
|
||||
<p>Wenn der Kontakt Delta Chat aufgrund von Fehlern oder Bugs nicht mehr verwendet,
|
||||
können Sie diese in unser <a href="https://support.delta.chat">Support-Forum</a> schreiben,
|
||||
und uns so dabei helfen, häufige Probleme zu identifizieren und zu lösen. Vielen Dank!</p>
|
||||
|
||||
<h3 id="sind-anhänge-bilder-dateien-audio-usw-ende-zu-ende-verschlüsselt">
|
||||
|
||||
|
||||
@@ -824,10 +835,9 @@ und Anhang-Metadaten wie Dateinamen.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ja, Delta Chat verwendet eine sichere Untermenge von OpenPGP
|
||||
und zeigt nur dann ein Vorhängeschloss auf einer Nachricht an,
|
||||
wenn die gesamte Nachricht ordnungsgemäß verschlüsselt und signiert ist.
|
||||
Zum Beispiel werden “Detached Signatures” nicht als sicher betrachtet.</p>
|
||||
<p>Yes, Delta Chat uses a secure subset of OpenPGP
|
||||
requiring the whole message to be properly encrypted and signed.
|
||||
For example, “Detached signatures” are not treated as secure.</p>
|
||||
|
||||
<p>Die meisten öffentlich diskutierten OpenPGP-Probleme
|
||||
resultieren in Wirklichkeit aus schlechter Usability oder schlechter Implementierung von Tools oder Anwendungen - oder beidem.
|
||||
@@ -888,16 +898,15 @@ so wie in der Autocrypt-Level-1-Spezifikation definiert.</p>
|
||||
<h3 id="tls">
|
||||
|
||||
|
||||
Wird eine Nachricht im Klartext gesendet, wenn keine Ende-zu-Ende-Verschlüsselung verfügbar ist? <a href="#tls" class="anchor"></a>
|
||||
Sind mit dem Mail-Symbol markierte Nachrichten im Internet sichtbar? <a href="#tls" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Auch wenn Ihre Nachrichten nicht Ende-zu-Ende-verschlüsselt sind,
|
||||
sind sie dennoch vor Internetanbietern wie Mobilfunk- oder Telefongesellschaften geschützt.
|
||||
Allerdings können Ihr E-Mail-Provider und der des Empfängers
|
||||
Ihre Nachrichten lesen, analysieren oder sogar verändern,
|
||||
wenn sie nicht Ende-zu-Ende-verschlüsselt sind.</p>
|
||||
<p>If you are sending or receiving e-mail messages without end-to-end encryption (using a classic e-mail server),
|
||||
they are still protected from cell or cable companies who can not read or modify your e-mail messages.
|
||||
But both your and your recipient’s e-mail providers
|
||||
may read, analyze or modify your messages, including any attachments.</p>
|
||||
|
||||
<p>Delta Chat verwendet standardmäßig strikte
|
||||
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS-Verschlüsselung</a>,
|
||||
@@ -909,10 +918,6 @@ Wenn die beteiligten E-Mail-Server <a href="https://datatracker.ietf.org/doc/htm
|
||||
wird TLS zwischen den E-Mail-Anbietern durchgesetzt.
|
||||
In diesem Fall wird die Delta-Chat-Kommunikation niemals im Klartext ins Internet gelangen
|
||||
selbst wenn die Nachricht nicht Ende-zu-Ende-verschlüsselt war.</p>
|
||||
|
||||
<p>Beachten Sie, dass die <a href="#howtoe2ee">Beibehaltung der garantierten Ende-zu-Ende-Verschlüsselung</a> zusätzlich zur TLS-Verschlüsselung
|
||||
eine allumfassende Sicherheit zwischen Ihrem Gerät und dem des Empfängers bietet.
|
||||
Nicht einmal Ihr E-Mail- oder Internet-Provider wird in der Lage sein, Ihre Nachrichten zu lesen oder zu verändern.</p>
|
||||
|
||||
<h3 id="message-metadata">
|
||||
|
||||
@@ -922,24 +927,25 @@ Nicht einmal Ihr E-Mail- oder Internet-Provider wird in der Lage sein, Ihre Nach
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat schützt die meisten Metadaten von Nachrichten, indem es die folgenden Informationen
|
||||
in den Ende-zu-Ende-verschlüsselten Teil der Nachrichten verschiebt:</p>
|
||||
<p>Anders als die meisten anderen Messenger
|
||||
speichern Delta-Chat-Apps keine Metadaten über Kontakte oder Gruppen auf Servern. Auch nicht in verschlüsselter Form.
|
||||
Stattdessen werden alle Gruppen-Metadaten durchgängig verschlüsselt und ausschließlich auf den Endgeräten der Nutzer gespeichert.</p>
|
||||
|
||||
<p>E-Mail-Server können deshalb nur das Folgende sehen:</p>
|
||||
|
||||
<ul>
|
||||
<li>Betreffzeile</li>
|
||||
<li>Avatar und Name der Gruppe</li>
|
||||
<li>Lesebestätigungen (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
|
||||
<li>Timer für verschwindende Nachrichten (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
|
||||
<li><code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code></li>
|
||||
<li><code class="language-plaintext highlighter-rouge">Secure-Join</code>-Header</li>
|
||||
<li>Aktivierung des Standort-Streamings</li>
|
||||
<li>WebRTC-Raum-URL</li>
|
||||
<li>
|
||||
<p>Uhrzeit und Datum der Nachricht</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Absende- und Empfangsadresse</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Größe der Nachricht</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>E-Mail-Server erhalten keinen Zugriff auf diese geschützten Metadaten,
|
||||
sehen aber Datum und Größe der Nachricht sowie die Absender- und Empfängeradressen.
|
||||
E-Mail-Server benötigen Empfängeradressen, um Nachrichten
|
||||
Nachrichten an die Geräte der Empfänger weiterzuleiten und zuzustellen.</p>
|
||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||
|
||||
<h3 id="device-seizure">
|
||||
|
||||
@@ -949,20 +955,82 @@ Nachrichten an die Geräte der Empfänger weiterzuleiten und zuzustellen.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sowohl zum Schutz vor E-Mail-Servern, die Metadaten sammeln,
|
||||
als auch gegen die Gefahr der Beschlagnahmung von Geräten
|
||||
empfehlen wir die Verwendung einer für Delta Chat optimierten <a href="https://delta.chat/serverguide">E-Mail-Server-Instanz</a>, um pseudonym-temporäre Konten durch Scannen von QR-Codes zu erstellen.
|
||||
Beachten Sie, dass Delta-Chat-Apps auf allen Plattformen mehrere Konten unterstützen.
|
||||
Sie können also problemlos aktionsspezifische “1-Wochen-“ oder “1-Monats-Konten” neben Ihrem “Hauptkonto” verwenden,
|
||||
mit dem Wissen, dass alle temporären Kontodaten zusammen mit allen Metadaten gelöscht werden.
|
||||
Wenn ein Gerät beschlagnahmt wird, können Kontakte mit temporären E-Mail-Konten
|
||||
Konten nicht so leicht identifiziert werden, wie dies bei Messengern der Fall ist, die die
|
||||
Telefonnummern in Chatgruppen preisgeben, die wiederum oft mit legalen Identitäten verbunden sind.</p>
|
||||
<p>Both for protecting against metadata-collecting e-mail servers
|
||||
as well as against the threat of device seizure
|
||||
we recommend to use a <a href="https://chatmail.at/relays">chatmail relay</a>
|
||||
to create chat profiles using random e-mail addresses for transport.
|
||||
Note that Delta Chat apps on all platforms support multiple profiles
|
||||
so you can easily use situation-specific profiles next to your “main” profile
|
||||
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="wie-kann-ich-die-verschlüsselungsinformationen-überprüfen">
|
||||
<h3 id="sealedsender">
|
||||
|
||||
|
||||
Wie kann ich die Verschlüsselungsinformationen überprüfen? <a href="#wie-kann-ich-die-verschlüsselungsinformationen-überprüfen" class="anchor"></a>
|
||||
Unterstützt Delta Chat „Sealed Sender“? <a href="#sealedsender" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, not yet.</p>
|
||||
|
||||
<p>The Signal messenger introduced <a href="https://signal.org/blog/sealed-sender/">“Sealed Sender” in 2018</a>
|
||||
to keep their server infrastructure ignorant of who is sending a message to a set of recipients.
|
||||
It is particularly important because the Signal server knows the mobile number of each account,
|
||||
which is usually associated with a passport identity.</p>
|
||||
|
||||
<p>Even if <a href="https://chatmail.at/relays">chatmail relays</a>
|
||||
do not ask for any private data (including no phone numbers),
|
||||
it might still be worthwhile to protect relational metadata between addresses.
|
||||
We don’t foresee bigger problems in using random throw-away e-mail addresses for sealed sending
|
||||
but an implementation has not been agreed as a priority yet.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Unterstützt Delta Chat “Perfect Forward Secrecy”? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, not yet.</p>
|
||||
|
||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||
This means that if your private decryption key is leaked,
|
||||
and someone has collected your prior in-transit messages,
|
||||
they will be able to decrypt and read them using the leaked decryption key.
|
||||
Note that Forward Secrecy only increases security if you delete messages.
|
||||
Otherwise, someone obtaining your decryption keys
|
||||
is typically also able to get all your non-deleted messages
|
||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||
|
||||
<p>We designed a Forward Secrecy approach that withstood
|
||||
initial examination from some cryptographers and implementation experts
|
||||
but is pending a more formal write up
|
||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
||||
|
||||
<h3 id="pqc">
|
||||
|
||||
|
||||
Unterstützt Delta Chat Post-Quantum-Verschlüsselung? <a href="#pqc" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, not yet.</p>
|
||||
|
||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
||||
in collaboration with other OpenPGP implementers.</p>
|
||||
|
||||
<h3 id="wie-kann-ich-die-verschlüsselung-manuell-überprüfen">
|
||||
|
||||
|
||||
Wie kann ich die Verschlüsselung manuell überprüfen? <a href="#wie-kann-ich-die-verschlüsselung-manuell-überprüfen" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -973,115 +1041,6 @@ Delta Chat zeigt dort zwei Fingerabdrücke an.
|
||||
Wenn die gleichen Fingerabdrücke auf Ihrem eigenen Gerät und auf dem Gerät Ihres Kontakts erscheinen,
|
||||
ist die Verbindung sicher.</p>
|
||||
|
||||
<h3 id="wie-kann-ich-den-verschlüsselungsstatus-von-nachrichten-überprüfen">
|
||||
|
||||
|
||||
Wie kann ich den Verschlüsselungsstatus von Nachrichten überprüfen? <a href="#wie-kann-ich-den-verschlüsselungsstatus-von-nachrichten-überprüfen" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ein kleines <strong>Vorhängeschloss</strong> in einer Nachrichten zeigt an,
|
||||
dass die Nachricht vom Absender korrekt Ende-zu-Ende-verschlüsselt wurde.
|
||||
Wenn <strong>kein Vorhängeschloss</strong> vorhanden ist, wurde die Nachricht nicht oder nicht korrekt Ende-zu-Ende-verschlüsselt.
|
||||
Höchstwahrscheinlich, weil der Absender ein Webmail-Interface oder eine App
|
||||
ohne Ende-zu-Ende-Unterstützung verwendet.</p>
|
||||
|
||||
<h3 id="warum-sehe-ich-unverschlüsselte-nachrichten">
|
||||
|
||||
|
||||
Warum sehe ich unverschlüsselte Nachrichten? <a href="#warum-sehe-ich-unverschlüsselte-nachrichten" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Wenn ein Kontakt keine Autocrypt-fähige App verwendet,
|
||||
werden alle Nachrichten, die diesen Kontakt betreffen (in Gruppen- oder Direkt-Chats),
|
||||
nicht Ende-zu-Ende-verschlüsselt und zeigen daher kein “Vorhängeschloss”.
|
||||
Beachten Sie, auch Kontakte, die primär Delta Chat verwenden,
|
||||
können gleichzeitig auch nicht-Autocrypt-fähige Apps verwenden.
|
||||
Das unverschlüsselte Antworten auf unverschlüsselte Nachrichten wird von Autocrypt vorgeschrieben
|
||||
um zu verhindern, dass unlesbare Nachrichten auf der Seite Ihrer Kontakte ankommen.</p>
|
||||
|
||||
<h3 id="wie-kann-ich-einen-ende-zu-ende-verschlüsselten-chat-mit-einem-delta-chat-kontakt-führen-der-manchmal-webmail-oder-eine-andere-e-mail-anwendung-ohne-autocrypt-verwendet">
|
||||
|
||||
|
||||
Wie kann ich einen Ende-zu-Ende-verschlüsselten Chat mit einem Delta-Chat-Kontakt führen, der manchmal Webmail oder eine andere E-Mail-Anwendung ohne Autocrypt verwendet? <a href="#wie-kann-ich-einen-ende-zu-ende-verschlüsselten-chat-mit-einem-delta-chat-kontakt-führen-der-manchmal-webmail-oder-eine-andere-e-mail-anwendung-ohne-autocrypt-verwendet" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Wenn Sie einen sicheren Ende-zu-Ende-verschlüsselten Chat mit einem Kontakt benötigen,
|
||||
der sowohl Delta Chat als auch Nicht-Autocrypt-Anwendungen nutzt,
|
||||
können Sie eine <a href="#howtoe2ee">garantierte Ende-zu-Ende-Verschlüsselung</a> einrichten, mit einer Gruppe mit Ihnen beiden als Mitgliedern.
|
||||
In diesem Gruppenchat werden alle Nachrichten Ende-zu-Ende verschlüsselt werdejn,
|
||||
auch wenn im Direkt-Chat eine
|
||||
<a href="#nocryptanymore">“Nachricht von einem anderen Gerät gesendet”</a> wurde.</p>
|
||||
|
||||
<h3 id="wie-kann-ich-ende-zu-ende-verschlüsselung-und-löschen-von-nachrichten-sicherstellen">
|
||||
|
||||
|
||||
Wie kann ich Ende-zu-Ende-Verschlüsselung und Löschen von Nachrichten sicherstellen? <a href="#wie-kann-ich-ende-zu-ende-verschlüsselung-und-löschen-von-nachrichten-sicherstellen" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Der beste Weg, um sicherzustellen, dass alle Nachrichten Ende-zu-Ende-verschlüsselt sind
|
||||
und Metadaten so schnell wie möglich gelöscht werden,
|
||||
ist <a href="#howtoe2ee">die Verwendung von Chats mit garantierter Ende-zu-Ende-Verschlüsselung</a>
|
||||
und die Aktivierung von <a href="#ephemeralmsgs">verschwindenden Nachrichten</a>.</p>
|
||||
|
||||
<p>Garantierte Ende-zu-Ende-Verschlüsselung schützt vor <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM-Angriffen</a>
|
||||
und das Aktivieren von “Verschwindende Nachrichten” löscht die Nachrichten
|
||||
auf dem Server und Lokal nach einer vom Benutzer eingestellten Zeit.</p>
|
||||
|
||||
<p>Wenn Sie die Nachrichten auf Ihrem Gerät, aber nicht auf dem Server benötigen, können Sie auch in der Gruppe vereinbaren, <a href="#delold">“Nachrichten automatisch vom Server löschen”</a> einzuschalten.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Unterstützt Delta Chat “Perfect Forward Secrecy”? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Nein, Delta Chat unterstützt kein “Perfect Forward Secrecy” (PFS).
|
||||
Das bedeutet, wenn Ihr privater Delta-Chat-Schlüssel durchgesickert ist
|
||||
und jemand Ihre vorherigen In-Transit-Nachrichten gesammelt hat,
|
||||
können diese mit dem veröffentlichtem Schlüssel entschlüsselt werden.</p>
|
||||
|
||||
<p>Beachten Sie jedoch, dass jemand, der in den Besitz Ihrer privaten Schlüssel gelangt, in der Regel auch in der Lage sein wird, Ihre Nachrichten zu lesen - unabhängig davon, ob Perfect Forward Secrecy nun verwendet wird oder nicht.
|
||||
Die typische, reale Situation für durchgesickerte private Schlüssel, ist die <a href="#device-seizure">Beschlagnahme von Geräten</a>.</p>
|
||||
|
||||
<p>Es ist möglich, dass Delta Chat eine Tages “Perfect Forward Secrecy” unterstützt -
|
||||
OpenPGP ist nur ein Container für verschlüsselte Nachrichten mit dem
|
||||
die Verwaltung der Schlüssel (und damit die Schlüsselrotation oder das Schlüssel-“Ratcheting”)
|
||||
auf flexible Weise organisiert werden kann.
|
||||
Siehe <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">Seqouias PFS-Prototyp</a>
|
||||
für bestehende Experimente in der OpenPGP-Community.</p>
|
||||
|
||||
<h3 id="ist-die-ende-zu-ende-verschlüsselung-von-delta-chat-genauso-sicher-wie-die-von-signal">
|
||||
|
||||
|
||||
Ist die Ende-zu-Ende-Verschlüsselung von Delta Chat genauso sicher wie die von Signal? <a href="#ist-die-ende-zu-ende-verschlüsselung-von-delta-chat-genauso-sicher-wie-die-von-signal" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Das hängt davon ab, was für Sie wichtig ist.
|
||||
Delta Chat <a href="#pfs">unterstützt kein PFS</a>,
|
||||
bietet aber <a href="#e2eeguarantee">garantierte Ende-zu-Ende-Verschlüsselung</a>,
|
||||
die vor kompromittierten Servern oder korrupten Netzwerken schützt.
|
||||
Signal und die meisten anderen PFS-unterstützenden Messenger bieten kein
|
||||
praktisches System zum Schutz von Chatgruppen vor Netzwerkangriffen.
|
||||
Diese sind besorgniserregender und realer
|
||||
als ein potenzieller Angreifer, der zwar Ihr Telefon und Ihre privaten Schlüssel beschlagnahmt,
|
||||
aber irgendwie nicht Ihre Nachrichten - gleichzeitig aber eine vollständige Aufzeichnung aller
|
||||
vergangenen verschlüsselten Nachrichten hat.</p>
|
||||
|
||||
<p>In jedem Fall verwendet die Ende-zu-Ende-Verschlüsselung von Delta Chat eine <a href="#openpgp-secure">sichere Untermenge von OpenPGP</a>
|
||||
das <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">unabhängig sicherheitsgeprüft</a> wurde.</p>
|
||||
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
@@ -1090,45 +1049,13 @@ das <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">unab
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ja.
|
||||
The best way is to send an Autocrypt Setup Message from the other e-mail client.
|
||||
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
|
||||
<p>Nein.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Alternativ können Sie den Schlüssel manuell unter “Einstellungen → Erweitert → Schlüssel verwalten → Importiere geheime Schlüssel” importieren. Achtung: Stellen Sie sicher, dass der Schlüssel nicht durch ein Passwort geschützt ist, oder entfernen Sie das Passwort vorher.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Wenn Sie keinen Schlüssel besitzen oder nicht einmal wissen, dass Sie einen benötigen - keine Sorge: Delta Chat erstellt einen Schlüssel, wenn er benötigt wird. Sie müssen nichts weiter tun.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="ich-kann-meinen-existierenden-pgp-schlüssel-nicht-in-delta-chat-importieren">
|
||||
|
||||
|
||||
Ich kann meinen existierenden PGP-Schlüssel nicht in Delta Chat importieren. <a href="#ich-kann-meinen-existierenden-pgp-schlüssel-nicht-in-delta-chat-importieren" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
<p>Delta Chat erzeugt sichere OpenPGP-Schlüssel gemäß der Autocrypt-Spezifikation 1.1.
|
||||
Sie können Ihren privaten Schlüssel exportieren, aber Sie können keine weiteren privaten Schlüssel importieren.</p>
|
||||
|
||||
<p>Mit sehr großer Wahrscheinlichkeit besteht das Problem darin, dass Ihr Schlüssel verschlüsselt ist und/oder ein Passwort verwendet. Solche Schlüssel werden von Delta Chat nicht unterstützt. Bitte entfernen Sie die Verschlüsselung und das Passwort und versuchen Sie den Import danach erneut.</p>
|
||||
|
||||
<p>Ein weiterer häufiger Fehler ist die falsche Dateiendung.
|
||||
Verwenden Sie das ASCII-Armored-Format und die Dateiendung <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Delta Chat unterstützt “gängige” private Schlüsselformate, allerdings ist es unwahrscheinlich, dass wir 100% aller privaten Schlüssel aus sämtlichen Quellen unterstützen.
|
||||
Dies ist auch nicht das Hauptaugenmerk von Delta Chat. Tatsächlich besitzt die große Mehrheit der Delta-Chat-NutzerInnen keinen Schlüssel, bevor sie Delta Chat verwendet.
|
||||
Wir versuchen jedoch, private Schlüssel aus anderen Quellen so gut wie möglich zu unterstützen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Das Entfernen des Passworts vom privaten Schlüssel ist abhängig von der Software, mit der Sie Ihre PGP-Schlüssel verwalten.
|
||||
Bei Enigmail können Sie Ihr Passwort im Fenster Schlüsselverwaltung auf einen leeren Wert setzen.
|
||||
Bei GnuPG können Sie es über die <a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">Kommandozeile einstellen</a>.
|
||||
Für andere Programme können Sie online eine Lösung finden.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Im Allgemeinen empfehlen wir, die Schlüsselverwaltung nicht manuell vorzunehmen, und bieten dies auch nicht an.
|
||||
Wir wollen sicherstellen, dass sich Sicherheitsaudits auf wenige, bewährte kryptographische Algorithmen konzentrieren können - statt einen Strauß möglicher Algorithmen, die mit OpenPGP erlaubt sind.</p>
|
||||
|
||||
<h3 id="security-audits">
|
||||
|
||||
@@ -1190,7 +1117,7 @@ Es wurden keine kritischen Probleme gefunden, aber zwei Probleme mit hohem Schwe
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ja. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
|
||||
<p>Ja. You can use the same profile on different devices:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -1241,6 +1168,10 @@ und sicherstellen, dass <strong>Privates Netzwerk</strong> als “Netzwerkprofil
|
||||
<li>
|
||||
<p>In <strong>Gastnetzwerken</strong> z.B. der <strong>Fritz!Box</strong>, können Geräte möglicherweise nicht miteinander kommunizieren.
|
||||
Verwenden Sie nach Möglichkeit ein Nicht-Gast-Netzwerk. Wenn Sie Zugriff auf den Router haben, können Sie auch die Kommunikation der Geräte untereinander für die Dauer der Übertragung erlauben.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Wenn Sie immer noch Probleme bei der Verwendung desselben Netzwerks haben,
|
||||
versuchen Sie, einen <strong>Mobilen Hotspot</strong> auf einem Gerät zu öffnen und sich mit dem anderen Gerät in dieses WLAN einzuwählen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Vergewissern Sie sich, dass das Zielgerät über <strong>genügend Speicher</strong> verfügt</p>
|
||||
@@ -1276,6 +1207,23 @@ Verwenden Sie nach Möglichkeit ein Nicht-Gast-Netzwerk. Wenn Sie Zugriff auf de
|
||||
<li>Sie sind nun synchronisiert und können beide Geräte zum Senden und Empfangen von Ende-zu-Ende-verschlüsselten-Nachrichten mit Ihren Kommunikationspartnern verwenden.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="wird-löschen-anheften-archivieren-speichern-stummschalten-usw-über-alle-geräte-synchronisiert">
|
||||
|
||||
|
||||
Wird Löschen, Anheften, Archivieren, Speichern, Stummschalten usw. über alle Geräte synchronisiert? <a href="#wird-löschen-anheften-archivieren-speichern-stummschalten-usw-über-alle-geräte-synchronisiert" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ja.</p>
|
||||
|
||||
<p>Wenn Sie z.B. einen Chat oder eine Nachricht von Ihrem Telefon löschen,
|
||||
wird sie auch auf Ihrem Desktop gelöscht, sobald dieser online ist.</p>
|
||||
|
||||
<p>Ausnahmen sind <a href="#delold">Alte Nachrichten vom Gerät löschen</a>,
|
||||
da verschiedene Geräte unterschiedliche Speicherkapazitäten haben können,
|
||||
und systemspezifische Einstellungen wie Benachrichtigungstöne.</p>
|
||||
|
||||
<h3 id="gibt-es-pläne-für-eine-delta-chat-web-anwendung">
|
||||
|
||||
|
||||
@@ -1312,7 +1260,7 @@ Verwenden Sie nach Möglichkeit ein Nicht-Gast-Netzwerk. Wenn Sie Zugriff auf de
|
||||
<li>Webxdc Apps können keine Daten ins Internet senden oder etwas herunterladen.</li>
|
||||
<li>Eine Webxdc App kann Daten nur innerhalb eines Delta-Chat-Chats mit ihren Kopien auf den Geräten Ihrer Chat-Partner austauschen. Ansonsten ist sie komplett vom Internet isoliert.</li>
|
||||
<li>Die Privatsphäre, die eine Webxdc App bietet, ist die Privatsphäre Ihres Chats - solange Sie den Personen vertrauen, mit denen Sie chatten, können Sie auch der Webxdc App vertrauen.</li>
|
||||
<li>Das bedeutet auch: Es kann ein Datenschutzrisiko darstellen, Webxdc Apps in Chats zu öffnen, in denen man den Mitgliedern nicht vertraut - so wie man es von E-Mail-Anhängen kennt, wo man nur Anhänge von Absendern öffnet, denen man vertraut, und nicht von Spammern.</li>
|
||||
<li>Das bedeutet auch: Es kann ein Datenschutzrisiko darstellen, Webxdc Apps in Chats zu öffnen, in denen man den Mitgliedern nicht vertraut - so wie man es von E-Mail-Anhängen kennt, wo man nur Anhänge von Absendern öffnet, denen man vertraut, und nicht von Spammern. Spammer erhalten alle Daten, die Sie Ihnen senden zusammen mit Ihrer IP-Adresse.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="wo-bekomme-ich-webxdc-apps">
|
||||
@@ -1382,13 +1330,7 @@ forum</a> veröffentlicht und diskutiert.</li>
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Mit einer Broadcast-Liste können Sie eine Nachricht an viele Empfänger gleichzeitig senden; wenn sie Ihnen antworten, erhalten Sie die Antwort im Direktchat mit ihnen. Die Empfänger können einander nicht sehen.</li>
|
||||
<li>Technisch gesehen handelt es sich um eine E-Mail mit vielen Empfängern in BCC.</li>
|
||||
<li>Sie können die Funktion im Abschnitt “Experimentelle Features” in den erweiterten Einstellungen aktivieren. Dann können Sie im Dialogfeld “Neuer Chat” eine Broadcast-Liste erstellen.</li>
|
||||
<li>Falls Sie mehr als ein Gerät verwenden, werden Broadcast-Listen derzeit nicht zwischen ihnen synchronisiert.</li>
|
||||
<li>An Broadcast-Listen gesendete Nachrichten werden nicht verschlüsselt. Eine Verschlüsselung würde die Anonymität brechen, denn dann wüssten alle Empfänger, wer sie sonst noch erhalten hat. (Das Senden einzelner E-Mails an alle wäre aus Gründen der Ratenbegrenzung und des Netzwerkverbrauchs schlechter.)</li>
|
||||
</ul>
|
||||
<p>Mit einer Broadcast-Liste können Sie eine Nachricht an viele Empfänger auf einmal senden; die Empfänger können in dieser Liste nicht antworten. Broadcast-Listen sind experimentell und werden sehr wahrscheinlich durch etwas anderes ersetzt werden, bleiben Sie dran :)</p>
|
||||
|
||||
<h3 id="wie-kann-ich-meinen-standort-mit-meinen-chat-partnern-teilen">
|
||||
|
||||
@@ -1434,6 +1376,11 @@ forum</a> veröffentlicht und diskutiert.</li>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Note:
|
||||
Changing email addresses is temporarily disabled
|
||||
because of ongoing changes to the DeltaChat core.
|
||||
It should be available again in a few months.</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
<p>Ändern Sie Ihre E-Mail-Adresse unter “Einstellungen → Erweitert → Passwort und E-Mail-Konto” und
|
||||
@@ -1532,17 +1479,19 @@ gesendet haben, Nachrichten an Ihre neue Adresse senden.</p>
|
||||
Allerdings benötigen einige Anbieter besondere Einstellungen, um ordnungsgemäß zu funktionieren; eine von NutzerInnen erstellte Sammlung zu einigen Optionen findet sich unter <a href="https://providers.delta.chat">Provider Overview</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="ich-möchte-meinen-eigenen-e-mail-server-für-delta-chat-verwalten-gibt-es-empfehlungen">
|
||||
<h3 id="ich-möchte-meinen-eigenen-server-für-delta-chat-verwalten-gibt-es-empfehlungen">
|
||||
|
||||
|
||||
Ich möchte meinen eigenen E-Mail-Server für Delta Chat verwalten. Gibt es Empfehlungen? <a href="#ich-möchte-meinen-eigenen-e-mail-server-für-delta-chat-verwalten-gibt-es-empfehlungen" class="anchor"></a>
|
||||
Ich möchte meinen eigenen Server für Delta Chat verwalten. Gibt es Empfehlungen? <a href="#ich-möchte-meinen-eigenen-server-für-delta-chat-verwalten-gibt-es-empfehlungen" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Die meisten Mailserver werden gut funktionieren. Was wir persönlich jedoch empfehlen, ist eine Kombination aus mailcow und mailadm, wie <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">in diesem Blogpost</a> beschrieben.</li>
|
||||
<li>Auf unserer Webseite finden Sie eine <a href="https://delta.chat/de/serverguide">Installationsanleitung</a>.</li>
|
||||
<li>Most mail servers will work well. But what we personally recommend is a
|
||||
chatmail relay server, as described <a href="https://delta.chat/en/2023-12-13-chatmail">in this
|
||||
blogpost</a>.</li>
|
||||
<li>You can find an <a href="https://github.com/chatmail/relay">installation guide on GitHub</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="weshalb-muss-ich-mein-e-mail-kennwort-in-delta-chat-eingeben-ist-das-sicher">
|
||||
@@ -1555,7 +1504,7 @@ Allerdings benötigen einige Anbieter besondere Einstellungen, um ordnungsgemä
|
||||
|
||||
<p>Genau wie auch bei anderen E-Mail-Programmen (z. B. Thunderbird, K9-Mail oder Outlook) benötigt Delta Chat das Passwort, um E-Mails versenden zu können. Das Passwort wird nur auf Ihrem Gerät gespeichert und bei der Anmeldung an Ihren E-Mail-Anbieter gesendet.</p>
|
||||
|
||||
<p>Da Delta Chat Open Source ist, können Sie den <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">Quellcode</a> einsehen und sich davon überzeugen, dass Ihre Zugangsdaten sicher gehandhabt werden. Wir freuen uns über Feedback, das unsere App sicherer für all unsere NutzerInnen macht.</p>
|
||||
<p>Da Delta Chat Open Source ist, können Sie den <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">Quellcode</a> einsehen und sich davon überzeugen, dass Ihre Zugangsdaten sicher gehandhabt werden. Wir freuen uns über Feedback, das unsere App sicherer für all unsere NutzerInnen macht.</p>
|
||||
|
||||
<h3 id="welche-nachrichten-erscheinen-in-delta-chat">
|
||||
|
||||
@@ -1645,17 +1594,17 @@ wenn Sie eine <a href="#signature">Signaturtext</a> einfügen.</p>
|
||||
|
||||
<p>Einige BenutzerInnen verwenden Delta Chat als reguläres E-Mail-Programm und möchten lieber den Posteingang anstatt des DeltaChat-Ordners verwenden. Wenn Sie “DeltaChat-Ordner beobachten” ausschalten, sollten Sie auch “Autom. Verschieben in den DeltaChat-Ordner” ausschalten. Andernfalls funktioniert die Verwendung auf mehreren Geräten möglicherweise nicht richtig.</p>
|
||||
|
||||
<h3 id="ist-delta-chat-kompatibel-mit-protonmail--tutanota--criptext">
|
||||
<h3 id="ist-delta-chat-kompatibel-mit-proton-mail--tutanota--criptext">
|
||||
|
||||
|
||||
Ist Delta Chat kompatibel mit Protonmail / Tutanota / Criptext? <a href="#ist-delta-chat-kompatibel-mit-protonmail--tutanota--criptext" class="anchor"></a>
|
||||
Ist Delta Chat kompatibel mit Proton Mail / Tutanota / Criptext? <a href="#ist-delta-chat-kompatibel-mit-proton-mail--tutanota--criptext" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Ja und Nein.</li>
|
||||
<li>Nein, Sie können sich nicht mit Delta Chat in ein Protonmail-, Tutanota- oder Criptext-Konto einloggen, da diese keinen Standard-E-Mail-Empfang über IMAP anbieten.</li>
|
||||
<li>Nein, Sie können sich nicht mit Delta Chat in ein Proton-Mail-, Tutanota- oder Criptext-Konto einloggen, da diese keinen Standard-E-Mail-Empfang über IMAP anbieten.</li>
|
||||
<li>Ja, Sie können Delta Chat verwenden, um Nachrichten an Personen zu senden, die Protonmail, Tutanota oder Criptext verwenden. Diese Nachrichten werden jedoch nicht Ende-zu-Ende-verschlüsselt, da diese Anbieter keine mit dem <a href="https://autocrypt.org/">Autocrypt</a>-Standard kompatible Verschlüsselung verwenden.</li>
|
||||
<li>Delta Chat kann Ende-zu-Ende-Verschlüsselung über jeden E-Mail-Anbieter mit jeder
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-fähige E-Mail-Anwendung</a> herstellen</li>
|
||||
@@ -1698,7 +1647,7 @@ Andernfalls könnten Sie unverschlüsselte Nachrichten aus diesen Gruppenchats e
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Siehe hierzu <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">in Delta Chat genutzte Standards</a>.</li>
|
||||
<li>Siehe hierzu <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">in Delta Chat genutzte Standards</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="wo-können-meine-freunde-delta-chat-finden">
|
||||
@@ -1794,4 +1743,4 @@ Der Erhalt von Spenden hilft uns auch, unabhängiger und langfristig lebensfähi
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
</body></html>
|
||||
|
After Width: | Height: | Size: 183 B |
|
After Width: | Height: | Size: 349 B |
|
After Width: | Height: | Size: 300 B |
|
Before Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 324 B |
@@ -10,7 +10,9 @@
|
||||
<li><a href="#chi-vede-la-mia-immagine-del-profilo">Chi vede la mia immagine del profilo?</a></li>
|
||||
<li><a href="#signature">Posso impostare una Bio/Firma/Stato/Motto con Delta Chat?</a></li>
|
||||
<li><a href="#cosa-significa-fissare-silenziare-archiviare">Cosa significa Fissare, Silenziare, Archiviare?</a></li>
|
||||
<li><a href="#save">Come funziona “Messaggi Salvati”?</a></li>
|
||||
<li><a href="#cosa-significa-il-punto-verde">Cosa significa il punto verde?</a></li>
|
||||
<li><a href="#edit">Correggi gli errori e cancella i messaggi dopo averli inviati</a></li>
|
||||
<li><a href="#ephemeralmsgs">Come funzionano i messaggi a scomparsa?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -34,29 +36,25 @@
|
||||
<li><a href="#perché-delta-chat-si-integra-con-i-servizi-push-centralizzati-proprietari-di-applegoogle">Perché Delta Chat si integra con i servizi push centralizzati proprietari di Apple/Google?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#crittografia-e-sicurezza">Crittografia e Sicurezza</a>
|
||||
<li><a href="#e2ee">Crittografia e Sicurezza</a>
|
||||
<ul>
|
||||
<li><a href="#quali-standards-vengono-utilizzati-per-la-crittografia-end-to-end">Quali standards vengono utilizzati per la crittografia end-to-end?</a></li>
|
||||
<li><a href="#whene2e">Come posso sapere se i messaggi sono crittografati end-to-end?</a></li>
|
||||
<li><a href="#howtoe2ee">Come posso ottenere la crittografia end-to-end garantita e i segni di spunta verdi?</a></li>
|
||||
<li><a href="#e2eeguarantee">Cosa significano il segno di spunta verde e la “crittografia end-to-end garantita”?</a></li>
|
||||
<li><a href="#nocryptanymore">Un contatto “ha inviato un messaggio da un altro dispositivo”, cosa posso fare?</a></li>
|
||||
<li><a href="#posso-ancora-ricevere-o-inviare-mails-senza-la-crittografia-end-to-end">Posso ancora ricevere o inviare mails senza la crittografia end-to-end?</a></li>
|
||||
<li><a href="#howtoe2ee">Come posso stabilire una chat con un nuovo contatto?</a></li>
|
||||
<li><a href="#e2eeguarantee">Cosa significa il segno di spunta verde nel profilo di un contatto?</a></li>
|
||||
<li><a href="#gli-allegati-immagini-file-audio-ecc-sono-crittografati-end-to-end">Gli allegati (immagini, file, audio, ecc.) sono crittografati end-to-end?</a></li>
|
||||
<li><a href="#openpgp-secure">OpenPGP è sicuro?</a></li>
|
||||
<li><a href="#openpgp-alternative">Avete considerato l’utilizzo di alternative a OpenPGP per la crittografia end-to-end?</a></li>
|
||||
<li><a href="#openpgp-alternatives">Avete considerato l’utilizzo di alternative a OpenPGP per la crittografia end-to-end?</a></li>
|
||||
<li><a href="#delta-chat-è-vulnerabile-agli-efail">Delta Chat è vulnerabile agli EFAIL?</a></li>
|
||||
<li><a href="#tls">Un messaggio viene esposto in chiaro se la crittografia end-to-end non è disponibile?</a></li>
|
||||
<li><a href="#tls">I messaggi contrassegnati dall’icona della posta sono esposti su Internet?</a></li>
|
||||
<li><a href="#message-metadata">In che modo Delta Chat protegge i metadati nei messaggi?</a></li>
|
||||
<li><a href="#device-seizure">Come proteggere i metadati e contatti quando un dispositivo viene sequestrato?</a></li>
|
||||
<li><a href="#come-posso-verificare-le-informazioni-di-crittografia">Come posso verificare le informazioni di crittografia?</a></li>
|
||||
<li><a href="#come-posso-verificare-lo-stato-di-crittografia-dei-messaggi">Come posso verificare lo stato di crittografia dei messaggi?</a></li>
|
||||
<li><a href="#perché-vedo-messaggi-non-crittografati">Perché vedo messaggi non crittografati?</a></li>
|
||||
<li><a href="#come-posso-ottenere-una-chat-crittografata-end-to-end-con-un-contatto-delta-chat-che-a-volte-utilizza-la-webmail-o-unaltra-app-e-mail-non-autocrypt">Come posso ottenere una chat crittografata end-to-end con un contatto Delta Chat che a volte utilizza la webmail o un’altra app e-mail non Autocrypt?</a></li>
|
||||
<li><a href="#come-posso-garantire-la-crittografia-e-leliminazione-end-to-end-dei-messaggi">Come posso garantire la crittografia e l’eliminazione end-to-end dei messaggi?</a></li>
|
||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
||||
<li><a href="#pfs">Delta Chat supporta Perfect Forward Secrecy?</a></li>
|
||||
<li><a href="#la-crittografia-end-to-end-di-delta-chat-è-sicura-quanto-quella-di-signal">La crittografia end-to-end di Delta Chat è sicura quanto quella di Signal?</a></li>
|
||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||
<li><a href="#how-can-i-manually-check-encryption-information">How can I manually check encryption information?</a></li>
|
||||
<li><a href="#importkey">Posso riutilizzare la mia chiave privata esistente?</a></li>
|
||||
<li><a href="#non-riesco-a-importare-la-mia-chiave-pgp-esistente-in-delta-chat">Non riesco a importare la mia chiave PGP esistente in Delta Chat.</a></li>
|
||||
<li><a href="#security-audits">Delta Chat è stata verificata in modo indipendente per le vulnerabilità di sicurezza?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -65,6 +63,7 @@
|
||||
<li><a href="#posso-utilizzare-delta-chat-su-più-dispositivi-contemporaneamente">Posso utilizzare Delta Chat su più dispositivi contemporaneamente?</a></li>
|
||||
<li><a href="#risoluzione-dei-problemi">Risoluzione dei problemi</a></li>
|
||||
<li><a href="#backup">Trasferimento manuale</a></li>
|
||||
<li><a href="#cancella-fissa-archivia-salva-silenzia-ecc-sono-sincronizzate-su-tutti-i-dispositivi">Cancella, Fissa, Archivia, Salva, Silenzia ecc. sono sincronizzate su tutti i dispositivi?</a></li>
|
||||
<li><a href="#sono-previsti-piani-per-lintroduzione-di-un-client-web-delta-chat">Sono previsti piani per l’introduzione di un client Web Delta Chat?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -88,7 +87,7 @@
|
||||
<ul>
|
||||
<li><a href="#di-quali-autorizzazioni-ha-bisogno-delta-chat">Di quali autorizzazioni ha bisogno Delta Chat?</a></li>
|
||||
<li><a href="#delta-chat-funziona-con-il-mio-fornitore-e-mail">Delta Chat funziona con il <em>mio</em> fornitore e-mail?</a></li>
|
||||
<li><a href="#voglio-gestire-il-mio-server-di-posta-elettronica-per-delta-chat-che-cosa-mi-consigliate">Voglio gestire il mio server di posta elettronica per Delta Chat. Che cosa mi consigliate?</a></li>
|
||||
<li><a href="#vorrei-gestire-il-mio-server-per-delta-chat-cosa-mi-consigliate">Vorrei gestire il mio server per Delta Chat. Cosa mi consigliate?</a></li>
|
||||
<li><a href="#perché-devo-inserire-la-mia-password-e-mail-in-delta-chat-è-sicuro">Perché devo inserire la mia password E-Mail in Delta Chat? È sicuro?</a></li>
|
||||
<li><a href="#quali-messaggi-vengono-mostrati-in-delta-chat">Quali messaggi vengono mostrati in Delta Chat?</a></li>
|
||||
<li><a href="#delta-chat-supporta-le-e-mail-html">Delta Chat supporta le e-mail HTML?</a></li>
|
||||
@@ -96,7 +95,7 @@
|
||||
<li><a href="#a-cosa-serve-limpostazione-invia-copia-a-se-stessi">A cosa serve l’impostazione “Invia copia a se stessi”?</a></li>
|
||||
<li><a href="#perché-posso-scegliere-di-guardare-la-cartella-inviata">Perché posso scegliere di guardare la cartella “Inviata”?</a></li>
|
||||
<li><a href="#perché-posso-scegliere-di-non-guardare-la-cartella-deltachat">Perché posso scegliere di non guardare la cartella DeltaChat?</a></li>
|
||||
<li><a href="#delta-chat-è-compatibile-con-protonmail--tutanota--criptext">Delta Chat è compatibile con Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#delta-chat-è-compatibile-con-proton-mail--tutanota--criptext">Delta Chat è compatibile con Proton Mail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#remove-account">Come posso eliminare il mio profilo?</a></li>
|
||||
<li><a href="#sono-interessato-ai-dettagli-tecnici-mi-puoi-dire-di-più">Sono interessato ai dettagli tecnici. Mi puoi dire di più?</a></li>
|
||||
<li><a href="#dove-possono-trovare-delta-chat-i-miei-amici">Dove possono trovare Delta Chat i miei amici?</a></li>
|
||||
@@ -169,7 +168,7 @@ sicuro contro gli attacchi alla rete e al server.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Software Libero e Open Source, sia lato app che lato server.
|
||||
Basato su <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">Standard E-mail e Web Internet</a>,
|
||||
Basato su <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standard E-mail e Web Internet</a>,
|
||||
<a href="https://xkcd.com/927/">per evitare “l’ennesima sindrome standard (xkcd 927)”</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -182,15 +181,20 @@ Basato su <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Se un messaggio proviene da un contatto sconosciuto, appare come una <strong>richiesta</strong>.</p>
|
||||
|
||||
<ul>
|
||||
<li>Se un messaggio proviene da un contatto sconosciuto, appare come una <strong>richiesta</strong>. È necessario
|
||||
accettare la richiesta prima di poter rispondere.</li>
|
||||
<li>Si può anche “cancellare” il messaggio se non si vuole più chattare con esso. Questo
|
||||
non cancella il messaggio sul server, ma solo sul dispositivo. Quindi è possibile
|
||||
continuare a gestire il messaggio in un’altra applicazione di posta.</li>
|
||||
<li>Se si elimina una richiesta, i futuri messaggi di quel contatto continueranno a essere visualizzati come richieste di contatto
|
||||
<li>
|
||||
<p>È necessario <strong>accettare</strong> la richiesta prima di poter rispondere.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Si può anche <strong>cancellare</strong> il messaggio se non si vuole più chattare con esso.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Se si elimina una richiesta, i futuri messaggi di quel contatto continueranno a essere visualizzati come richieste di contatto
|
||||
in modo da poter cambiare idea. Se non si vuole davvero ricevere
|
||||
messaggi da questa persona, prendete in considerazione la possibilità di <em>bloccarla</em>.</li>
|
||||
messaggi da questa persona, prendete in considerazione la possibilità di <strong>bloccarla</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="delta-chat-supporta-immagini-video-e-altri-allegati">
|
||||
@@ -304,6 +308,41 @@ Le chat archiviate rimangono accessibili sopra l’elenco delle chat o tramite l
|
||||
<p>Per archiviare o fissare una chat, premi a lungo (Android), usa il menu della chat (Android/Desktop) o striscia verso sinistra (iOS);
|
||||
per silenziare una chat, usa il menu della chat (Android/Desktop) o il profilo della chat (iOS).</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
Come funziona “Messaggi Salvati”? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Messaggi Salvati</strong> è una chat che puoi usare per ricordare e trovare facilmente i messaggi.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>in qualunque chat, premi a lungo o click destro sul messaggio e seleziona <strong>Salva</strong></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I messaggi salvati sono marcati col simbolo
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
|
||||
accanto all’ora d’invio</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Successivamente, apri la chat “Messaggi Salvati” - e vedrai là i messaggi che hai salvato.
|
||||
Toccando<img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
|
||||
puoi tornare al messaggio originale nella chat di provenienza.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Infine, puoi anche usare “Messaggi Salvati” per prendere <strong>appunti</strong> - apri la chat, digita qualcosa, aggiungi una foto o un messaggio vocale, ecc.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Dato che i “Messaggi Salvati” sono sincronizzati, possono essere molto comodi per trasferire dati tra i dispositivi</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>I messaggi restano salvati anche se vengono modificati o eliminati -
|
||||
che sia dal <a href="#edit">mittente</a>, <a href="#delold">ripulendo il dispositivo</a> o per i <a href="#ephemeralmsgs">messaggi a scomparsa di altre chat</a>.</p>
|
||||
|
||||
<h3 id="cosa-significa-il-punto-verde">
|
||||
|
||||
|
||||
@@ -312,23 +351,52 @@ per silenziare una chat, usa il menu della chat (Android/Desktop) o il profilo d
|
||||
|
||||
</h3>
|
||||
|
||||
<p>A volte puoi vedere un <strong>punto verde</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> accanto all’avatar</p>
|
||||
<ul>
|
||||
<li>A partire da Delta Chat 1.34 a volte puoi vedere un “punto verde” accanto all’avatar
|
||||
di un contatto. Significa che è stato “visto di recente”.</li>
|
||||
<li>Nel dettaglio: significa che negli ultimi 10 minuti Delta Chat lo ha visto:</li>
|
||||
<li>
|
||||
<p>di un contatto. Significa che è stato “visto di recente”. Nel dettaglio: significa che negli ultimi 10 minuti Delta Chat lo ha visto:</p>
|
||||
</li>
|
||||
<li>o perché ti ha inviato un messaggio direttamente,</li>
|
||||
<li>perché ha scritto qualcosa a un gruppo di cui siete entrambi membri,</li>
|
||||
<li>perché ti ha inviato una conferma di lettura per un messaggio che hai scritto,</li>
|
||||
<li>o perché ha inviato dati alla tua app Delta Chat utilizzando l’
|
||||
<a href="#webxdc">applicazione webxdc</a>.</li>
|
||||
<li>Quindi questo non è uno stato online in tempo reale - e se qualcuno non risponde
|
||||
subito anche se sembra online, non preoccuparti e dagli un po’
|
||||
di spazio ;-)</li>
|
||||
<li>
|
||||
<p>o perché ha inviato dati alla tua app Delta Chat utilizzando l’<a href="#webxdc">applicazione webxdc</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Quindi questo non è uno stato online in tempo reale - e se qualcuno non risponde subito anche se sembra online, non preoccuparti e dagli un po’ di spazio :)</p>
|
||||
</li>
|
||||
<li>D’altra parte, non sempre gli altri “vedranno che sei online”. Se tu
|
||||
hai disattivato le conferme di lettura, non vedranno il punto verde finché non lo farai tu
|
||||
invia loro un messaggio o scrivi anche a un gruppo a cui appartengono.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Correggi gli errori e cancella i messaggi dopo averli inviati <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Puoi modificare il testo dei tuoi messaggi già inviati.
|
||||
Per farlo, premi a lungo o click destro sul messaggio e seleziona <strong>Edit</strong>
|
||||
o <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Se hai inviato un messaggio accidentalmente,
|
||||
dallo stesso menu, seleziona <strong>Elimina</strong> e quindi <strong>Cancella per Tutti</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Una volta modificati i messaggi avranno scritto “Modificato” accanto all’orario d’invio,
|
||||
i messaggi eliminati saranno rimossi senza alcun avviso in chat.
|
||||
Non vengono inviate notifiche e non c’è limite di tempo.</p>
|
||||
|
||||
<p>Nota che il messaggio originale potrebbe essere ancora sui dispositivi dei membri della chat
|
||||
che avrebbero già potuto rispondere, inoltrare, salvare, scattare una schermata o copiare il messaggio in altri modi.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
|
||||
@@ -648,10 +716,10 @@ che consente la “consegna istantanea” dei messaggi a tutti i server chatmail
|
||||
incluso uno potenziale <a href="https://delta.chat/chatmail#selfhosted">potresti configurarlo tu stesso senza la nostra autorizzazione</a>.
|
||||
Benvenuti nella potenza del sistema interoperabile e massiccio di chatmail ed e-mail :)</p>
|
||||
|
||||
<h2 id="crittografia-e-sicurezza">
|
||||
<h2 id="e2ee">
|
||||
|
||||
|
||||
Crittografia e Sicurezza <a href="#crittografia-e-sicurezza" class="anchor"></a>
|
||||
Crittografia e Sicurezza <a href="#e2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
@@ -664,15 +732,26 @@ Benvenuti nella potenza del sistema interoperabile e massiccio di chatmail ed e-
|
||||
|
||||
</h3>
|
||||
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> viene utilizzato automaticamente per stabilire la crittografia end-to-end con contatti e chat di gruppo. Autocrypt utilizza un <a href="#openpgp-secure">sottoinsieme limitato e sicuro dello standard OpenPGP</a>. I messaggi crittografati end-to-end sono contrassegnati da un lucchetto
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" />.</p>
|
||||
<p>Delta Chat utilizza un <a href="#openpgp-secure">sottoinsieme sicuro dello standard OpenPGP</a>
|
||||
per fornire la crittografia end-to-end automatica utilizzando questi protocolli:</p>
|
||||
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Protocolli Secure-Join</a>
|
||||
vengono utilizzati per stabilire chat con crittografia end-to-end garantita
|
||||
che protegge dagli attacchi di rete e dai server compromessi.
|
||||
Chat contrassegnata da un segno di spunta verde
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
garantisce messaggi crittografati end-to-end.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a>
|
||||
per scambiare informazioni sulla configurazione della crittografia tramite la scansione del codice QR o i “link di invito”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> viene utilizzato per stabilire
|
||||
automaticamente la crittografia end-to-end tra i contatti e tutti i membri di una chat di gruppo.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Condivisione di un contatto con una
|
||||
chat</a>
|
||||
consente ai destinatari di utilizzare la crittografia end-to-end con il contatto.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Delta Chat non esegue query, pubblica o interagisce con alcun server di chiavi OpenPGP.</p>
|
||||
|
||||
<h3 id="whene2e">
|
||||
|
||||
@@ -682,28 +761,37 @@ garantisce messaggi crittografati end-to-end.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Tutti i messaggi crittografati end-to-end portano un lucchetto:</p>
|
||||
|
||||
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
|
||||
|
||||
<p>La crittografia end-to-end è garantita se è presente un segno di spunta verde accanto al titolo della chat:</p>
|
||||
|
||||
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
|
||||
<p>Tutti i messaggi in Delta Chat sono <strong>crittografati end-to-end per impostazione predefinita</strong>.
|
||||
Dalla serie di rilasci della Versione 2 di Delta Chat (Luglio 2025)
|
||||
non ci sono più lucchetti o marcatori simili, sui messaggi crittografati end-to-end.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
<h3 id="posso-ancora-ricevere-o-inviare-mails-senza-la-crittografia-end-to-end">
|
||||
|
||||
|
||||
Come posso ottenere la crittografia end-to-end garantita e i segni di spunta verdi? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Posso ancora ricevere o inviare mails senza la crittografia end-to-end? <a href="#posso-ancora-ricevere-o-inviare-mails-senza-la-crittografia-end-to-end" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Se disponi di un secondo canale di comunicazione con il tuo partner di chat,
|
||||
come una chat video o un altro messenger,
|
||||
puoi generare un link d’invito.</p>
|
||||
<p>Se si utilizzano i <a href="https://chatmail.at/relays">relays di chatmail</a>,
|
||||
è impossibile ricevere o inviare messaggi senza la crittografia end-to-end.</p>
|
||||
|
||||
<p>Se siete insieme di persona,
|
||||
puoi mostrare un codice QR al tuo partner di chat.</p>
|
||||
<p>Se invece si crea un profilo utilizzando un server di posta elettronica classico,
|
||||
è possibile inviare e ricevere messaggi senza crittografia end-to-end.
|
||||
I messaggi privi di crittografia end-to-end sono contrassegnati da un’icona e-mail<br />
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
Come posso stabilire una chat con un nuovo contatto? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>È possibile inviare un link di invito attraverso un’altra chat privata,
|
||||
mostrare un codice QR di invito quando si è vicini o in una videochiamata,
|
||||
o fare clic su un “contatto” condiviso in una chat.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -712,139 +800,60 @@ tocca il titolo del gruppo di chat per vedere l’elenco dei membri,
|
||||
e seleziona “Codice QR di Invito”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Per <strong>inviti diretti alla chat 1:1</strong>,
|
||||
tocca l’icona del codice QR <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
|
||||
<p>Per <strong>inviti diretti alla chat 1:1</strong>,<br />
|
||||
toccare l’icona del Codice QR <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
|
||||
nella schermata principale dell’app Delta Chat.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Lascia che il tuo partner di chat esegua la scansione dell’immagine QR
|
||||
con la loro app Delta Chat,
|
||||
oppure fai clic su “Copia” o “Condividi” per creare un collegamento di invito
|
||||
e condividilo con il tuo partner di chat.</p>
|
||||
<p>Chiedere al partner di chat di scansionare l’immagine QR
|
||||
con la propria app Delta Chat,
|
||||
oppure cliccare su “Copia” o “Condividi” per creare un link di invito
|
||||
e condividerlo con il partner di chat.</p>
|
||||
|
||||
<p>Ora attendi che <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">i messaggi di rete Secure-Join vengano scambiati</a> tra entrambi i dispositivi.</p>
|
||||
<p>Ora aspettate che <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">la crittografia end-to-end venga stabilita</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Se entrambi i dispositivi sono online,
|
||||
entrambe le parti vedranno eventualmente una chat (di gruppo o diretta) con un segno di spunta verde
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
accanto al titolo.</p>
|
||||
<p>Se entrambe le parti sono online, vedranno presto una chat (di gruppo o diretta)
|
||||
e potranno iniziare a messaggiare in modo sicuro.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Se uno dei dispositivi è offline, verranno visualizzati solo i segni di spunta verdi
|
||||
verranno visualizzati in seguito quando il dispositivo sarà nuovamente connesso a Internet
|
||||
e il protocollo di rete Secure-Join è stato completato.</p>
|
||||
<p>Se una delle due parti è offline o con rete scadente,
|
||||
la possibilità di chattare viene ritardata fino al ripristino della connettività.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Congratulazioni!
|
||||
Ora utilizzerai automaticamente la crittografia end-to-end garantita
|
||||
con questo contatto potete aggiungervi a vicenda nei gruppi contrassegnati da un segno di spunta verde
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />,
|
||||
diffondendo così automaticamente la crittografia end-to-end garantita tra i suoi membri.</p>
|
||||
<p>Congratulazioni!
|
||||
Ora utilizzerai automaticamente la crittografia end-to-end
|
||||
con questo contatto.
|
||||
Se vi aggiungete a gruppi di chat,
|
||||
la crittografia end-to-end sarà stabilita tra tutti i membri.</p>
|
||||
|
||||
<h3 id="e2eeguarantee">
|
||||
|
||||
|
||||
Cosa significano il segno di spunta verde e la “crittografia end-to-end garantita”? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
Cosa significa il segno di spunta verde nel profilo di un contatto? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Titoli di chat con segni di spunta verde
|
||||
<p>Il profilo di un contatto potrebbe mostrare una spunta verde
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
significa che tutti i messaggi nella chat saranno crittografati end-to-end
|
||||
e non possono essere letti o modificati da server di e-mail o provider Internet compromessi.
|
||||
Partecipare alle chat di gruppo contrassegnate da un segno di spunta verde diffonde in modo sicuro le informazioni di crittografia di tutti (e i segni di spunta verdi)
|
||||
in modo da garantire la crittografia end-to-end nel gruppo e tra i membri.</p>
|
||||
|
||||
<p>Profili di contatto con segni di spunta verdi
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
significa che attualmente è garantita la crittografia end-to-end dei messaggi a un contatto.
|
||||
Ogni contatto contrassegnato dal segno di spunta verde ha effettuato una <a href="#howtoe2ee">scansione QR</a> diretta con te
|
||||
o è stato presentato da un altro contatto contrassegnato da un segno di spunta verde.
|
||||
Le presentazioni avvengono automaticamente quando si aggiungono membri ai gruppi.
|
||||
Chi aggiunge un contatto a un gruppo contrassegnato da un segno di spunta verde diventa un introduttore
|
||||
a quei membri che non erano ancora a conoscenza del contatto aggiunto. In un profilo di contatto è possibile toccare ripetutamente il testo “Presentato da…”.
|
||||
fino ad arrivare a quello con cui hai effettuato direttamente una <a href="#howtoe2ee">scansione QR</a>.</p>
|
||||
|
||||
<p>Tieni presente che nel profilo di un contatto potresti vedere e toccare gli introduttori
|
||||
ma non c’è il segno di spunta verde nel titolo del profilo.
|
||||
Questo di solito significa che il contatto <a href="#nocryptanymore">“ha inviato un messaggio da un altro dispositivo”</a>.</p>
|
||||
e una linea “Verificato da”.
|
||||
Ogni contatto con la spunta verde ha fatto un <a href="#howtoe2ee">QR-scan</a> con te
|
||||
o è stato verificato da un altro contatto con la spunta verde.
|
||||
La verifica si ha automaticamente all’aggiunta dei membri nei gruppi.
|
||||
Chiunque aggiunga un contatto con spunta verde a un gruppo con solo membri con la spunta verde
|
||||
diventa colui che l’ha verificato.
|
||||
Nel profilo di un contatto puoi premere sul campo “Verificato da …” ripetutamente
|
||||
fino a che vedi con chi hai avuto un <a href="#howtoe2ee">QR-scan</a>.</p>
|
||||
|
||||
<p>Per una discussione più approfondita sulla “crittografia end-to-end garantita”
|
||||
consultare <a href="https://securejoin.delta.chat/en/latest/new.html">Protocolli Secure-Join</a>
|
||||
e leggi nello specifico i “Gruppi Verificati”, il termine tecnico
|
||||
di quelle che qui vengono chiamate chat “con segno di spunta verde” o “crittografate end-to-end garantite”.</p>
|
||||
|
||||
<h3 id="nocryptanymore">
|
||||
|
||||
|
||||
Un contatto “ha inviato un messaggio da un altro dispositivo”, cosa posso fare? <a href="#nocryptanymore" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>La tua chat con un contatto che ha perso la crittografia end-to-end garantita.
|
||||
Il segno di spunta verde è stato rimosso per questa chat e per questo contatto quando vedi questo avviso.
|
||||
<strong>Se riscontri l’improvvisa rimozione della crittografia end-to-end garantita
|
||||
inaspettatamente per questo contatto allora non accettare l’avviso!</strong>
|
||||
Verifica invece con il tuo contatto attraverso un secondo canale
|
||||
come una videochiamata, un altro messenger o una telefonata,
|
||||
per scoprire cosa è successo.</p>
|
||||
|
||||
<p>Se il tuo contatto ha effettivamente causato la rimozione della crittografia end-to-end garantita
|
||||
consultare i paragrafi successivi per i motivi comuni e le relative attenuazioni.
|
||||
Indipendentemente da ciò, tutte le altre chat contrassegnate da un segno di spunta verde rimangono garantite con crittografia end-to-end
|
||||
anche se il contatto è un membro.</p>
|
||||
|
||||
<p><strong>Il tuo contatto sta utilizzando Delta Chat su un secondo dispositivo (telefono o laptop)</strong></p>
|
||||
|
||||
<p>Se hanno un altro dispositivo con l’app Delta Chat in esecuzione,
|
||||
dovrebbero rimuovere il profilo dal nuovo dispositivo
|
||||
e aggiungerlo <a href="#multiclient">come secondo dispositivo come descritto qui</a>.
|
||||
Non appena ti invieranno un messaggio, l’avviso scomparirà
|
||||
e la crittografia garantita viene stabilita con entrambi i dispositivi del tuo contatto.</p>
|
||||
|
||||
<p><strong>Il tuo contatto ha reinstallato Delta Chat utilizzando il vecchio login del profilo</strong></p>
|
||||
|
||||
<p>Se hanno <a href="#backup">un file di backup</a>,
|
||||
dovrebbero rimuovere il profilo dal nuovo dispositivo
|
||||
e piuttosto importare il file di backup per ricreare il proprio profilo.
|
||||
Non appena ti invieranno un messaggio, l’avviso scomparirà
|
||||
e la crittografia garantita viene ristabilita per questo contatto.</p>
|
||||
|
||||
<p>Se non hanno un file di backup, è meglio eseguire una <a href="#howtoe2ee">scansione QR</a>
|
||||
con il tuo partner di chat per ristabilire la crittografia end-to-end garantita.</p>
|
||||
|
||||
<p><strong>Il tuo contatto ha inviato un’e-mail tramite un’interfaccia webmail o un’altra app di posta elettronica
|
||||
e presto tornerà a utilizzare Delta Chat.</strong></p>
|
||||
|
||||
<p>Se sei sicuro che il contatto a volte utilizza la webmail,
|
||||
o un’altra app di posta priva di crittografia end-to-end,
|
||||
allora puoi accettare l’avvertimento.
|
||||
Non appena il tuo contatto utilizzerà nuovamente Delta Chat,
|
||||
la crittografia end-to-end garantita verrà ristabilita automaticamente.</p>
|
||||
|
||||
<p><strong>Il tuo contatto ha smesso completamente di utilizzare Delta Chat</strong></p>
|
||||
|
||||
<p>A volte rimanere in contatto è più importante della crittografia end-to-end.
|
||||
<a href="#tls">“Transport Layer Encryption” (TLS)</a> può comunque proteggere in modo significativo
|
||||
la riservatezza dei tuoi messaggi tra il tuo dispositivo e il server di posta elettronica.
|
||||
Ma senza la crittografia end-to-end tu e il tuo contratto vi fidate del vostro server di posta elettronica
|
||||
a non leggere o manipolare i tuoi messaggi e a non trasmetterli a terzi.</p>
|
||||
|
||||
<p>In ogni caso, non puoi fare molto altro che accettare l’avvertimento.
|
||||
Rimuovi anche il contatto da qualsiasi gruppo attivo contrassegnato da un segno di spunta verde
|
||||
che puoi trovare in “Chat condivise” nel profilo dei contatti.
|
||||
Ciò evita che il tuo contatto riceva messaggi “illeggibili”.</p>
|
||||
|
||||
<p>Se il contatto ha rimosso Delta Chat a causa di bug o di comportamenti indesiderati,
|
||||
ti invitiamo a pubblicare post sul nostro <a href="https://support.delta.chat">forum di supporto</a>
|
||||
per aiutarci a identificare e affrontare i problemi comuni. Grazie!</p>
|
||||
|
||||
<h3 id="gli-allegati-immagini-file-audio-ecc-sono-crittografati-end-to-end">
|
||||
|
||||
|
||||
@@ -869,9 +878,8 @@ e metadati degli allegati come i nomi dei file.</p>
|
||||
</h3>
|
||||
|
||||
<p>Sì, Delta Chat utilizza un sottoinsieme sicuro di OpenPGP
|
||||
e visualizza solo un indicatore di sicurezza lucchetto su un messaggio
|
||||
se l’intero messaggio è crittografato e firmato correttamente.
|
||||
Ad esempio, le “Firme distaccate” non sono considerate sicure.</p>
|
||||
che richiede che l’intero messaggio sia correttamente crittografato e firmato.
|
||||
Ad esempio, le “Firme staccate” non sono considerate sicure.</p>
|
||||
|
||||
<p>OpenPGP non è insicuro di per sé.
|
||||
La maggior parte dei problemi di sicurezza di OpenPGP discussi pubblicamentederivano in realtà da una cattiva usabilità o da cattive implementazioni di strumenti o app (o entrambi).
|
||||
@@ -886,10 +894,10 @@ e <a href="#security-audits">verificato per la sicurezza nel 2019 e nel 2024</a>
|
||||
per migliorare ulteriormente le caratteristiche di sicurezza implementando il
|
||||
<a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-crypto-refresh/">nuovo aggiornamento crittografico IETF OpenPGP</a> che per fortuna è stato adottato nell’estate 2023.</p>
|
||||
|
||||
<h3 id="openpgp-alternative">
|
||||
<h3 id="openpgp-alternatives">
|
||||
|
||||
|
||||
Avete considerato l’utilizzo di alternative a OpenPGP per la crittografia end-to-end? <a href="#openpgp-alternative" class="anchor"></a>
|
||||
Avete considerato l’utilizzo di alternative a OpenPGP per la crittografia end-to-end? <a href="#openpgp-alternatives" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -932,17 +940,15 @@ come definito dalla specifica Autocrypt Level 1.</p>
|
||||
<h3 id="tls">
|
||||
|
||||
|
||||
Un messaggio viene esposto in chiaro se la crittografia end-to-end non è disponibile? <a href="#tls" class="anchor"></a>
|
||||
I messaggi contrassegnati dall’icona della posta sono esposti su Internet? <a href="#tls" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Anche se non è garantito che i tuoi messaggi siano crittografati end-to-end,
|
||||
sono ancora protetti dai fornitori di Internet come le società di telefonia mobile o via cavo.
|
||||
Tuttavia, i provider di posta elettronica tuoi e del destinatario
|
||||
potranno leggere, analizzare o addirittura modificare i tuoi messaggi,
|
||||
compresi eventuali allegati,
|
||||
se non sono crittografati end-to-end.</p>
|
||||
<p>Se inviate o ricevete messaggi e-mail senza crittografia end-to-end (utilizzando un server e-mail classico),
|
||||
sono comunque protetti dalle compagnie telefoniche o via cavo che non possono leggere o modificare i vostri messaggi e-mail.
|
||||
Ma sia il vostro provider e-mail che quello del destinatario
|
||||
possono leggere, analizzare o modificare i vostri messaggi, compresi gli allegati.</p>
|
||||
|
||||
<p>Delta Chat per impostazione predefinita utilizza
|
||||
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">Crittografia TLS</a> rigorosa
|
||||
@@ -954,10 +960,6 @@ Se i server e-mail coinvolti supportano <a href="https://datatracker.ietf.org/do
|
||||
verrà applicata la crittografia del trasporto tra i provider e-mail
|
||||
in tal caso le comunicazioni Delta Chat non verranno mai esposte in chiaro su Internet
|
||||
anche se il messaggio non sarà crittografato end-to-end.</p>
|
||||
|
||||
<p>Tieni presente che <a href="#howtoe2ee">mantenere la crittografia end-to-end garantita</a> oltre alla crittografia TLS
|
||||
fornisce una sicurezza pervasiva tra i tuoi dispositivi e quelli del destinatario.
|
||||
Nemmeno il tuo provider e-mail o Internet sarà in grado di leggere o modificare i tuoi messaggi.</p>
|
||||
|
||||
<h3 id="message-metadata">
|
||||
|
||||
@@ -967,25 +969,25 @@ Nemmeno il tuo provider e-mail o Internet sarà in grado di leggere o modificare
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat protegge la maggior parte dei metadati dei messaggi inserendo le seguenti informazioni
|
||||
nella parte crittografata end-to-end dei messaggi:</p>
|
||||
<p>Unlike most other messengers,
|
||||
Delta Chat apps do not store any metadata about contacts or groups on servers, also not in encrypted form.
|
||||
Instead, all group metadata is end-to-end encrypted and stored on end-user devices, only.</p>
|
||||
|
||||
<p>E-mail Servers can therefore only see</p>
|
||||
|
||||
<ul>
|
||||
<li>Linea oggetto</li>
|
||||
<li>Avatar e nome del gruppo</li>
|
||||
<li>Richieste MDN (conferma di lettura) (“Chat-Disposition-Notification-To”)</li>
|
||||
<li>Temporizzatore dei messaggi che scompaiono (“Ephemeral-Timer”)</li>
|
||||
<li>“Membro del gruppo chat rimosso”, “Membro del gruppo chat aggiunto”.</li>
|
||||
<li>Intestazione “Secure-Join” contenente comandi di join sicuri</li>
|
||||
<li>Notifica sull’attivazione dello streaming della posizione</li>
|
||||
<li>URL della stanza WebRTC</li>
|
||||
<li>
|
||||
<p>the message date,</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>sender and receiver addresses</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>and message size.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>I server E-Mail non hanno accesso a questi metadati protetti
|
||||
ma vedono la data del messaggio e la dimensione del messaggio,
|
||||
e, cosa ancora più importante, gli indirizzi del mittente e del destinatario.
|
||||
I server E-Mail necessitano di indirizzi di destinatari per instradare e
|
||||
consegnare messaggi ai dispositivi del destinatario.</p>
|
||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||
|
||||
<h3 id="device-seizure">
|
||||
|
||||
@@ -995,21 +997,82 @@ consegnare messaggi ai dispositivi del destinatario.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Entrambi per la protezione dai server e-mail che raccolgono metadati
|
||||
nonché contro il pericolo di sequestro del dispositivo
|
||||
consigliamo di utilizzare un’<a href="https://delta.chat/serverguide">istanza del server e-mail</a> ottimizzata per Delta Chat
|
||||
per creare profili temporanei pseudonimi tramite scansioni di codici QR.
|
||||
Tieni presente che le app Delta Chat su tutte le piattaforme supportano più profili
|
||||
in questo modo puoi utilizzare facilmente profili “1 settimana” o “1 mese” specifici per azioni accanto al tuo profilo “principale”.
|
||||
con la consapevolezza che tutti i dati temporanei del profilo, insieme a tutti i metadati, verranno cancellati.
|
||||
Inoltre, se un dispositivo viene sequestrato, i contatti utilizzano profili e-mail temporanei
|
||||
non possono essere identificati facilmente, rispetto ai messaggeri che rivelano
|
||||
numeri di telefono nei gruppi di chat che a loro volta sono spesso associati a identità legali.</p>
|
||||
<p>Both for protecting against metadata-collecting e-mail servers
|
||||
as well as against the threat of device seizure
|
||||
we recommend to use a <a href="https://chatmail.at/relays">chatmail relay</a>
|
||||
to create chat profiles using random e-mail addresses for transport.
|
||||
Note that Delta Chat apps on all platforms support multiple profiles
|
||||
so you can easily use situation-specific profiles next to your “main” profile
|
||||
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="come-posso-verificare-le-informazioni-di-crittografia">
|
||||
<h3 id="sealedsender">
|
||||
|
||||
|
||||
Come posso verificare le informazioni di crittografia? <a href="#come-posso-verificare-le-informazioni-di-crittografia" class="anchor"></a>
|
||||
Does Delta Chat support “Sealed Sender”? <a href="#sealedsender" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, non ancora.</p>
|
||||
|
||||
<p>The Signal messenger introduced <a href="https://signal.org/blog/sealed-sender/">“Sealed Sender” in 2018</a>
|
||||
to keep their server infrastructure ignorant of who is sending a message to a set of recipients.
|
||||
It is particularly important because the Signal server knows the mobile number of each account,
|
||||
which is usually associated with a passport identity.</p>
|
||||
|
||||
<p>Even if <a href="https://chatmail.at/relays">chatmail relays</a>
|
||||
do not ask for any private data (including no phone numbers),
|
||||
it might still be worthwhile to protect relational metadata between addresses.
|
||||
We don’t foresee bigger problems in using random throw-away e-mail addresses for sealed sending
|
||||
but an implementation has not been agreed as a priority yet.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Delta Chat supporta Perfect Forward Secrecy? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, non ancora.</p>
|
||||
|
||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||
This means that if your private decryption key is leaked,
|
||||
and someone has collected your prior in-transit messages,
|
||||
they will be able to decrypt and read them using the leaked decryption key.
|
||||
Note that Forward Secrecy only increases security if you delete messages.
|
||||
Otherwise, someone obtaining your decryption keys
|
||||
is typically also able to get all your non-deleted messages
|
||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||
|
||||
<p>We designed a Forward Secrecy approach that withstood
|
||||
initial examination from some cryptographers and implementation experts
|
||||
but is pending a more formal write up
|
||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
||||
|
||||
<h3 id="pqc">
|
||||
|
||||
|
||||
Does Delta Chat support Post-Quantum-Cryptography? <a href="#pqc" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, non ancora.</p>
|
||||
|
||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
||||
in collaboration with other OpenPGP implementers.</p>
|
||||
|
||||
<h3 id="how-can-i-manually-check-encryption-information">
|
||||
|
||||
|
||||
How can I manually check encryption information? <a href="#how-can-i-manually-check-encryption-information" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1020,122 +1083,6 @@ Delta Chat mostra due impronte digitali.
|
||||
Se sul tuo dispositivo e su quello del tuo contatto vengono visualizzate le stesse impronte digitali,
|
||||
la connessione è sicura.</p>
|
||||
|
||||
<h3 id="come-posso-verificare-lo-stato-di-crittografia-dei-messaggi">
|
||||
|
||||
|
||||
Come posso verificare lo stato di crittografia dei messaggi? <a href="#come-posso-verificare-lo-stato-di-crittografia-dei-messaggi" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Un piccolo <strong>lucchetto</strong> in un fumetto denota
|
||||
che il messaggio è stato correttamente crittografato end-to-end dal mittente specificato.
|
||||
Se <strong>non è presente alcun lucchetto</strong>, il messaggio non è stato crittografato correttamente end-to-end
|
||||
molto probabilmente perché il mittente utilizza un’app o un’interfaccia webmail
|
||||
senza supporto per la crittografia end-to-end.</p>
|
||||
|
||||
<h3 id="perché-vedo-messaggi-non-crittografati">
|
||||
|
||||
|
||||
Perché vedo messaggi non crittografati? <a href="#perché-vedo-messaggi-non-crittografati" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Se un contatto utilizza un’app e-mail non Autocrypt,
|
||||
tutti i messaggi che coinvolgono questo contatto (in un gruppo o in una chat 1:1)
|
||||
non sarà crittografato end-to-end e quindi non mostrerà un “lucchetto” con i messaggi.
|
||||
Tieni presente che anche se i tuoi contatti utilizzano Delta Chat sul proprio profilo,
|
||||
potrebbero anche utilizzare un’app di posta elettronica non Autocrypt su quel profilo
|
||||
che quindi potrebbe causare messaggi non crittografati in modo intermittente.
|
||||
La risposta non crittografata a messaggi non crittografati è richiesta da Autocrypt
|
||||
per evitare messaggi illeggibili tra i tuoi contatti
|
||||
e la loro app e-mail non Autocrypt.</p>
|
||||
|
||||
<h3 id="come-posso-ottenere-una-chat-crittografata-end-to-end-con-un-contatto-delta-chat-che-a-volte-utilizza-la-webmail-o-unaltra-app-e-mail-non-autocrypt">
|
||||
|
||||
|
||||
Come posso ottenere una chat crittografata end-to-end con un contatto Delta Chat che a volte utilizza la webmail o un’altra app e-mail non Autocrypt? <a href="#come-posso-ottenere-una-chat-crittografata-end-to-end-con-un-contatto-delta-chat-che-a-volte-utilizza-la-webmail-o-unaltra-app-e-mail-non-autocrypt" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Se hai bisogno di una chat crittografata end-to-end sicura con un contatto
|
||||
chi utilizza il proprio profilo sia con Delta Chat che con app non Autocrypt (ad esempio webmail),
|
||||
è meglio configurare <a href="#howtoe2ee">la crittografia end-to-end garantita con loro</a>
|
||||
e quindi crea una chat di gruppo crittografata end-to-end garantita con voi due come membri.
|
||||
In questa chat di gruppo tutti i messaggi verranno crittografati end-to-end
|
||||
anche se la chat diretta tra voi due ha a
|
||||
<a href="#nocryptanymore">“… inviato un messaggio da un altro dispositivo”</a> avviso.</p>
|
||||
|
||||
<h3 id="come-posso-garantire-la-crittografia-e-leliminazione-end-to-end-dei-messaggi">
|
||||
|
||||
|
||||
Come posso garantire la crittografia e l’eliminazione end-to-end dei messaggi? <a href="#come-posso-garantire-la-crittografia-e-leliminazione-end-to-end-dei-messaggi" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Il modo migliore per garantire che ogni messaggio sia crittografato end-to-end,
|
||||
e i metadati vengono eliminati il più rapidamente possibile
|
||||
è <a href="#howtoe2ee">utilizzare chat con crittografia end-to-end garantita</a>
|
||||
e l’attivazione dei <a href="#ephemeralmsgs">messaggi a scomparsa</a>.</p>
|
||||
|
||||
<p>Le chat crittografate end-to-end garantiscono la protezione dagli <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">attacchi MITM</a>
|
||||
e l’attivazione dei “messaggi che scompaiono” elimina i messaggi
|
||||
sul server dopo un tempo configurato dall’utente.</p>
|
||||
|
||||
<p>Se non hai bisogno di una copia più longeva dei tuoi messaggi sul server,
|
||||
puoi anche attivare <a href="#delold">“elimina messaggi dal server”</a>.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Delta Chat supporta Perfect Forward Secrecy? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, Delta Chat non supporta Perfect Forward Secrecy (PFS).
|
||||
Ciò significa che se la tua chiave di decrittazione privata Delta Chat viene divulgata,
|
||||
e qualcuno ha raccolto i tuoi precedenti messaggi in transito,
|
||||
sarà in grado di decrittografarli e leggerli utilizzando la chiave di decrittazione trapelata.</p>
|
||||
|
||||
<p>Tieni presente, tuttavia, che se qualcuno ottiene le tue chiavi di decrittazione,
|
||||
in genere saranno anche in grado di ricevere i tuoi messaggi,
|
||||
indipendentemente dal fatto che Perfect Forward Secrecy sia attivo o meno.
|
||||
La tipica situazione reale in caso di fuga di chiavi di decrittazione è il sequestro del dispositivo
|
||||
di cui discutiamo nella nostra risposta <a href="#device-seizure">sui metadati e sul sequestro dei dispositivi</a>.</p>
|
||||
|
||||
<p>È possibile che Delta Chat si evolva per supportare Perfect Forward Secrecy,
|
||||
perché OpenPGP è solo un contenitore per messaggi crittografati
|
||||
ma la gestione delle chiavi di crittografia (e quindi la rotazione delle chiavi o “cricchetto”)
|
||||
potrebbero essere organizzati in modo flessibile.
|
||||
Vedi <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">prototipo PFS di Seqouia</a>
|
||||
per gli esperimenti esistenti nella comunità degli implementatori di OpenPGP.</p>
|
||||
|
||||
<h3 id="la-crittografia-end-to-end-di-delta-chat-è-sicura-quanto-quella-di-signal">
|
||||
|
||||
|
||||
La crittografia end-to-end di Delta Chat è sicura quanto quella di Signal? <a href="#la-crittografia-end-to-end-di-delta-chat-è-sicura-quanto-quella-di-signal" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Dipende da cosa è importante per te.
|
||||
Delta Chat <a href="#pfs">non supporta PFS</a> come fa Signal
|
||||
ma fornisce <a href="#e2eeguarantee">chat crittografate end-to-end garantite</a>
|
||||
che sono sicuri contro server compromessi o reti danneggiate.
|
||||
Signal e la maggior parte degli altri servizi di messaggistica che supportano PFS non forniscono
|
||||
uno schema pratico per proteggere i gruppi di chat dagli attacchi di rete
|
||||
che sono probabilmente più preoccupanti
|
||||
di un potenziale utente malintenzionato che si impadronisce del tuo telefono e della configurazione di crittografia privata
|
||||
ma in qualche modo non i tuoi messaggi, ma ha un registro completo di tutti
|
||||
messaggi crittografati precedenti.</p>
|
||||
|
||||
<p>In ogni caso, la crittografia end-to-end di Delta Chat utilizza un <a href="#openpgp-secure">sottoinsieme sicuro di OpenPGP</a>
|
||||
che è stato <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">controllato in modo indipendente sulla sicurezza</a>.</p>
|
||||
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
@@ -1144,42 +1091,14 @@ che è stato <a href="https://delta.chat/assets/blog/2019-first-security-review.
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sì.
|
||||
The best way is to send an Autocrypt Setup Message from the other e-mail client.
|
||||
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
|
||||
<p>No.</p>
|
||||
|
||||
<p>In alternativa è possibile importare manualmente la chiave in “Impostazioni -> Avanzate -> Gestisci Chiavi -> Importa Chiavi Segrete”.
|
||||
Attenzione: assicurarsi che la chiave non sia protetta da password oppure rimuovere prima la password.</p>
|
||||
<p>Delta Chat genera chiavi OpenPGP sicure in conformità alle specifiche di Autocrypt 1.1.
|
||||
Puoi esportare le tue chiavi private ma non puoi importare chiavi private aggiuntive.</p>
|
||||
|
||||
<p>Se non hai una chiave o non sai nemmeno che ne avrai bisogno - non preoccuparti: Delta Chat genera le chiavi secondo necessità, non devi premere un pulsante per ottenerle.</p>
|
||||
|
||||
<h3 id="non-riesco-a-importare-la-mia-chiave-pgp-esistente-in-delta-chat">
|
||||
|
||||
|
||||
Non riesco a importare la mia chiave PGP esistente in Delta Chat. <a href="#non-riesco-a-importare-la-mia-chiave-pgp-esistente-in-delta-chat" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Con molta probabilità, il problema sta nel fatto che la tua chiave è cifata e/o usa
|
||||
una password. Queste chiavi non sono supportate da Delta Chat. Rimuovi la
|
||||
cifratura e la password e prova ad importarla nuovamente.</p>
|
||||
|
||||
<p>Un altro errore comune è avere la fine del file sbagliata.
|
||||
Utilizza il formato corazzato ASCII e l’estensione del file “.asc”.</p>
|
||||
|
||||
<p>Delta Chat supporta i formati di chiave privata OpenPGP comuni, tuttavia,
|
||||
è improbabile che le chiavi private di tutte le fonti siano completamente supportate. Questo
|
||||
non è l’obiettivo principale di Delta Chat. In effetti, la maggior parte dei nuovi utenti
|
||||
non avrà alcuna chiave prima di utilizzare Delta Chat.
|
||||
Tuttavia, cerchiamo di supportare le chiavi private dal maggior numero possibile di fonti.</p>
|
||||
|
||||
<p>La rimozione della password dalla chiave privata dipenderà dal
|
||||
software che usi per gestire le tue chiavi PGP. Con Enigmail puoi impostare la tua
|
||||
password su un valore vuoto nella finestra Gestione chiavi. Con GnuPG puoi impostarla
|
||||
<a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">tramite la linea
|
||||
di comando</a>.
|
||||
Per altri programmi, dovresti essere in grado di trovare una soluzione online.</p>
|
||||
<p>In generale, non raccomandiamo on proponiamo agli utenti di gestire manualmente le chiavi.
|
||||
Noi vogliamo assicurare che gli audit di sicurezza si possano focalizzare su pochi algoritmi crittografici comprovati
|
||||
invece che sull’intera estensione dei possibili algoritmi consentiti con OpenPGP.</p>
|
||||
|
||||
<h3 id="security-audits">
|
||||
|
||||
@@ -1274,7 +1193,7 @@ Puoi leggere il <a href="https://delta.chat/assets/blog/2019-first-security-revi
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sì. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
|
||||
<p>Sì. You can use the same profile on different devices:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -1331,6 +1250,10 @@ che è noto per causare problemi (soprattutto su Windows).
|
||||
<li>
|
||||
<p><strong>Reti Ospite</strong> potrebbero non consentire ai dispositivi di comunicare tra loro.
|
||||
Se possibile, utilizza una rete non ospite.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Se continui ad aver problemi usando la stessa rete,
|
||||
prova ad aprire l’ <strong>Hotspot</strong> su uno dei dispositivi e collegati al quel Wi-Fi con l’altro</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Assicurarsi che sul dispositivo di destinazione ci sia <strong>disponibilità di memoria sufficiente</strong>.</p>
|
||||
@@ -1375,6 +1298,23 @@ Aiutarti.</li>
|
||||
messaggi crittografati end-to-end con i tuoi partner di comunicazione.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="cancella-fissa-archivia-salva-silenzia-ecc-sono-sincronizzate-su-tutti-i-dispositivi">
|
||||
|
||||
|
||||
Cancella, Fissa, Archivia, Salva, Silenzia ecc. sono sincronizzate su tutti i dispositivi? <a href="#cancella-fissa-archivia-salva-silenzia-ecc-sono-sincronizzate-su-tutti-i-dispositivi" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sì.</p>
|
||||
|
||||
<p>Se per esempio cancelli una chat o un messaggio dal tuo telefono,
|
||||
sarà cancellato sul tuo desktop non appena tornerà in linea di nuovo.</p>
|
||||
|
||||
<p>Eccezioni rilevanti sono <a href="#delold">Elimina vecchi messaggi dal Dispositivo</a>,
|
||||
poiché diversi dispositivi possono avere differenti capacità di memoria,
|
||||
e impostazioni di sistema specifiche come i suoni di notifica.</p>
|
||||
|
||||
<h3 id="sono-previsti-piani-per-lintroduzione-di-un-client-web-delta-chat">
|
||||
|
||||
|
||||
@@ -1415,15 +1355,16 @@ un messenger estensibile.</p>
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Le apps webxdc non possono inviare dati a Internet o scaricare nulla.</li>
|
||||
<li>Un’app webxdc può scambiare dati solo all’interno di una chat Delta Chat, con la sua
|
||||
copia sui dispositivi dei tuoi partner di chat. A parte questo, è completamente
|
||||
isolato da Internet.</li>
|
||||
<li>La privacy offerta da un’app webxdc è la privacy della tua chat, purché tu
|
||||
ti fidi delle persone con cui chatti e quindi puoi fidarti anche dell’app webxdc.</li>
|
||||
<li>Ciò significa anche: può essere un rischio per la privacy aprire le app webxdc nelle chat dove
|
||||
non ti fidi dei membri, come sai dagli allegati di posta elettronica, dove
|
||||
apri solo gli allegati provenienti dai mittenti di cui ti fidi e non da spammer.</li>
|
||||
<li>Le app webxdc non possono inviare dati in internet, o scaricare niente.</li>
|
||||
<li>Un’app webxdc può solo scambiare dati all’interno di una chat di Delta Chat, con le sue
|
||||
copie sui dispositivi dei tuoi corrispondenti. Oltre a questo, è completamente
|
||||
isolata da internet.</li>
|
||||
<li>La privacy che un’app webxdc offre è la privacy della tua chat - fino a che ti
|
||||
fidi delle persone con cui ti scrivi, ti puoi fidare dell’app webxdc allo stesso modo.</li>
|
||||
<li>Questo inoltre significa: può esserci un rischio per la privacy ad usare le app in chat con utenti non fidati.
|
||||
Esattamente come per gli allegati delle e-mail, le videochiamate o i collegamenti in chiaro:
|
||||
aprile solo da mittenti di cui ti fidi e non dagli spammer.
|
||||
Gli spammer possono riuscire ad ottenere qualunque dato tu mandi loro, come il tuo indirizzo IP.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="dove-posso-trovare-le-apps-webxdc">
|
||||
@@ -1506,18 +1447,10 @@ in questo modo, avrai una nuova stanza jitsi casuale ogni volta che chiami qualc
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Con una Lista di Trasmissione è possibile inviare un messaggio a molti destinatari contemporaneamente; quando questi vi rispondono, ricevete la risposta nella vostra chat diretta 1:1 con loro.
|
||||
I destinatari non possono vedersi a vicenda.</li>
|
||||
<li>Tecnicamente, si tratta di un messaggio di posta elettronica con molti destinatari in BCC.</li>
|
||||
<li>È possibile attivare questa funzione nella sezione “Funzionalità Sperimentali” delle impostazioni avanzate.
|
||||
Quindi è possibile creare una Lista di Trasmissione dalla finestra di dialogo “Nuova chat”.</li>
|
||||
<li>Nel caso in cui si utilizzi più di un dispositivo, le Liste di Trasmissione non sono attualmente sincronizzate tra loro.</li>
|
||||
<li>I messaggi inviati alle Liste di Trasmissione non sono crittografate. La crittografia romperebbe l’anonimato, perché
|
||||
tutti i destinatari saprebbero chi altro ha ricevuto il messaggio.
|
||||
(l’invio di singoli messaggi di posta elettronica a tutti sarebbe peggiore per il limite di velocità e il
|
||||
consumo di rete).</li>
|
||||
</ul>
|
||||
<p>Con le Liste Trasmissioni puoi inviare un messaggio a più indirizzi contemporaneamente;
|
||||
i destinatari non possono rispondere in quella chat.
|
||||
Le Liste Trasmissioni sono ancora altamente sperimentali
|
||||
e saranno molto probabilmente rimpiazzate con qualcos’altro, restate sintonizzati :)</p>
|
||||
|
||||
<h3 id="come-posso-condividere-la-mia-posizione-con-i-miei-partner-di-chat">
|
||||
|
||||
@@ -1574,6 +1507,11 @@ verrebbe eseguito dall’app Delta Chat.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Nota:
|
||||
La modifica degli indirizzi e-mail è temporaneamente disabilitata
|
||||
a causa delle modifiche in corso al nucleo di DeltaChat.
|
||||
Dovrebbe essere nuovamente disponibile tra qualche mese.</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
<p>Cambia il tuo indirizzo in “Impostazioni → Avanzate → Password e Profilo” e
|
||||
@@ -1658,19 +1596,19 @@ Tuttavia, alcuni provider necessitano di opzioni speciali per funzionare corrett
|
||||
vedi <a href="https://providers.delta.chat">Panoramica fornitore</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 id="voglio-gestire-il-mio-server-di-posta-elettronica-per-delta-chat-che-cosa-mi-consigliate">
|
||||
<h3 id="vorrei-gestire-il-mio-server-per-delta-chat-cosa-mi-consigliate">
|
||||
|
||||
|
||||
Voglio gestire il mio server di posta elettronica per Delta Chat. Che cosa mi consigliate? <a href="#voglio-gestire-il-mio-server-di-posta-elettronica-per-delta-chat-che-cosa-mi-consigliate" class="anchor"></a>
|
||||
Vorrei gestire il mio server per Delta Chat. Cosa mi consigliate? <a href="#vorrei-gestire-il-mio-server-per-delta-chat-cosa-mi-consigliate" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>La maggior parte dei server di posta funzionerà bene. Ma quello che raccomandiamo personalmente è una
|
||||
combinazione di mailcow e mailadm, come descritto <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">in questo
|
||||
blogpost</a>.</li>
|
||||
<li>È possibile trovare una <a href="https://delta.chat/it/serverguide">guida all’installazione sul nostro sito Web</a>.</li>
|
||||
<li>La maggior parte dei server di posta funzionerà bene. Ma quello che personalmente consigliamo è un
|
||||
server relay di chatmail, come descritto <a href="https://delta.chat/en/2023-12-13-chatmail">in questo
|
||||
articolo del blog</a>.</li>
|
||||
<li>Puoi trovare una <a href="https://github.com/chatmail/relay">guida all’installazione su GitHub</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="perché-devo-inserire-la-mia-password-e-mail-in-delta-chat-è-sicuro">
|
||||
@@ -1686,7 +1624,7 @@ programma ha bisogno della password in modo da poterla utilizzare per inviare ma
|
||||
password è memorizzata solo sul tuo dispositivo. La password viene trasmessa solo a
|
||||
il tuo fornitore E-Mail (quando effettui il login), che ha comunque accesso alla tua posta.</p>
|
||||
|
||||
<p>Poiché Delta Chat è Open Source, puoi controllare il <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">Codice
|
||||
<p>Poiché Delta Chat è Open Source, puoi controllare il <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">Codice
|
||||
Sorgente</a>
|
||||
se vuoi verificare che le tue credenziali siano gestite in modo sicuro. Siamo felici dei feedback che rendono l’app più sicura per tutti i nostri utenti.</p>
|
||||
|
||||
@@ -1800,17 +1738,17 @@ per la loro posta, invece della cartella DeltaChat. Se disabiliti “Controlla
|
||||
cartella DeltaChat”, dovresti anche disabilitare “sposta messaggi chat in DeltaChat”.
|
||||
In caso contrario, l’eliminazione dei messaggi o configurazioni multi-dispositivo potrebbero non funzionare correttamente.</p>
|
||||
|
||||
<h3 id="delta-chat-è-compatibile-con-protonmail--tutanota--criptext">
|
||||
<h3 id="delta-chat-è-compatibile-con-proton-mail--tutanota--criptext">
|
||||
|
||||
|
||||
Delta Chat è compatibile con Protonmail / Tutanota / Criptext? <a href="#delta-chat-è-compatibile-con-protonmail--tutanota--criptext" class="anchor"></a>
|
||||
Delta Chat è compatibile con Proton Mail / Tutanota / Criptext? <a href="#delta-chat-è-compatibile-con-proton-mail--tutanota--criptext" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Sì e no.</li>
|
||||
<li>No, non puoi utilizzare il tuo profilo Protonmail, Tutanota o Criptext con Delta
|
||||
<li>No, non puoi utilizzare il tuo profilo Proton Mail, Tutanota o Criptext con Delta
|
||||
Chat; non offrono la ricezione di posta tramite IMAP.</li>
|
||||
<li>In ogni caso puoi utilizzare Delta Chat per inviare messaggi alle persone che lo utilizzano
|
||||
Protonmail, Tutanota o Criptext. Tali messaggi non saranno end-to-end
|
||||
@@ -1863,7 +1801,7 @@ Altrimenti potresti ricevere messaggi non decifrabili da quelle chat di gruppo.<
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Vedi <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Standard usati in Delta Chat</a>.</li>
|
||||
<li>Vedi <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standard usati in Delta Chat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="dove-possono-trovare-delta-chat-i-miei-amici">
|
||||
@@ -1985,4 +1923,4 @@ sia per le possibilità monetarie che contributive.</p>
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
</body></html>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -10,7 +10,9 @@
|
||||
<li><a href="#kto-widzi-moje-zdjęcie-profilowe">Kto widzi moje zdjęcie profilowe?</a></li>
|
||||
<li><a href="#signature">Czy w Delta Chat mogę ustawić Biografię/Podpis/Status/Motto?</a></li>
|
||||
<li><a href="#co-oznacza-przypinanie-wyciszanie-i-archiwizowanie">Co oznacza przypinanie, wyciszanie i archiwizowanie?</a></li>
|
||||
<li><a href="#save">Jak działają „Zapisane wiadomości”?</a></li>
|
||||
<li><a href="#co-oznacza-zielona-kropka">Co oznacza zielona kropka?</a></li>
|
||||
<li><a href="#edit">Poprawianie literówek i usuwanie wiadomości po wysłaniu</a></li>
|
||||
<li><a href="#ephemeralmsgs">Jak działają znikające wiadomości?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -34,29 +36,25 @@
|
||||
<li><a href="#dlaczego-delta-chat-integruje-się-ze-scentralizowanymi-zastrzeżonymi-usługami-push-applegoogle">Dlaczego Delta Chat integruje się ze scentralizowanymi, zastrzeżonymi usługami push Apple/Google?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#szyfrowanie-i-bezpieczeństwo">Szyfrowanie i bezpieczeństwo</a>
|
||||
<li><a href="#e2ee">Szyfrowanie i bezpieczeństwo</a>
|
||||
<ul>
|
||||
<li><a href="#jakie-standardy-są-stosowane-do-szyfrowania-end-to-end">Jakie standardy są stosowane do szyfrowania end-to-end?</a></li>
|
||||
<li><a href="#whene2e">Skąd mogę wiedzieć, czy wiadomości są szyfrowane metodą e2e?</a></li>
|
||||
<li><a href="#howtoe2ee">Jak mogę uzyskać gwarancję kompleksowego szyfrowania i zielone znaczniki wyboru?</a></li>
|
||||
<li><a href="#e2eeguarantee">Co oznacza zielony znacznik wyboru i „gwarantowane kompleksowe szyfrowanie”?</a></li>
|
||||
<li><a href="#nocryptanymore">Kontakt „wysłał wiadomość z innego urządzenia”, co mogę zrobić?</a></li>
|
||||
<li><a href="#czy-nadal-mogę-odbierać-lub-wysyłać-wiadomości-bez-szyfrowania-end-to-end">Czy nadal mogę odbierać lub wysyłać wiadomości bez szyfrowania end-to-end?</a></li>
|
||||
<li><a href="#howtoe2ee">Jak mogę nawiązać czat z nowym kontaktem?</a></li>
|
||||
<li><a href="#e2eeguarantee">Co oznacza zielony znacznik wyboru w profilu kontaktu?</a></li>
|
||||
<li><a href="#czy-załączniki-zdjęcia-pliki-pliki-audio-itp-są-szyfrowane-metodą-end-to-end">Czy załączniki (zdjęcia, pliki, pliki audio itp.) są szyfrowane metodą end-to-end?</a></li>
|
||||
<li><a href="#openpgp-secure">Czy OpenPGP jest bezpieczny?</a></li>
|
||||
<li><a href="#openpgp-alternatives">Czy rozważałeś użycie alternatyw dla OpenPGP do szyfrowania typu end-to-end?</a></li>
|
||||
<li><a href="#czy-delta-chat-jest-podatny-na-efail">Czy Delta Chat jest podatny na EFAIL?</a></li>
|
||||
<li><a href="#tls">Czy wiadomość jest udostępniana w postaci zwykłego tekstu, jeśli szyfrowanie end-to-end nie jest dostępne?</a></li>
|
||||
<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="#jak-mogę-sprawdzić-informacje-o-szyfrowaniu">Jak mogę sprawdzić informacje o szyfrowaniu?</a></li>
|
||||
<li><a href="#jak-mogę-sprawdzić-stan-szyfrowania-wiadomości">Jak mogę sprawdzić stan szyfrowania wiadomości?</a></li>
|
||||
<li><a href="#dlaczego-widzę-niezaszyfrowane-wiadomości">Dlaczego widzę niezaszyfrowane wiadomości?</a></li>
|
||||
<li><a href="#jak-mogę-uzyskać-zaszyfrowany-ened-to-end-czat-z-kontaktem-delta-chat-który-czasami-korzysta-z-poczty-internetowej-lub-innej-aplikacji-e-mail-bez-autocrypt">Jak mogę uzyskać zaszyfrowany ened-to-end czat z kontaktem Delta Chat, który czasami korzysta z poczty internetowej lub innej aplikacji e-mail bez Autocrypt?</a></li>
|
||||
<li><a href="#jak-mogę-zapewnić-kompleksowe-szyfrowanie-i-usuwanie-wiadomości">Jak mogę zapewnić kompleksowe szyfrowanie i usuwanie wiadomości?</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="#czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal">Czy szyfrowanie end-to-end Delta Chat jest tak samo bezpieczne jak Signal?</a></li>
|
||||
<li><a href="#pqc">Czy Delta Chat obsługuje kryptografię postkwantową?</a></li>
|
||||
<li><a href="#jak-mogę-ręcznie-sprawdzić-informacje-o-szyfrowaniu">Jak mogę ręcznie sprawdzić informacje o szyfrowaniu?</a></li>
|
||||
<li><a href="#importkey">Czy mogę ponownie wykorzystać mój istniejący klucz prywatny?</a></li>
|
||||
<li><a href="#nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat">Nie mogę zaimportować istniejącego klucza PGP do Delta Chat.</a></li>
|
||||
<li><a href="#security-audits">Czy Delta Chat był niezależnie kontrolowany pod kątem luk w zabezpieczeniach?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -65,6 +63,7 @@
|
||||
<li><a href="#czy-mogę-korzystać-z-delta-chat-na-wielu-urządzeniach-w-tym-samym-czasie">Czy mogę korzystać z Delta Chat na wielu urządzeniach w tym samym czasie?</a></li>
|
||||
<li><a href="#rozwiązywanie-problemów">Rozwiązywanie problemów</a></li>
|
||||
<li><a href="#backup">Ręczny transfer</a></li>
|
||||
<li><a href="#czy-usuwanie-przypinanie-archiwizowanie-zapisywanie-wyciszanie-itp-jest-synchronizowane-ze-wszystkimi-urządzeniami">Czy usuwanie, przypinanie, archiwizowanie, zapisywanie, wyciszanie itp. jest synchronizowane ze wszystkimi urządzeniami?</a></li>
|
||||
<li><a href="#czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">Czy są jakieś plany wprowadzenia klienta Web Delta Chat?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -88,7 +87,7 @@
|
||||
<ul>
|
||||
<li><a href="#jakich-uprawnień-potrzebuje-delta-chat">Jakich uprawnień potrzebuje Delta Chat?</a></li>
|
||||
<li><a href="#czy-delta-chat-działa-z-moim-dostawcą-poczty-e-mail">Czy Delta Chat działa z <em>moim</em> dostawcą poczty e-mail?</a></li>
|
||||
<li><a href="#chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie">Chcę zarządzać własnym serwerem e-mail dla Delta Chat. Co polecacie?</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="#dlaczego-muszę-wpisać-moje-hasło-e-mail-do-delta-chat-czy-to-jest-bezpieczne">Dlaczego muszę wpisać moje hasło e-mail do Delta Chat? Czy to jest bezpieczne?</a></li>
|
||||
<li><a href="#jakie-wiadomości-pojawiają-się-w-delta-chat">Jakie wiadomości pojawiają się w Delta Chat?</a></li>
|
||||
<li><a href="#czy-delta-chat-obsługuje-wiadomości-e-mail-w-formacie-html">Czy Delta Chat obsługuje wiadomości e-mail w formacie HTML?</a></li>
|
||||
@@ -96,7 +95,7 @@
|
||||
<li><a href="#do-czego-służy-ustawienie-wyślij-kopię-do-siebie">Do czego służy ustawienie „Wyślij kopię do siebie”?</a></li>
|
||||
<li><a href="#po-co-mam-wybrać-opcję-oglądania-folderu-wysłane">Po co mam wybrać opcję oglądania folderu „Wysłane”?</a></li>
|
||||
<li><a href="#dlaczego-mogę-nie-widzieć-folderu-deltachat">Dlaczego mogę nie widzieć folderu DeltaChat?</a></li>
|
||||
<li><a href="#czy-delta-chat-jest-kompatybilny-z-protonmail--tutanota--criptext">Czy Delta Chat jest kompatybilny z Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#czy-delta-chat-jest-kompatybilny-z-proton-mail--tutanota--criptext">Czy Delta Chat jest kompatybilny z Proton Mail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#remove-account">Jak mogę usunąć swoje konto?</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>
|
||||
<li><a href="#gdzie-moi-znajomi-mogą-znaleźć-delta-chat">Gdzie moi znajomi mogą znaleźć Delta Chat?</a></li>
|
||||
@@ -154,7 +153,7 @@
|
||||
<p><a href="#security-audits">Audytowne szyfrowanie end-to-end</a> zabezpieczające przed atakami sieciowymi i serwerowymi.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Bezpłatne i otwartoźródłowe oprogramowanie zarówno po stronie aplikacji, jak i serwera. Stworzone w oparciu o <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">standardy e-mail i internetowe</a>, <a href="https://xkcd.com/927/">aby uniknąć „kolejnego standardowego syndromu (xkcd 927)”</a>.</p>
|
||||
<p>Bezpłatne i otwartoźródłowe oprogramowanie zarówno po stronie aplikacji, jak i serwera. Stworzone w oparciu o <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">standardy e-mail i internetowe</a>, <a href="https://xkcd.com/927/">aby uniknąć „kolejnego standardowego syndromu (xkcd 927)”</a>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -166,10 +165,18 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Jeśli wiadomość pochodzi od nieznanego kontaktu, wyświetla się jako <strong>prośba</strong>.</p>
|
||||
|
||||
<ul>
|
||||
<li>Jeśli wiadomość przychodzi od nieznanego kontaktu, pojawia się jako <strong>prośba</strong>. Musisz zaakceptować prośbę, zanim będziesz mógł odpowiedzieć.</li>
|
||||
<li>Możesz również „usunąć” ją, jeśli nie chcesz na razie z nią rozmawiać. To <em>nie</em> usuwa wiadomości na serwerze, tylko na Twoim urządzeniu. Możesz więc nadal zajmować się tą wiadomością w innej aplikacji pocztowej.</li>
|
||||
<li>Jeśli usuniesz prośbę, przyszłe wiadomości od tego kontaktu będą nadal wyświetlane jako prośba o wiadomość, więc możesz zmienić zdanie. Jeśli naprawdę nie chcesz otrzymywać wiadomości od tej osoby, rozważ <em>zablokowanie</em> jej.</li>
|
||||
<li>
|
||||
<p>Musisz <strong>zaakceptować</strong> prośbę, zanim będziesz mógł odpowiedzieć.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Możesz także <strong>usunąć</strong> wiadomość, jeśli nie chcesz w tej chwili z nią rozmawiać.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Jeśli usuniesz prośbę, przyszłe wiadomości od tego kontaktu nadal będą wyświetlane jako prośba o wiadomość, więc możesz zmienić zdanie. Jeśli naprawdę nie chcesz otrzymywać wiadomości od tej osoby, rozważ <strong>zablokowanie</strong> jej.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="czy-delta-chat-obsługuje-obrazy-filmy-i-inne-załączniki">
|
||||
@@ -182,7 +189,7 @@
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Tak. Oprócz zwykłego tekstu wszystkie załączniki wiadomości e-mail są wyświetlane jako oddzielne wiadomości. Wiadomości wychodzące automatycznie otrzymują załączniki w razie potrzeby.</p>
|
||||
<p>Tak. Obrazy, filmy, pliki, wiadomości głosowe itp. są obsługiwane jak zwykle.</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>
|
||||
@@ -268,6 +275,36 @@
|
||||
|
||||
<p>Aby skorzystać z tych funkcji, przytrzymaj dłużej lub kliknij prawym przyciskiem myszy czat na liście czatów.</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
Jak działają „Zapisane wiadomości”? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Zapisane wiadomości</strong> to czat, którego możesz użyć, aby łatwo zapisać i znaleźć wiadomości.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>W dowolnym czacie naciśnij i przytrzymaj lub kliknij prawym przyciskiem myszy wiadomość i wybierz <strong>Zapisz</strong></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Zapisane wiadomości są oznaczone symbolem <img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="ikona Zapisz" /> obok znacznika czasu</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Później otwórz czat „Zapisane wiadomości” — zobaczysz tam zapisane wiadomości. Naciskając <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="ikona strzałki w prawo" />, możesz wrócić do oryginalnej wiadomości w oryginalnym czacie</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Na koniec możesz również użyć „Zapisz wiadomości”, aby robić <strong>osobiste notatki</strong> — otwórz czat, wpisz coś, dodaj zdjęcie lub wiadomość głosową itp.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Ponieważ „Zapisane wiadomości” są zsynchronizowane, mogą być bardzo przydatne do przesyłania danych między urządzeniami</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Wiadomości pozostają zapisane, nawet jeśli zostaną edytowane lub usunięte — może to być przez <a href="#edit">nadawcę</a>, <a href="#delold">czyszczenie urządzenia</a> lub <a href="#ephemeralmsgs">znikające wiadomości z innych czatów</a>.</p>
|
||||
|
||||
<h3 id="co-oznacza-zielona-kropka">
|
||||
|
||||
|
||||
@@ -276,16 +313,40 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Czasami można zobaczyć <strong>zieloną kropkę</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> obok awatara kontaktu. Oznacza to, że był on „niedawno widziany” w ciągu ostatnich 10 minut:</p>
|
||||
|
||||
<ul>
|
||||
<li>Od wersji Delta Chat 1.34 czasami można zobaczyć „zieloną kropkę” obok awatara kontaktu. Oznacza to, że był on „niedawno widziany”.</li>
|
||||
<li>Dokładnie oznacza to, że w ciągu ostatnich 10 minut Delta Chat widział go:</li>
|
||||
<li>dlatego, że wysłał Ci bezpośrednio wiadomość,</li>
|
||||
<li>ponieważ napisał coś do grupy, której oboje jesteście członkami,</li>
|
||||
<li>ponieważ wysłał Ci potwierdzenie przeczytania napisanej przez Ciebie wiadomości,</li>
|
||||
<li>lub dlatego, że wysłał dane do Twojej aplikacji Delta Chat za pomocą <a href="#webxdc">Webxdc aplikacji</a>.</li>
|
||||
<li>Nie jest to więc status online w czasie rzeczywistym – a jeśli ktoś nie odpowie od razu, mimo że wydaje się, że jest online, nie martw się i daj mu trochę miejsca ;-)</li>
|
||||
<li>Z drugiej strony inni nie zawsze „zobaczą, że jesteś online”. Jeśli wyłączyłeś potwierdzenia odczytu, nie zobaczą oni zielonej kropki, dopóki nie wyślesz do nich wiadomości lub nie napiszesz do grupy, w której również się znajdują.</li>
|
||||
<li>ponieważ edytował lub usunął wiadomość w udostępnionym Tobie czacie,</li>
|
||||
<li>lub dlatego, że używał <a href="#webxdc">aplikacji</a> w udostępnionym Tobie czacie.</li>
|
||||
</ul>
|
||||
|
||||
<p>Nie jest to więc status online w czasie rzeczywistym – a jeśli ktoś nie odpowie od razu, mimo że wydaje się, że jest online, nie martw się i daj mu trochę czasu :)</p>
|
||||
|
||||
<p>Z drugiej strony, inni nie zawsze „zauważą, że jesteś online”. Jeśli wyłączyłeś potwierdzenia odczytu, nie zobaczą zielonej kropki, dopóki nie zostanie spełniony jeden z powyższych warunków.</p>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Poprawianie literówek i usuwanie wiadomości po wysłaniu <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Możesz edytować tekst wiadomości po wysłaniu. W tym celu naciśnij i przytrzymaj lub kliknij prawym przyciskiem myszy wiadomość i wybierz Edytuj, lub<img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="ikona Edytuj" />.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Jeśli wysłałeś wiadomość przypadkowo, z tego samego menu wybierz <strong>Usuń</strong>, a następnie <strong>Usuń u wszystkich</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Podczas gdy edytowane wiadomości będą miały słowo „Edytowana” obok znacznika czasu, usunięte wiadomości zostaną usunięte bez znacznika na czacie. Powiadomienia nie są wysyłane i nie ma limitu czasowego.</p>
|
||||
|
||||
<p>Pamiętaj, że oryginalną wiadomość nadal mogą otrzymać członkowie czatu, którzy mogli już odpowiedzieć, przesłać dalej, zapisać, wykonać zrzut ekranu lub w inny sposób skopiować wiadomość.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
@@ -525,10 +586,10 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
<p>Pamiętaj, że Delta Chat posiada <a href="#privacy-notifications">mały i chroniący prywatność system powiadomień push</a>, który zapewnia „natychmiastowe dostarczanie” wiadomości ze wszystkich serwerów chatmail, w tym potencjalnego, który <a href="https://delta.chat/chatmail#selfhosted">możesz skonfigurować samodzielnie bez naszej zgody</a>. Witamy w potędze interoperacyjnego i ogromnego systemu chatmail i e-mail :)</p>
|
||||
|
||||
<h2 id="szyfrowanie-i-bezpieczeństwo">
|
||||
<h2 id="e2ee">
|
||||
|
||||
|
||||
Szyfrowanie i bezpieczeństwo <a href="#szyfrowanie-i-bezpieczeństwo" class="anchor"></a>
|
||||
Szyfrowanie i bezpieczeństwo <a href="#e2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
@@ -541,9 +602,21 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> służy do automatycznego ustanawiania szyfrowania end-to-end kontaktów i czatów grupowych. Autocrypt wykorzystuje ograniczony i <a href="#openpgp-secure">bezpieczny podzbiór standardu OpenPGP</a>. W pełni zaszyfrowane wiadomości są oznaczone kłódką <img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" />.</p>
|
||||
<p>Delta Chat wykorzystuje <a href="#openpgp-secure">bezpieczny podzbiór standardu OpenPGP</a> do automatycznego szyfrowania typu end-to-end za pomocą następujących protokołów:</p>
|
||||
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Protokoły Secure-Join</a> służą do nawiązywania rozmów z gwarantowanym szyfrowaniem typu end-to-end, które chroni przed atakami sieciowymi i zagrożonymi serwerami. Czaty oznaczone zielonym znacznikiem wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> gwarantują szyfrowanie end-to-end wiadomości.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a> do wymiany informacji o konfiguracji szyfrowania poprzez skanowanie kodów QR lub „linki zaproszeń”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> służy do automatycznego ustanawiania szyfrowania typu end-to-end między kontaktami a wszystkimi członkami czatu grupowego.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Udostępnienie kontaktu na czacie</a> umożliwia odbiorcom korzystanie z szyfrowania typu end-to-end z tym kontaktem.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Delta Chat nie wysyła zapytań, nie publikuje ani nie wchodzi w interakcję z żadnymi serwerami kluczy OpenPGP.</p>
|
||||
|
||||
<h3 id="whene2e">
|
||||
|
||||
@@ -553,100 +626,66 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Wszystkie całkowicie zaszyfrowane wiadomości są oznaczone kłódką:</p>
|
||||
|
||||
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
|
||||
|
||||
<p>Pełne szyfrowanie jest gwarantowane, jeśli obok tytułu czatu znajduje się zielony znacznik wyboru:</p>
|
||||
|
||||
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
|
||||
<p>Wszystkie wiadomości w Delta Chat są <strong>domyślnie szyfrowane metodą end-to-end</strong>. Od wydania Delta Chat w wersji 2 (lipiec 2025 r.) nie ma już blokad ani podobnych znaczników na wiadomościach szyfrowanych metodą end-to-end.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
<h3 id="czy-nadal-mogę-odbierać-lub-wysyłać-wiadomości-bez-szyfrowania-end-to-end">
|
||||
|
||||
|
||||
Jak mogę uzyskać gwarancję kompleksowego szyfrowania i zielone znaczniki wyboru? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Czy nadal mogę odbierać lub wysyłać wiadomości bez szyfrowania end-to-end? <a href="#czy-nadal-mogę-odbierać-lub-wysyłać-wiadomości-bez-szyfrowania-end-to-end" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Jeśli masz drugi kanał komunikacji ze swoim partnerem na czacie, np. czat wideo lub inny komunikator, możesz wygenerować link zaproszenia.</p>
|
||||
<p>Jeśli korzystasz z domyślnych <a href="https://chatmail.at/relays">przekaźników chatmail</a>, odbieranie ani wysyłanie wiadomości bez szyfrowania end-to-end jest niemożliwe.</p>
|
||||
|
||||
<p>Jeśli jesteście razem osobiście, możesz pokazać kod QR swojemu rozmówcy.</p>
|
||||
<p>Jeśli zamiast tego utworzysz profil przy użyciu klasycznego serwera poczty e-mail, możesz wysyłać i odbierać wiadomości bez szyfrowania end-to-end. Takie wiadomości bez szyfrowania end-to-end są oznaczone ikoną e-mail <img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
Jak mogę nawiązać czat z nowym kontaktem? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Możesz wysłać link z zaproszeniem za pośrednictwem innego prywatnego czatu, wyświetlić kod QR zaproszenia, gdy kontakty znajdują się obok siebie lub w rozmowie wideo, albo dotknąć „kontakt”, który został udostępniony na czacie.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>W przypadku <strong>zaproszeń grupowych</strong> dotknij tytułu czatu grupy, aby wyświetlić listę jej członków, i wybierz „Kod QR zaproszenia”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Aby uzyskać <strong>bezpośrednie zaproszenia na czat 1:1</strong>, dotknij ikony kodu QR <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> na ekranie głównym aplikacji Delta Chat.</p>
|
||||
<p>Aby <strong>wysłać zaproszenie do czatu 1:1</strong>, dotknij ikony kodu QR <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> na ekranie głównym aplikacji Delta Chat.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Pozwól swojemu partnerowi czatu zeskanować obraz QR za pomocą aplikacji Delta Chat lub dotknij „Kopiuj” lub „Udostępnij”, aby utworzyć link zaproszenia i udostępnić go swojemu partnerowi czatu.</p>
|
||||
<p>Poproś rozmówcę o zeskanowanie obrazu QR za pomocą aplikacji Delta Chat lub dotknij „Kopiuj” lub „Udostępnij”, aby utworzyć link zaproszenia i udostępnić go rozmówcy.</p>
|
||||
|
||||
<p>Teraz poczekaj, aż między obydwoma urządzeniami <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">nastąpi wymiana wiadomości sieciowych Secure-Join</a>.</p>
|
||||
<p>Poczekaj, aż <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">szyfrowanie typu end-to-end zostanie nawiązane</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Jeśli oba urządzenia są w trybie online, obie strony ostatecznie zobaczą czat (grupowy lub bezpośredni) z zielonym znacznikiem wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> obok tytułu.</p>
|
||||
<p>Jeśli obie strony są online, wkrótce zobaczą czat (grupowy lub bezpośredni) i będą mogły bezpiecznie wysyłać wiadomości.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Jeśli jedno z urządzeń jest w trybie offline, zielone znaczniki wyboru pojawią się później, dopiero gdy urządzenie zostanie ponownie połączone z Internetem i zostanie zrealizowany protokół sieciowy Secure-Join.</p>
|
||||
<p>Jeśli jedna ze stron jest offline lub ma słaby zasięg, możliwość czatowania zostanie wstrzymana do czasu przywrócenia połączenia.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Gratulacje! Teraz będziecie automatycznie korzystać z gwarantowanego kompleksowego szyfrowania tego kontaktu i oboje będziecie mogli dodawać się nawzajem do grup oznaczonych zielonym znacznikiem wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> , w ten sposób automatycznie rozpowszechniając gwarantowane kompleksowe szyfrowanie wśród swoich członków.</p>
|
||||
<p>Gratulacje! Teraz będziesz automatycznie korzystać z szyfrowania typu end-to-end dla tego kontaktu. Jeśli dodacie się nawzajem do czatów grupowych, szyfrowanie typu end-to-end zostanie nawiązane między wszystkimi członkami.</p>
|
||||
|
||||
<h3 id="e2eeguarantee">
|
||||
|
||||
|
||||
Co oznacza zielony znacznik wyboru i „gwarantowane kompleksowe szyfrowanie”? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
Co oznacza zielony znacznik wyboru w profilu kontaktu? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Tytuły czatów z zielonymi znacznikami wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> oznaczają, że wszystkie wiadomości na czacie będą w pełni szyfrowane i nie będą mogły zostać odczytane ani zmodyfikowane przez zhakowane serwery poczty e-mail lub dostawców Internetu. Dołączanie do czatów grupowych oznaczonych zielonym znacznikiem bezpiecznie rozpowszechnia informacje o szyfrowaniu wszystkich osób (i zielone znaczniki wyboru) w sposób gwarantujący kompleksowe szyfrowanie w grupie i pomiędzy członkami.</p>
|
||||
|
||||
<p>Profile kontaktów z zielonymi znacznikami wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> oznaczają, że obecnie gwarantujemy, że wiadomości kontaktu będą szyfrowane metodą end-to-end. Każdy kontakt oznaczony zielonym znacznikiem albo wykonał z tobą bezpośrednie <a href="#howtoe2ee">skanowanie QR</a>, albo został zweryfikowany przez inny kontakt oznaczony zielonym znacznikiem. Weryfikacje odbywają się automatycznie podczas dodawania członków do grup. Ktokolwiek doda kontakt do grupy oznaczonej zielonym znacznikiem, staje się osobą weryfikującą dla tych członków, którzy jeszcze nie wiedzieli o dodanym kontakcie. W profilu kontaktu możesz wielokrotnie dotykać tekstu „Zweryfikowano przez…”, aż dojdziesz do osoby, z którą bezpośrednio wykonałeś <a href="#howtoe2ee">skanowanie QR</a>.</p>
|
||||
|
||||
<p>Pamiętaj, że w profilu kontaktu możesz widzieć i klikać osoby weryfikujące, ale w tytule profilu nie ma zielonego znacznika wyboru. Zwykle oznacza to, że kontakt <a href="#nocryptanymore">„wysłał wiadomość z innego urządzenia”</a>.</p>
|
||||
<p>Profil kontaktu może wyświetlać zielony znacznik wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> i wiersz „Zweryfikowano przez…”. Każdy kontakt oznaczony zielonym znacznikiem albo wykonał z tobą bezpośrednie <a href="#howtoe2ee">skanowanie QR</a>, albo został zweryfikowany przez inny kontakt oznaczony zielonym znacznikiem. Weryfikacje odbywają się automatycznie podczas dodawania członków do grup. Osoba, która doda kontakt oznaczony zielonym znacznikiem wyboru do grupy zawierającej wyłącznie członków oznaczonych zielonym znacznikiem wyboru, staje się osobą weryfikującą. W profilu kontaktu możesz wielokrotnie dotykać tekstu „Zweryfikowano przez…”, aż dojdziesz do osoby, z którą bezpośrednio wykonałeś <a href="#howtoe2ee">skanowanie QR</a>.</p>
|
||||
|
||||
<p>Aby uzyskać bardziej szczegółowe omówienie „gwarantowanego szyfrowania typu end-to-end”, zobacz <a href="https://securejoin.delta.chat/en/latest/new.html">Protokoły Secure-Join</a>, a w szczególności przeczytaj o „zweryfikowanych grupach”, technicznym określeniu tak zwanego tutaj „zielonego znacznika wyboru” lub „gwarantowanego szyfrowania end-to-end” czatów.</p>
|
||||
|
||||
<h3 id="nocryptanymore">
|
||||
|
||||
|
||||
Kontakt „wysłał wiadomość z innego urządzenia”, co mogę zrobić? <a href="#nocryptanymore" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Twój czat z kontaktem utracił gwarantowane szyfrowanie typu end-to-end. Gdy zobaczysz to ostrzeżenie, zielony znacznik wyboru dla tego czatu i kontaktu został usunięty. <strong>Jeśli zdziwi cię nagły spadek gwarantowanego szyfrowania end-to-end tego kontaktu, nie akceptuj ostrzeżenia!</strong> Zamiast tego skontaktuj się ze swoim kontaktem za pośrednictwem drugiego kanału, takiego jak rozmowa wideo, inny komunikator lub rozmowa telefoniczna, aby dowiedzieć się, co się stało.</p>
|
||||
|
||||
<p>Jeśli twój kontakt rzeczywiście spowodował spadek gwarantowanego szyfrowania typu end-to-end, zapoznaj się z kolejnymi akapitami, aby poznać typowe przyczyny i sposoby ich łagodzenia. Niezależnie od tego, wszystkie inne czaty oznaczone zielonym znacznikiem są w pełni szyfrowane, nawet jeśli kontakt jest ich członkiem.</p>
|
||||
|
||||
<p><strong>Twój kontakt korzysta z Delta Chat na drugim urządzeniu (telefonie lub laptopie)</strong></p>
|
||||
|
||||
<p>Jeśli ma inne urządzenie z uruchomioną aplikacją Delta Chat, powinien usunąć konto z nowego urządzenia i dodać je <a href="#multiclient">jako drugie urządzenie zgodnie z opisem tutaj</a>. Gdy tylko skontaktuje się z tobą później, ostrzeżenie zniknie, a na obu urządzeniach twojego kontaktu zostanie ustanowione gwarantowane szyfrowanie.</p>
|
||||
|
||||
<p><strong>Twój kontakt ponownie zainstalował Delta Chat, używając swojego starego loginu do konta</strong></p>
|
||||
|
||||
<p>Jeśli ma <a href="#backup">plik kopii zapasowej</a>, powinien usunąć konto z nowego urządzenia i zamiast tego zaimportować plik kopii zapasowej, aby ponownie utworzyć konto. Gdy tylko skontaktuje się z tobą później, ostrzeżenie zniknie, a dla tego kontaktu zostanie przywrócone gwarantowane szyfrowanie.</p>
|
||||
|
||||
<p>Jeśli nie ma pliku kopii zapasowej, najlepiej wykonać <a href="#howtoe2ee">skanowanie QR</a> ze swoim partnerem czatu, aby przywrócić gwarantowane szyfrowanie end-to-end.</p>
|
||||
|
||||
<p><strong>Twój kontakt wysłał wiadomość e-mail za pośrednictwem interfejsu poczty internetowej lub innej aplikacji e-mail i wkrótce ponownie zacznie korzystać z Delta Chat.</strong></p>
|
||||
|
||||
<p>Jeśli masz pewność, że kontakt czasami korzysta z poczty internetowej lub innej aplikacji pocztowej, która nie zapewnia szyfrowania end-to-end, możesz zaakceptować ostrzeżenie. Gdy tylko twój kontakt ponownie skorzysta z Delta Chat, gwarantowane szyfrowanie end-to-end zostanie automatycznie przywrócone.</p>
|
||||
|
||||
<p><strong>Twój kontakt całkowicie przestał korzystać z Delta Chat</strong></p>
|
||||
|
||||
<p>Czasami utrzymanie kontaktu jest ważniejsze niż szyfrowanie end-to-end. <a href="#tls">„Szyfrowanie warstwy transportowej” (TLS)</a> może w dalszym ciągu w znaczący sposób chronić poufność wiadomości przesyłanych między urządzeniem a serwerem poczty e-mail. Jednak bez kompleksowego szyfrowania Ty i Twój kontakt ufacie swojemu serwerowi poczty e-mail, że nie będzie czytać ani manipulować waszymi wiadomościami i nie będzie przekazywać ich osobom trzecim.</p>
|
||||
|
||||
<p>W każdym razie nie możesz zrobić nic innego, jak zaakceptować ostrzeżenie. Usuń także kontakt z aktywnej grupy oznaczonej zielonym znacznikiem, którą znajdziesz w sekcji „Współdzielone czaty” w profilu kontaktu. Dzięki temu twój kontakt nie otrzyma „nieczytelnych” wiadomości.</p>
|
||||
|
||||
<p>Jeśli kontakt usunął Delta Chat z powodu błędów lub niepożądanego zachowania, rozważ opublikowanie postu na naszym <a href="https://support.delta.chat">forum pomocy</a>, aby pomóc nam zidentyfikować i rozwiązać typowe problemy. Dzięki!</p>
|
||||
|
||||
<h3 id="czy-załączniki-zdjęcia-pliki-pliki-audio-itp-są-szyfrowane-metodą-end-to-end">
|
||||
|
||||
|
||||
@@ -667,7 +706,7 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Tak, Delta Chat korzysta z bezpiecznego podzbioru OpenPGP i wyświetla wskaźnik bezpieczeństwa kłódki na wiadomości tylko wtedy, gdy cała wiadomość jest prawidłowo zaszyfrowana i podpisana. Na przykład „Odłączone podpisy” nie są traktowane jako bezpieczne.</p>
|
||||
<p>Tak, Delta Chat korzysta z bezpiecznego podzbioru OpenPGP, który wymaga prawidłowego zaszyfrowania i podpisania całej wiadomości. Na przykład „Odłączone podpisy” nie są traktowane jako bezpieczne.</p>
|
||||
|
||||
<p>OpenPGP samo w sobie nie jest niebezpieczne. Większość publicznie omawianych problemów związanych z bezpieczeństwem OpenPGP tak naprawdę wynika ze złej użyteczności lub złej implementacji narzędzi, lub aplikacji (lub obu). Szczególnie ważne jest rozróżnienie pomiędzy OpenPGP, standardem szyfrowania IETF, a GnuPG (GPG), narzędziem wiersza poleceń implementującym OpenPGP. Wiele publicznych komentarzy krytycznych na temat OpenPGP tak naprawdę omawia GnuPG, którego Delta Chat nigdy nie używał. Delta Chat korzysta raczej z implementacji OpenPGP Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, dostępnej jako <a href="https://crates.io/crates/pgp">niezależny pakiet „pgp”</a> i poddanej <a href="#security-audits">audytowi bezpieczeństwa w 2019 i 2024 roku</a>.</p>
|
||||
|
||||
@@ -700,16 +739,14 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
<h3 id="tls">
|
||||
|
||||
|
||||
Czy wiadomość jest udostępniana w postaci zwykłego tekstu, jeśli szyfrowanie end-to-end nie jest dostępne? <a href="#tls" class="anchor"></a>
|
||||
Czy wiadomości oznaczone ikoną poczty są widoczne w internecie? <a href="#tls" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Nawet jeśli nie ma gwarancji, że twoje wiadomości będą zaszyfrowane metodą end-to-end, nadal są chronione przed dostawcami Internetu, takimi jak operatorzy komórkowi lub telewizji kablowej. Jednakże dostawcy poczty e-mail zarówno twoi, jak i twojego odbiorcy mogą czytać, analizować, a nawet modyfikować twoje wiadomości, w tym wszelkie załączniki, jeśli nie są one w pełni zaszyfrowane.</p>
|
||||
<p>Jeśli wysyłasz lub odbierasz wiadomości e-mail bez szyfrowania end-to-end (korzystając z klasycznego serwera poczty), są one nadal chronione przed operatorami komórkowymi lub kablowymi, którzy nie mogą ich czytać ani modyfikować. Jednak zarówno twoi dostawcy poczty e-mail, jak i dostawcy poczty e-mail odbiorcy mogą czytać, analizować lub modyfikować twoje wiadomości, w tym wszelkie załączniki.</p>
|
||||
|
||||
<p>Delta Chat domyślnie korzysta ze ścisłego <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">szyfrowania TLS</a>, które zabezpiecza połączenia pomiędzy twoim urządzeniem a dostawcą poczty e-mail. Cała obsługa TLS Delta Chat została poddana niezależnemu <a href="#security-audits">audytowi bezpieczeństwa</a>. Co więcej, połączenie między tobą a dostawcą poczty e-mail odbiorcy będzie zazwyczaj również szyfrowane. Jeśli zaangażowane serwery poczty e-mail obsługują <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>, pomiędzy dostawcami poczty e-mail będzie egzekwowane szyfrowanie transportu. W takim przypadku komunikacja Delta Chat nigdy nie będzie udostępniana w Internecie w postaci zwykłego tekstu, nawet jeśli wiadomość nie została zaszyfrowana metodą end-to-end.</p>
|
||||
|
||||
<p>Pamiętaj, że <a href="#howtoe2ee">utrzymywanie gwarantowanego szyfrowania typu end-to-end</a> oprócz szyfrowania TLS zapewnia wszechstronne bezpieczeństwo między urządzeniami twoimi i odbiorców. Nawet twój dostawca poczty e-mail lub Internetu nie będzie w stanie przeczytać ani zmodyfikować twoich wiadomości.</p>
|
||||
|
||||
<h3 id="message-metadata">
|
||||
|
||||
@@ -719,20 +756,23 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat chroni większość metadanych wiadomości, umieszczając następujące informacje w całkowicie zaszyfrowanej części wiadomości:</p>
|
||||
<p>W przeciwieństwie do większości innych komunikatorów, aplikacje Delta Chat nie przechowują żadnych metadanych dotyczących kontaktów ani grup na serwerach, również w formie zaszyfrowanej. Zamiast tego wszystkie metadane grup są szyfrowane metodą end-to-end i przechowywane wyłącznie na urządzeniach użytkowników końcowych.</p>
|
||||
|
||||
<p>Serwery poczty e-mail widzą zatem tylko:</p>
|
||||
|
||||
<ul>
|
||||
<li>Wiersz tematu</li>
|
||||
<li>Awatar i nazwa grupy</li>
|
||||
<li>Żądania MDN (potwierdzenie odczytu) (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
|
||||
<li>Licznik czasu znikania wiadomości (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
|
||||
<li><code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code></li>
|
||||
<li>Nagłówek <code class="language-plaintext highlighter-rouge">Secure-Join</code> zawierający polecenia bezpiecznego łączenia</li>
|
||||
<li>Powiadomienie o włączeniu przesyłania strumieniowego lokalizacji</li>
|
||||
<li>Adres URL pokoju WebRTC</li>
|
||||
<li>
|
||||
<p>datę wysłania wiadomości,</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>adresy nadawcy i odbiorcy,</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>oraz rozmiar wiadomości.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Serwery poczty e-mail nie mają dostępu do chronionych metadanych, ale widzą datę wiadomości, jej rozmiar oraz, co ważniejsze, adresy nadawcy i odbiorcy. Serwery poczty e-mail potrzebują adresów odbiorców, aby kierować i dostarczać wiadomości do urządzeń odbiorców.</p>
|
||||
<p>Wszystkie pozostałe metadane dotyczące wiadomości, kontaktów i grup znajdują się w zaszyfrowanej metodą end-to-end części wiadomości.</p>
|
||||
|
||||
<h3 id="device-seizure">
|
||||
|
||||
@@ -742,61 +782,21 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Zarówno w celu ochrony przed serwerami poczty e-mail gromadzącymi metadane, jak i przed zagrożeniem przejęcia urządzenia, zalecamy użycie zoptymalizowanej <a href="https://delta.chat/pl/serverguide">instancji serwera poczty e-mail</a> Delta Chat w celu tworzenia pseudonimowych kont tymczasowych poprzez skanowanie kodów QR. Pamiętaj, że aplikacje Delta Chat na wszystkich platformach obsługują wiele kont, dzięki czemu możesz z łatwością korzystać z kont „1-tygodniowych” lub „1-miesięcznych” związanych z konkretnymi działaniami obok konta „głównego”, wiedząc, że wszystkie tymczasowe dane konta wraz ze wszystkimi metadanymi zostaną usunięte. Co więcej, jeśli urządzenie zostanie przejęte, nie będzie można łatwo zidentyfikować kontaktów korzystających z tymczasowych kont e-mail, w porównaniu z komunikatorami, które ujawniają numery telefonów w grupach czatów, które z kolei często są powiązane z tożsamością prawną.</p>
|
||||
<p>Zarówno w celu ochrony przed serwerami poczty e-mail gromadzącymi metadane, jak i przed zagrożeniem przejęcia urządzenia, zalecamy użycie <a href="https://chatmail.at/relays">przełącznika chatmail</a> do tworzenia profili czatu z losowymi adresami e-mail do przesyłania. Pamiętaj, że aplikacje Delta Chat na wszystkich platformach obsługują wiele kont, dzięki czemu możesz z łatwością korzystać z kont „1-tygodniowych” lub „1-miesięcznych” związanych z konkretnymi działaniami obok konta „głównego”, wiedząc, że wszystkie tymczasowe dane konta wraz ze wszystkimi metadanymi zostaną usunięte. Co więcej, jeśli urządzenie zostanie przejęte, kontakty czatu korzystające z profili krótkotrwałych nie będą mogły zostać łatwo zidentyfikowane.</p>
|
||||
|
||||
<h3 id="jak-mogę-sprawdzić-informacje-o-szyfrowaniu">
|
||||
<h3 id="sealedsender">
|
||||
|
||||
|
||||
Jak mogę sprawdzić informacje o szyfrowaniu? <a href="#jak-mogę-sprawdzić-informacje-o-szyfrowaniu" class="anchor"></a>
|
||||
Czy Delta Chat obsługuje funkcję „Sealed Sender”? <a href="#sealedsender" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Możesz sprawdzić stan szyfrowania end-to-end ręcznie w oknie dialogowym „Szyfrowanie” (profil użytkownika w systemie Android/iOS lub kliknij prawym przyciskiem myszy element listy czatu użytkownika na komputerze). Delta Chat pokazuje tam dwa odciski palców. Jeśli te same odciski palców pojawią się u ciebie i urządzeniu twojego kontaktu, połączenie jest bezpieczne.</p>
|
||||
|
||||
<h3 id="jak-mogę-sprawdzić-stan-szyfrowania-wiadomości">
|
||||
|
||||
|
||||
Jak mogę sprawdzić stan szyfrowania wiadomości? <a href="#jak-mogę-sprawdzić-stan-szyfrowania-wiadomości" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
<p>Nie, jeszcze nie.</p>
|
||||
|
||||
<p>Mała <strong>kłódka</strong> w dymku wiadomości oznacza, że wiadomość od danego nadawcy została prawidłowo zaszyfrowana. Jeśli <strong>nie ma kłódki</strong>, wiadomość nie została prawidłowo zaszyfrowana metodą end-to-end, najprawdopodobniej dlatego, że nadawca korzysta z aplikacji lub interfejsu poczty internetowej bez obsługi szyfrowania typu end-to-end.</p>
|
||||
|
||||
<h3 id="dlaczego-widzę-niezaszyfrowane-wiadomości">
|
||||
|
||||
|
||||
Dlaczego widzę niezaszyfrowane wiadomości? <a href="#dlaczego-widzę-niezaszyfrowane-wiadomości" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
<p>Komunikator Signal wprowadził funkcję <a href="https://signal.org/blog/sealed-sender/">„Sealed Sender”</a> w 2018 roku, aby infrastruktura serwerowa nie wiedziała, kto wysyła wiadomość do grupy odbiorców. Jest to szczególnie ważne, ponieważ serwer Signal zna numer telefonu komórkowego każdego konta, który zazwyczaj jest powiązany z identyfikatorem paszportu.</p>
|
||||
|
||||
<p>Jeśli kontakt korzysta z aplikacji e-mail bez Autocrypt, wszystkie wiadomości od tego kontaktu (w czacie grupowym lub 1:1) nie będą w pełni szyfrowane, w związku z czym nie będą wyświetlane z „kłódką” przy wiadomościach. Pamiętaj, że nawet jeśli twoje kontakty korzystają z Delta Chat na swoim koncie, mogą również używać na tym koncie aplikacji e-mail bez Autocrypt, co może powodować sporadyczne wysyłanie niezaszyfrowanych wiadomości. Odpowiadanie niezaszyfrowanych wiadomości na niezaszyfrowane wiadomości jest wymagane przez funkcję Autocrypt, aby zapobiec nieczytelnym wiadomościom po stronie twoich kontaktów i ich aplikacji e-mail bez Autocrypt.</p>
|
||||
|
||||
<h3 id="jak-mogę-uzyskać-zaszyfrowany-ened-to-end-czat-z-kontaktem-delta-chat-który-czasami-korzysta-z-poczty-internetowej-lub-innej-aplikacji-e-mail-bez-autocrypt">
|
||||
|
||||
|
||||
Jak mogę uzyskać zaszyfrowany ened-to-end czat z kontaktem Delta Chat, który czasami korzysta z poczty internetowej lub innej aplikacji e-mail bez Autocrypt? <a href="#jak-mogę-uzyskać-zaszyfrowany-ened-to-end-czat-z-kontaktem-delta-chat-który-czasami-korzysta-z-poczty-internetowej-lub-innej-aplikacji-e-mail-bez-autocrypt" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Jeśli potrzebujesz bezpiecznie, kompleksowo zaszyfrowanego czatu z kontaktem, który korzysta ze swojego konta zarówno w Delta Chat, jak i w aplikacjach bez Autocrypt (np. poczta internetowa), najlepiej skonfigurować z nim gwarantowane szyfrowanie typu end-to-end, a następnie utworzyć <a href="#howtoe2ee">gwarantowany zaszyfrowany end-to-end</a> czat grupowy z wami dwoma jako członkami. W tym czacie grupowym wszystkie wiadomości będą w pełni szyfrowane, nawet jeśli bezpośredni czat między wami zawiera ostrzeżenie <a href="#nocryptanymore">„…wysłano wiadomość z innego urządzenia”</a>.</p>
|
||||
|
||||
<h3 id="jak-mogę-zapewnić-kompleksowe-szyfrowanie-i-usuwanie-wiadomości">
|
||||
|
||||
|
||||
Jak mogę zapewnić kompleksowe szyfrowanie i usuwanie wiadomości? <a href="#jak-mogę-zapewnić-kompleksowe-szyfrowanie-i-usuwanie-wiadomości" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Najlepszym sposobem, aby mieć pewność, że każda wiadomość jest kompleksowo zaszyfrowana, a metadane usunięte tak szybko, jak to możliwe, jest <a href="#howtoe2ee">korzystanie z czatów z gwarantowanym szyfrowaniem end-to-end</a> i włączonymi <a href="#ephemeralmsgs">znikającymi wiadomościami</a>.</p>
|
||||
|
||||
<p>Gwarantowane szyfrowane metodą end-to-end czaty chronią przed atakami <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM attacks</a>, a włączenie znikających wiadomości powoduje usunięcie wiadomości z serwera po upływie czasu skonfigurowanego przez użytkownika.</p>
|
||||
|
||||
<p>Jeśli nie potrzebujesz dłuższej kopii wiadomości na serwerze, możesz także włączyć opcję <a href="#delold">„automatycznie usuń wiadomości z serwera”</a>.</p>
|
||||
<p>Nawet jeśli <a href="https://chatmail.at/relays">przekaźniki chatmail</a> nie proszą o żadne prywatne dane (w tym numery telefonów), warto chronić metadane relacji między adresami. Nie przewidujemy poważniejszych problemów w korzystaniu z losowych, jednorazowych adresów e-mail do wysyłania wiadomości w tajemnicy, ale wdrożenie tej funkcji nie zostało jeszcze uznane za priorytetowe.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
@@ -806,23 +806,33 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Nie, Delta Chat nie obsługuje funkcji Perfect Forward Secrecy (PFS). Oznacza to, że jeśli twój prywatny klucz deszyfrujący Delta Chat wycieknie i ktoś zdobędzie twoje wcześniejsze wiadomości w trakcie przesyłania, będzie mógł je odszyfrować i odczytać przy użyciu ujawnionego klucza deszyfrowania.</p>
|
||||
<p>Nie, jeszcze nie.</p>
|
||||
|
||||
<p>Należy jednak pamiętać, że jeśli ktoś zdobędzie twoje klucze deszyfrujące, zazwyczaj będzie mógł również uzyskać twoje wiadomości, niezależnie od tego, czy obowiązuje zasada Perfect Forward Secrecy, czy nie. Typową sytuacją w świecie rzeczywistym w przypadku wycieku kluczy deszyfrujących jest przejęcie urządzenia, które omawiamy w naszej odpowiedzi na temat <a href="#device-seizure">przejęcia metadanych i urządzenia</a>.</p>
|
||||
<p>Delta Chat obecnie nie obsługuje mechanizmu Perfect Forward Secrecy (PFS). Oznacza to, że jeśli twój prywatny klucz deszyfrujący zostanie ujawniony, a ktoś zdobędzie twoje wcześniejsze wiadomości w trakcie transmisji, będzie mógł je odszyfrować i odczytać za pomocą ujawnionego klucza deszyfrującego. Należy pamiętać, że mechanizm Forward Secrecy zwiększa bezpieczeństwo tylko w przypadku usuwania wiadomości. W przeciwnym razie osoba, która uzyska twoje klucze deszyfrujące, zazwyczaj będzie mogła uzyskać dostęp do wszystkich nieusuniętych wiadomości i nie będzie musiała odszyfrowywać żadnych wcześniej zebranych wiadomości.</p>
|
||||
|
||||
<p>Możliwe, że Delta Chat ewoluuje, aby wspierać Perfect Forward Secrecy, ponieważ OpenPGP to tylko kontener na zaszyfrowane wiadomości, ale zarządzanie kluczami szyfrowania (a tym samym rotacja kluczy lub „zapadanie kluczy”) mogłoby być zorganizowane w elastyczny sposób. Zobacz <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">prototyp PFS firmy Seqouia</a>, aby zapoznać się z istniejącymi eksperymentami w społeczności implementatorów OpenPGP.</p>
|
||||
<p>Opracowaliśmy metodę Forward Secrecy, która przeszła wstępną analizę niektórych kryptografów i ekspertów ds. wdrożeń, ale oczekuje na bardziej formalne opracowanie, które potwierdzi jej niezawodne działanie w federacyjnym przesyłaniu wiadomości i w przypadku korzystania z wielu urządzeń, zanim zostanie zaimplementowana w <a href="https://github.com/chatmail/core">rdzeniu chatmail</a>, co uczyniłoby ją dostępną we wszystkich <a href="https://chatmail.at/clients">klientach chatmail</a>.</p>
|
||||
|
||||
<h3 id="czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal">
|
||||
<h3 id="pqc">
|
||||
|
||||
|
||||
Czy szyfrowanie end-to-end Delta Chat jest tak samo bezpieczne jak Signal? <a href="#czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal" class="anchor"></a>
|
||||
Czy Delta Chat obsługuje kryptografię postkwantową? <a href="#pqc" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>To zależy od tego, co jest dla ciebie ważne. Delta Chat <a href="#pfs">nie obsługuje PFS</a> tak jak Signal, ale zapewnia <a href="#e2eeguarantee">gwarantowane szyfrowane end-to-end czatów</a>, które jest zabezpieczeniem przed zaatakowanymi serwerami lub uszkodzonymi sieciami. Signal i większość innych komunikatorów obsługujących PFS nie zapewniają praktycznego schematu ochrony czatów grupowych przed atakami sieciowymi, które są prawdopodobnie bardziej niepokojące niż potencjalny atakujący, który przejmuje twój telefon i prywatne ustawienia szyfrowania i w ten sposób nie twoje wiadomości i mimo to ma pełny zapis wszystkich poprzednio zaszyfrowanych wiadomości.</p>
|
||||
<p>Nie, jeszcze nie.</p>
|
||||
|
||||
<p>W każdym razie szyfrowanie end-to-end Delta Chat wykorzystuje <a href="#openpgp-secure">bezpieczny podzbiór OpenPGP</a>, który został poddany <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">niezależnemu audytowi bezpieczeństwa</a>.</p>
|
||||
<p>Delta Chat korzysta z biblioteki Rust OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a>, która obsługuje najnowszy <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">projekt OpenPGP IETF Post-Quantum-Cryptography</a>. Planujemy dodać obsługę PQC do <a href="https://github.com/chatmail/core">rdzenia chatmail</a> po sfinalizowaniu projektu w IETF we współpracy z innymi implementatorami OpenPGP.</p>
|
||||
|
||||
<h3 id="jak-mogę-ręcznie-sprawdzić-informacje-o-szyfrowaniu">
|
||||
|
||||
|
||||
Jak mogę ręcznie sprawdzić informacje o szyfrowaniu? <a href="#jak-mogę-ręcznie-sprawdzić-informacje-o-szyfrowaniu" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Możesz sprawdzić stan szyfrowania end-to-end ręcznie w oknie dialogowym „Szyfrowanie” (profil użytkownika w systemie Android/iOS lub kliknij prawym przyciskiem myszy element listy czatu użytkownika na komputerze). Delta Chat pokazuje tam dwa odciski palców. Jeśli te same odciski palców pojawią się u ciebie i urządzeniu twojego kontaktu, połączenie jest bezpieczne.</p>
|
||||
|
||||
<h3 id="importkey">
|
||||
|
||||
@@ -832,33 +842,11 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Tak.
|
||||
The best way is to send an Autocrypt Setup Message from the other e-mail client.
|
||||
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
|
||||
<p>Nie.</p>
|
||||
|
||||
<p>Alternatywnie możesz zaimportować klucz ręcznie w „Ustawienia » Zaawansowane » Importuj tajne klucze”. Uwaga: Upewnij się, że klucz nie jest chroniony hasłem lub wcześniej usuń hasło.</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>Jeśli nie masz klucza lub nawet nie wiesz, że go potrzebujesz nie przejmuj się: Delta Chat generuje go w razie potrzeby, nie trzeba naciskać przycisku, aby to zrobić.</p>
|
||||
|
||||
<h3 id="nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat">
|
||||
|
||||
|
||||
Nie mogę zaimportować istniejącego klucza PGP do Delta Chat. <a href="#nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Jest wielce prawdopodobne, że problemem jest klucz, który jest zaszyfrowany i/lub używa hasła. Takie klucze nie są obsługiwane przez Delta Chat. Usuń szyfrowanie i hasło i spróbować ponownie zaimportować klucz.</p>
|
||||
|
||||
<p>Innym częstym błędem jest nieprawidłowe zakończenie pliku.
|
||||
Użyj opancerzonego formatu ASCII i końcówki pliku <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
|
||||
|
||||
<p>Rozsądny format, Delta Chat obsługuje popularne formaty kluczy prywatnych OpenPGP, jednak jest mało prawdopodobne, że będziemy obsługiwać 100% wszystkich kluczy prywatnych z dowolnych źródeł. To również nie jest głównym celem Delta Chat (w rzeczywistości, znaczna większość użytkowników Delta Chat nie będzie miała żadnego klucza przed rozpoczęciem korzystania z Delta). Jednak staramy się wspierać klucze prywatne z innych źródeł tak dobrze jak to tylko możliwe.</p>
|
||||
|
||||
<p>Usunięcie hasła z klucza prywatnego będzie się różnić w zależności od
|
||||
oprogramowania używanego do zarządzania kluczami PGP. Za pomocą programu Enigmail można ustawić
|
||||
hasło na pustą wartość w oknie zarządzania kluczami. Z GnuPG możesz ustawić je <a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">z linii poleceń</a>.
|
||||
W przypadku innych programów można znaleźć rozwiązanie online.</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>
|
||||
|
||||
<h3 id="security-audits">
|
||||
|
||||
@@ -915,7 +903,7 @@ od najnowszych do najstarszych:</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Tak. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
|
||||
<p>Tak. You can use the same profile on different devices:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -965,6 +953,9 @@ od najnowszych do najstarszych:</p>
|
||||
<li>
|
||||
<p><strong>Sieci dla gości</strong> mogą nie pozwalać urządzeniom na komunikację między sobą. Jeśli to możliwe, korzystaj z sieci innej niż gość.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Jeśli nadal masz problemy z korzystaniem z tej samej sieci, spróbuj otworzyć <strong>Hotspot</strong> na jednym urządzeniu i połączyć się z tą siecią Wi-Fi z drugiego urządzenia</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Upewnij się, że na urządzeniu docelowym jest <strong>wystarczająca ilość miejsca</strong></p>
|
||||
</li>
|
||||
@@ -999,6 +990,20 @@ od najnowszych do najstarszych:</p>
|
||||
<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>
|
||||
|
||||
<h3 id="czy-usuwanie-przypinanie-archiwizowanie-zapisywanie-wyciszanie-itp-jest-synchronizowane-ze-wszystkimi-urządzeniami">
|
||||
|
||||
|
||||
Czy usuwanie, przypinanie, archiwizowanie, zapisywanie, wyciszanie itp. jest synchronizowane ze wszystkimi urządzeniami? <a href="#czy-usuwanie-przypinanie-archiwizowanie-zapisywanie-wyciszanie-itp-jest-synchronizowane-ze-wszystkimi-urządzeniami" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Tak.</p>
|
||||
|
||||
<p>Jeśli np. usuniesz czat lub wiadomość z telefonu, zostaną one usunięte z aplikacji na komputer, gdy tylko ponownie będą online.</p>
|
||||
|
||||
<p>Wyjątkiem jest <a href="#delold">usuwanie starych wiadomości z urządzenia</a>, ponieważ różne urządzenia mogą mieć różne pojemności pamięci i ustawienia specyficzne dla systemu, takie jak dźwięki powiadomień.</p>
|
||||
|
||||
<h3 id="czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">
|
||||
|
||||
|
||||
@@ -1035,7 +1040,7 @@ od najnowszych do najstarszych:</p>
|
||||
<li>Aplikacje webxdc nie mogą wysyłać danych do Internetu ani niczego pobierać.</li>
|
||||
<li>Aplikacja webxdc może wymieniać dane wyłącznie w ramach czatu Delta Chat, a ich kopie znajdują się na urządzeniach twoich partnerów czatu. Poza tym jest całkowicie odizolowana od Internetu.</li>
|
||||
<li>Prywatność, jaką oferuje aplikacja webxdc, to prywatność twojego czatu – jeśli ufasz osobom, z którymi rozmawiasz, możesz ufać także aplikacji webxdc.</li>
|
||||
<li>Oznacza to również: otwieranie aplikacji webxdc na czatach, w przypadku których nie ufa się członkom, może stanowić ryzyko dla prywatności – tak jak załączniki do wiadomości e-mail, gdzie otwiera się tylko załączniki od nadawców, którym ufasz, a nie od spamerów.</li>
|
||||
<li>Oznacza to również: otwieranie aplikacji w czatach z niezaufanymi członkami, co może stanowić ryzyko dla prywatności. Podobnie jak w przypadku załączników do wiadomości e-mail, połączeń wideo lub zwykłych linków: otwieraj je tylko od nadawców, którym ufasz, a nie od spamerów. Spamerzy mogą poznać wszelkie dane, które im wysyłasz, a także twój adres IP.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="gdzie-mogę-zdobyć-aplikacje-webxdc">
|
||||
@@ -1102,13 +1107,8 @@ od najnowszych do najstarszych:</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Dzięki liście rozgłoszeniowej możesz wysłać wiadomość do wielu odbiorców jednocześnie; kiedy ci odpowiedzą, otrzymasz odpowiedź w bezpośrednim czacie 1: 1 z nimi. Odbiorcy nie widzą siebie nawzajem.</li>
|
||||
<li>Technicznie, jest to e-mail z wieloma odbiorcami w „ukrytej kopii”.</li>
|
||||
<li>Możesz włączyć tę funkcję w sekcji „Funkcje eksperymentalne” w ustawieniach zaawansowanych. Następnie możesz utworzyć listę rozgłoszeniową z okna dialogowego „Nowy czat”.</li>
|
||||
<li>Jeśli używasz więcej niż jednego urządzenia, listy rozgłoszeniowe nie są obecnie synchronizowane między nimi.</li>
|
||||
<li>Wiadomości wysyłane do list rozgłoszeniowych nie są szyfrowane. Szyfrowanie złamałoby anonimowość, ponieważ wtedy wszyscy odbiorcy wiedzieliby, kto jeszcze je otrzymał (wysyłanie indywidualnych wiadomości do wszystkich byłoby gorsze z powodu limitu prędkości i zużycia sieci).</li>
|
||||
</ul>
|
||||
<p>Za pomocą listy rozgłoszeniowej możesz wysłać wiadomość do wielu odbiorców naraz; odbiorcy nie mogą odpowiedzieć na tej liście.
|
||||
Listy rozgłoszeniowe są nadal wysoce eksperymentalne i bardzo prawdopodobne, że zostaną zastąpione czymś innym, bądźcie czujni :)</p>
|
||||
|
||||
<h3 id="jak-mogę-udostępnić-swoją-lokalizację-moim-rozmówcom">
|
||||
|
||||
@@ -1154,6 +1154,10 @@ od najnowszych do najstarszych:</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Uwaga: Zmiana adresów e-mail jest tymczasowo wyłączona
|
||||
z powodu trwających zmian w rdzeniu DeltaChat.
|
||||
Powinna być ponownie dostępna za kilka miesięcy.</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
<p>Zmień swój adres w „Ustawienia → Zaawansowane → Hasło i konto” i wprowadź hasło do swojego nowego konta (i jeśli to konieczne, ustawienia serwera). Otrzymasz informację o przeniesieniu na nowy adres. Dodatkowe powiadomienie pojawi się również na czacie „Komunikaty urządzenia”.</p>
|
||||
@@ -1227,17 +1231,17 @@ Oto, co robi Delta Chat z tymi uprawnieniami:</p>
|
||||
Jednak niektórzy dostawcy potrzebują specjalnych opcji, aby działać poprawnie, zobacz <a href="https://providers.delta.chat">Przegląd dostawców</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 id="chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie">
|
||||
<h3 id="chcę-zarządzać-własnym-serwerem-dla-delta-chat-co-polecacie">
|
||||
|
||||
|
||||
Chcę zarządzać własnym serwerem e-mail dla Delta Chat. Co polecacie? <a href="#chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie" class="anchor"></a>
|
||||
Chcę zarządzać własnym serwerem dla Delta Chat. Co polecacie? <a href="#chcę-zarządzać-własnym-serwerem-dla-delta-chat-co-polecacie" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Większość serwerów pocztowych będzie działać dobrze. Ale to, co osobiście polecamy, to połączenie mailcow i mailadm, jak opisano <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">w tym poście na blogu</a>.</li>
|
||||
<li>Instrukcję instalacji można znaleźć <a href="https://delta.chat/pl/serverguide">na naszej stronie internetowej</a>.</li>
|
||||
<li>Większość serwerów pocztowych będzie działać dobrze. Ale my osobiście polecamy serwer przekaźnikowy chatmail, jak opisano <a href="https://delta.chat/en/2023-12-13-chatmail">w tym wpisie na blogu</a>.</li>
|
||||
<li>Możesz znaleźć <a href="https://github.com/chatmail/relay">przewodnik instalacji na GitHub</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="dlaczego-muszę-wpisać-moje-hasło-e-mail-do-delta-chat-czy-to-jest-bezpieczne">
|
||||
@@ -1250,7 +1254,7 @@ Jednak niektórzy dostawcy potrzebują specjalnych opcji, aby działać poprawni
|
||||
|
||||
<p>Podobnie jak w przypadku innych programów pocztowych, takich jak Thunderbird, K9-Mail lub Outlook, program potrzebuje hasła, aby można było go używać do wysyłania i odbierania e-maili. Oczywiście hasło jest przechowywane tylko na Twoim urządzeniu. Hasło jest przesyłane tylko do Twojego dostawcy poczty e-mail (po zalogowaniu), który i tak ma dostęp do Twojej poczty</p>
|
||||
|
||||
<p>Ponieważ Delta Chat jest Open Source, możesz sprawdzić <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">Kod źródłowy</a>
|
||||
<p>Ponieważ Delta Chat jest Open Source, możesz sprawdzić <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">Kod źródłowy</a>
|
||||
jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny sposób. Cieszymy się z opinii, które sprawiają, że aplikacja jest bezpieczniejsza dla wszystkich naszych użytkowników.</p>
|
||||
|
||||
<h3 id="jakie-wiadomości-pojawiają-się-w-delta-chat">
|
||||
@@ -1329,17 +1333,17 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
|
||||
|
||||
<p>Niektórzy używają Delta Chat jako zwykłego klienta poczty e-mail i chcą używać folderu Skrzynka odbiorcza dla swojej poczty zamiast folderu DeltaChat. Jeśli wyłączysz opcję „Oglądaj folder DeltaChat”, powinieneś również wyłączyć opcję „Automatyczne przenoszenie do folderu DeltaChat”. W przeciwnym razie usuwanie wiadomości lub konfiguracja wielu urządzeń może nie działać poprawnie.</p>
|
||||
|
||||
<h3 id="czy-delta-chat-jest-kompatybilny-z-protonmail--tutanota--criptext">
|
||||
<h3 id="czy-delta-chat-jest-kompatybilny-z-proton-mail--tutanota--criptext">
|
||||
|
||||
|
||||
Czy Delta Chat jest kompatybilny z Protonmail / Tutanota / Criptext? <a href="#czy-delta-chat-jest-kompatybilny-z-protonmail--tutanota--criptext" class="anchor"></a>
|
||||
Czy Delta Chat jest kompatybilny z Proton Mail / Tutanota / Criptext? <a href="#czy-delta-chat-jest-kompatybilny-z-proton-mail--tutanota--criptext" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>I tak i nie.</li>
|
||||
<li>Nie, nie możesz używać swojego konta Protonmail, Tutanota lub Criptext z Delta Chat; nie oferują one odbierania poczty przez IMAP.</li>
|
||||
<li>Nie, nie możesz używać swojego konta Proton Mail, Tutanota lub Criptext z Delta Chat; nie oferują one odbierania poczty przez IMAP.</li>
|
||||
<li>W każdym przypadku możesz użyć Delta Chat do wysyłania wiadomości do osób, które używają Protonmail, Tutanota lub Criptext. Te wiadomości nie będą jednak szyfrowane metodą end-to-end. Szyfrowanie typu end-to-end, które oferują ci dostawcy, nie jest kompatybilne z <a href="https://autocrypt.org/">Autocrypt</a> stosowanym standardowo w Delta Chat.</li>
|
||||
<li>Delta Chat może zaszyfrować metodą end-to-end za pośrednictwem dowolnego dostawcy poczty e-mail z dowolną <a href="https://autocrypt.org/dev-status.html">aplikacją e-mail z włączoną funkcją Autocrypt</a>.</li>
|
||||
</ul>
|
||||
@@ -1371,7 +1375,7 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Zobacz <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Standardy używane w Delta Chat</a>.</li>
|
||||
<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>
|
||||
|
||||
<h3 id="gdzie-moi-znajomi-mogą-znaleźć-delta-chat">
|
||||
@@ -1456,4 +1460,4 @@ Fundusze te wspierają nasze długofalowe cele, aby uczynić Delta Chat bardziej
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
</body></html>
|
||||
@@ -10,7 +10,9 @@
|
||||
<li><a href="#кто-видит-изображение-моего-профиля">Кто видит изображение моего профиля?</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>
|
||||
<li><a href="#edit">Исправление опечаток и удаление сообщений после отправки</a></li>
|
||||
<li><a href="#ephemeralmsgs">Как работают исчезающие сообщения?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -34,29 +36,25 @@
|
||||
<li><a href="#почему-delta-chat-интегрируется-с-централизованными-проприетарными-push-сервисами-applegoogle">Почему Delta Chat интегрируется с централизованными проприетарными Push-сервисами Apple/Google?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#шифрование-и-безопасность">Шифрование и безопасность</a>
|
||||
<li><a href="#e2ee">Шифрование и безопасность</a>
|
||||
<ul>
|
||||
<li><a href="#какие-стандарты-используются-для-сквозного-шифрования">Какие стандарты используются для сквозного шифрования?</a></li>
|
||||
<li><a href="#whene2e">Как узнать зашифрованы ли сообщения сквозным шифрованием?</a></li>
|
||||
<li><a href="#howtoe2ee">Как получить гарантированное сквозное шифрование и зелёные галочки?</a></li>
|
||||
<li><a href="#e2eeguarantee">Что означает зелёная галочка и “гарантированное сквозное шифрование”?</a></li>
|
||||
<li><a href="#nocryptanymore">Контакт “отправил сообщение с другого устройства”, что делать?</a></li>
|
||||
<li><a href="#могу-ли-я-получать-или-отправлять-письма-без-сквозного-шифрования">Могу ли я получать или отправлять письма без сквозного шифрования?</a></li>
|
||||
<li><a href="#howtoe2ee">Как мне установить чат с новым контактом?</a></li>
|
||||
<li><a href="#e2eeguarantee">Что означает зеленая галочка в профиле контакта?</a></li>
|
||||
<li><a href="#зашифрованы-ли-вложения-изображения-файлы-аудио-и-т-д-сквозным-шифрованием">Зашифрованы ли вложения (изображения, файлы, аудио и т. д.) сквозным шифрованием?</a></li>
|
||||
<li><a href="#openpgp-secure">OpenPGP безопасен?</a></li>
|
||||
<li><a href="#openpgp-alternatives">Рассматривали ли вы альтернативы OpenPGP для сквозного шифрования?</a></li>
|
||||
<li><a href="#подвержен-ли-delta-chat-уязвимости-efail">Подвержен ли Delta Chat уязвимости EFAIL?</a></li>
|
||||
<li><a href="#tls">Будет ли сообщение передано в открытом виде, если сквозное шифрование недоступно?</a></li>
|
||||
<li><a href="#tls">Видны ли в Интернете сообщения, отмеченные значком почты?</a></li>
|
||||
<li><a href="#message-metadata">Как Delta Chat защищает метаданные в сообщениях?</a></li>
|
||||
<li><a href="#device-seizure">Как защитить метаданные и контакты при изъятии устройства?</a></li>
|
||||
<li><a href="#как-я-могу-проверить-информацию-о-шифровании">Как я могу проверить информацию о шифровании?</a></li>
|
||||
<li><a href="#как-я-могу-проверить-статус-шифрования-сообщений">Как я могу проверить статус шифрования сообщений?</a></li>
|
||||
<li><a href="#почему-я-вижу-незашифрованные-сообщения">Почему я вижу незашифрованные сообщения?</a></li>
|
||||
<li><a href="#как-я-могу-получить-зашифрованный-сквозным-шифрованием-чат-с-контактом-delta-chat-который-иногда-использует-веб-почту-или-другое-приложение-электронной-почты-не-поддерживающее-autocrypt">Как я могу получить зашифрованный сквозным шифрованием чат с контактом Delta Chat, который иногда использует веб-почту или другое приложение электронной почты, не поддерживающее Autocrypt?</a></li>
|
||||
<li><a href="#как-я-могу-обеспечить-сквозное-шифрование-и-удаление-сообщений">Как я могу обеспечить сквозное шифрование и удаление сообщений?</a></li>
|
||||
<li><a href="#pfs">Поддерживает ли Delta Chat совершенную прямую секретность (Perfect forward secrecy, PFS)?</a></li>
|
||||
<li><a href="#является-ли-сквозное-шифрование-delta-chat-таким-же-безопасным-как-signal">Является ли сквозное шифрование Delta Chat таким же безопасным как Signal?</a></li>
|
||||
<li><a href="#sealedsender">Поддерживает ли Delta Chat функцию “Sealed Sender” (Засекреченный отправитель)?</a></li>
|
||||
<li><a href="#pfs">Поддерживает ли Delta Chat свойство Perfect forward secrecy, PFS (Совершенную прямую секретность)?</a></li>
|
||||
<li><a href="#pqc">Поддерживает ли Delta Chat Post-Quantum-Cryptography (Постквантовую криптографию)?</a></li>
|
||||
<li><a href="#как-можно-вручную-проверить-информацию-о-шифровании">Как можно вручную проверить информацию о шифровании?</a></li>
|
||||
<li><a href="#importkey">Можно ли повторно использовать существующий секретный ключ?</a></li>
|
||||
<li><a href="#я-не-могу-импортировать-мой-существующий-ключ-pgp-в-delta-chat">Я не могу импортировать мой существующий ключ PGP в Delta Chat.</a></li>
|
||||
<li><a href="#security-audits">Проходил ли Delta Chat независимую проверку на наличие уязвимостей безопасности?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -65,6 +63,7 @@
|
||||
<li><a href="#можно-ли-использовать-delta-chat-на-нескольких-устройствах-одновременно">Можно ли использовать Delta Chat на нескольких устройствах одновременно?</a></li>
|
||||
<li><a href="#устранение-неполадок">Устранение неполадок</a></li>
|
||||
<li><a href="#backup">Ручная передача</a></li>
|
||||
<li><a href="#синхронизируются-ли-функции-удаления-закрепления-архивирования-сохранения-отключения-звука-и-тд-на-всех-устройствах">Синхронизируются ли функции удаления, закрепления, архивирования, сохранения, отключения звука и т.д. на всех устройствах?</a></li>
|
||||
<li><a href="#есть-ли-какие-либо-планы-по-внедрению-веб-клиента-delta-chat">Есть ли какие-либо планы по внедрению веб-клиента Delta Chat?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -88,7 +87,7 @@
|
||||
<ul>
|
||||
<li><a href="#какие-разрешения-нужны-delta-chat">Какие разрешения нужны Delta Chat?</a></li>
|
||||
<li><a href="#работает-ли-delta-chat-с-моим-провайдером-электронной-почты">Работает ли Delta Chat с <em>моим</em> провайдером электронной почты?</a></li>
|
||||
<li><a href="#я-хочу-управлять-своим-собственным-почтовым-сервером-для-delta-chat-что-вы-посоветуете">Я хочу управлять своим собственным почтовым сервером для Delta Chat. Что вы посоветуете?</a></li>
|
||||
<li><a href="#я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">Я хочу управлять своим собственным сервером для Delta Chat. Что вы посоветуете?</a></li>
|
||||
<li><a href="#почему-я-должен-вводить-свой-пароль-от-электронной-почты-в-delta-chat-это-безопасно">Почему я должен вводить свой пароль от электронной почты в Delta Chat? Это безопасно?</a></li>
|
||||
<li><a href="#какие-сообщения-отображаются-в-delta-chat">Какие сообщения отображаются в Delta Chat?</a></li>
|
||||
<li><a href="#может-ли-delta-chat-работать-с-электронными-письмами-в-формате-html">Может ли Delta Chat работать с электронными письмами в формате HTML?</a></li>
|
||||
@@ -96,7 +95,7 @@
|
||||
<li><a href="#для-чего-предназначена-настройка-отправлять-копию-себе">Для чего предназначена настройка “Отправлять копию себе”?</a></li>
|
||||
<li><a href="#для-чего-предназначена-настройка-следить-за-папкой-исходящие">Для чего предназначена настройка “Следить за папкой Исходящие”?</a></li>
|
||||
<li><a href="#почему-я-могу-отключить-следить-за-папкой-delta-chat">Почему я могу отключить “Следить за папкой Delta Chat”?</a></li>
|
||||
<li><a href="#совместим-ли-delta-chat-с-protonmail--tutanota--criptext">Совместим ли Delta Chat с Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#совместим-ли-delta-chat-с-proton-mail--tutanota--criptext">Совместим ли Delta Chat с Proton Mail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#remove-account">Как я могу удалить свой аккаунт?</a></li>
|
||||
<li><a href="#меня-интересуют-технические-детали-можете-рассказать-больше">Меня интересуют технические детали. Можете рассказать больше?</a></li>
|
||||
<li><a href="#где-мои-друзья-могут-найти-delta-chat">Где мои друзья могут найти Delta Chat?</a></li>
|
||||
@@ -169,7 +168,7 @@
|
||||
</li>
|
||||
<li>
|
||||
<p>Бесплатное программное обеспечение с открытым исходным кодом, как на стороне приложения, так и на стороне сервера.
|
||||
Разработано на основе <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">стандартов электронной почты и интернета</a>,
|
||||
Разработано на основе <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">стандартов электронной почты и интернета</a>,
|
||||
<a href="https://xkcd.com/927/">чтобы избежать “синдрома нового стандарта (xkcd 927)”</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -182,15 +181,16 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Если сообщение поступает от неизвестного контакта, оно отображается как <strong>запрос</strong>.</p>
|
||||
|
||||
<p>— Нужно <strong>принять</strong> запрос, прежде чем ответить.</p>
|
||||
|
||||
<p>— Вы также можете <strong>удалить</strong> его, если не хотите общаться с этим человеком.</p>
|
||||
|
||||
<ul>
|
||||
<li>Если сообщение приходит от неизвестного контакта, оно отображается как <strong>запрос</strong>. Чтобы
|
||||
ответить, вам необходимо сначала принять запрос.</li>
|
||||
<li>Вы также можете “удалить” его, если не хотите общаться с ним в данный момент. Это
|
||||
<em>не</em> удаляет сообщение с сервера, а только с вашего устройства. Таким образом,
|
||||
вы все еще можете обработать сообщение в другом почтовом клиенте.</li>
|
||||
<li>Если вы удалите запрос, будущие сообщения от этого контакта по-прежнему будут отображаться
|
||||
как запрос, поэтому вы можете изменить свое решение. Если вы действительно не хотите
|
||||
получать сообщения от этого человека, подумайте о его блокировке.</li>
|
||||
<li>Если вы удалите запрос, будущие сообщения от этого контакта все равно будут появляться
|
||||
как запрос сообщения, так что вы можете передумать. Если вы действительно не хотите
|
||||
получать сообщения от этого человека, подумайте о его <strong>блокировке</strong>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="поддерживает-ли-delta-chat-изображения-видео-и-другие-вложения">
|
||||
@@ -203,7 +203,7 @@
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Да. Помимо простого текста, все вложения электронной почты отображаются как отдельные сообщения. Исходящие сообщения автоматически получают необходимые вложения.</p>
|
||||
<p>Да. Изображения, видео, файлы, голосовые сообщения и т.д. обрабатываются как обычно.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Для лучшей производительности изображения по умолчанию оптимизируются и отправляются в меньшем размере, но вы можете отправить их как “файл”, чтобы сохранить оригинал.</p>
|
||||
@@ -304,6 +304,41 @@
|
||||
|
||||
<p>Чтобы использовать функции, нажмите долгим нажатием или щелкните правой кнопкой мыши по чату в списке чатов.</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
Как работают “Сохраненные сообщения”? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Сохраненные сообщения</strong> - это чат, который можно использовать, чтобы легко запоминать и находить сообщения.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>В любом чате нажмите и удерживайте или щелкните правой кнопкой мыши на сообщении и выберите <strong>Сохранить</strong></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Сохраненные сообщения отмечаются символом
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Иконка сохранения" />
|
||||
рядом с меткой времени</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Затем, зайдите в чат “Сохраненные сообщения” - и вы увидите там все сохраненные сообщения.
|
||||
Нажав <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Значок со стрелкой вправо" />,
|
||||
вы можете вернуться к этому сообщению в исходном чате</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Наконец, вы также можете использовать “Сохраненные сообщения” для создания <strong>личных заметок</strong> - откройте чат, введите что-то, добавьте фото или голосовое сообщение и т.д.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Поскольку “Сохраненные сообщения” синхронизируются, они могут стать удобным способом передачи данных между устройствами</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Сообщения остаются сохраненными, даже если они были отредактированы или удалены -
|
||||
будь то <a href="#edit">отправителем</a>, <a href="#delold">очисткой устройства</a> или <a href="#ephemeralmsgs">исчезающими сообщениями из других чатов</a>.</p>
|
||||
|
||||
<h3 id="что-означает-зеленая-точка">
|
||||
|
||||
|
||||
@@ -312,25 +347,53 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Иногда вы можете видеть <strong>зеленую точку</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
|
||||
рядом с аватаром контакта.
|
||||
Это означает, что их <strong>недавно видели</strong> за последние 10 минут:</p>
|
||||
|
||||
<ul>
|
||||
<li>Начиная с Delta Chat 1.34, вы можете иногда видеть “зеленую точку” рядом с аватаром
|
||||
контакта. Это означает, что они были “недавно активны”.</li>
|
||||
<li>Подробнее: это означает, что в течение последних 10 минут Delta Chat обнаружил их:
|
||||
<ul>
|
||||
<li>либо потому, что они отправили вам личное сообщение,</li>
|
||||
<li>либо потому, что они написали что-то в группу, участником которой вы оба являетесь,</li>
|
||||
<li>либо потому, что они отправили вам подтверждение о прочтении сообщения, которое вы написали,</li>
|
||||
<li>либо потому, что они отправили данные в ваше приложение Delta Chat, используя
|
||||
<a href="#webxdc">webxdc app</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Таким образом, это не реальный онлайн-статус в режиме реального времени - и если кто-то не отвечает
|
||||
сразу же, даже если кажется, что они онлайн, не волнуйтесь и дайте им немного
|
||||
свободы ;-)</li>
|
||||
<li>С другой стороны, другие не всегда будут “видеть, что вы онлайн”. Если вы
|
||||
отключили подтверждения о прочтении, они не увидят зеленую точку, пока вы
|
||||
не отправите им сообщение или не напишете в группу, в которой они также являются участником.</li>
|
||||
<li>либо потому, что они отправили вам сообщение напрямую,</li>
|
||||
<li>либо потому, что они написали что-то в группе, где вы оба являетесь участниками,</li>
|
||||
<li>либо потому, что они подтвердили прочтение вашего сообщения,</li>
|
||||
<li>либо потому, что они изменили или удалили сообщение в общем чате,</li>
|
||||
<li>либо потому, что они используют <a href="#webxdc">приложение</a> в чате, который вы оба используете.</li>
|
||||
</ul>
|
||||
|
||||
<p>Так что это не статус в режиме реального времени -
|
||||
и если кто-то не отвечает сразу, даже если кажется, что он в сети,
|
||||
не волнуйтесь и дайте ему немного времени :)</p>
|
||||
|
||||
<p>С другой стороны, другие не всегда “увидят, что вы в сети”.
|
||||
Если вы отключили уведомления о прочтении,
|
||||
они не увидят зеленую точку
|
||||
пока не будет выполнено одно из вышеуказанных условий.</p>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Исправление опечаток и удаление сообщений после отправки <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Вы можете редактировать текст сообщений после отправки.
|
||||
Для этого нажмите и удерживайте или щелкните правой кнопкой мыши сообщение и выберите <strong>Редактировать</strong>
|
||||
или <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Редактировать" />.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Если вы отправили сообщение случайно,
|
||||
в том же меню выберите <strong>Удалить</strong> и затем <strong>Удалить для всех</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>При этом отредактированные сообщения будут иметь слово “Отредактировано” рядом с временной меткой,
|
||||
удаленные сообщения будут удалены без каких-либо маркеров в чате.
|
||||
Уведомления не отправляются, и нет ограничений по времени.</p>
|
||||
|
||||
<p>Обратите внимание, что исходное сообщение все еще может быть получено участниками чата
|
||||
которые могли уже ответить, переслать, сохранить, сделать скриншот или иным образом скопировать сообщение.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
@@ -653,10 +716,10 @@ Push-уведомления недоступны.</p>
|
||||
включая потенциальный сервер, который <a href="https://delta.chat/chatmail#selfhosted">вы можете настроить самостоятельно без нашего разрешения.</a>.
|
||||
Добро пожаловать в мир мощной и совместимой системы chatmail и электронной почты :)</p>
|
||||
|
||||
<h2 id="шифрование-и-безопасность">
|
||||
<h2 id="e2ee">
|
||||
|
||||
|
||||
Шифрование и безопасность <a href="#шифрование-и-безопасность" class="anchor"></a>
|
||||
Шифрование и безопасность <a href="#e2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
@@ -669,18 +732,26 @@ Push-уведомления недоступны.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> используется для автоматической
|
||||
установки сквозного шифрования при работе с контактами и групповыми чатами.
|
||||
Autocrypt использует ограниченное и <a href="#openpgp-secure">безопасное подмножество стандарта OpenPGP</a>.
|
||||
Сообщения, зашифрованные сквозным шифрованием, помечаются замком
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" />.</p>
|
||||
<p>Delta Chat использует <a href="#openpgp-secure">безопасное подмножество стандарта OpenPGP</a>
|
||||
для реализации автоматического сквозного шифрования c помощью следующих протоколов:</p>
|
||||
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Протоколы Secure-Join</a>
|
||||
используются для создания чатов с гарантированным сквозным шифрованием,
|
||||
которое защищает от сетевых атак и скомпрометированных серверов.
|
||||
Чаты, отмеченные зелёной галочкой
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
гарантируют сквозное шифрование сообщений.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a>
|
||||
для обмена информацией о настройке шифрования через сканирование QR-кода или “ссылок-приглашений”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> используется для автоматической
|
||||
настройки сквозного шифрования между контактами и всеми членами группового чата.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Обмен контактом в
|
||||
чате</a>
|
||||
позволяет получателям настроить сквозное шифрование с этим контактом.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Delta Chat не запрашивает, не публикует и не взаимодействует с какими-либо серверами ключей OpenPGP.</p>
|
||||
|
||||
<h3 id="whene2e">
|
||||
|
||||
@@ -690,28 +761,37 @@ Autocrypt использует ограниченное и <a href="#openpgp-sec
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Все сообщения, зашифрованные сквозным шифрованием, имеют значок замка:</p>
|
||||
|
||||
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="Значок замка в пузырьке" /></p>
|
||||
|
||||
<p>Сквозное шифрование гарантировано, если рядом с заголовком чата стоит зелёная галочка:</p>
|
||||
|
||||
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="Зелёная галочка в заголовке" /></p>
|
||||
<p>Все сообщения в Delta Chat <strong>по умолчанию шифруются сквозным шифрованием</strong>.
|
||||
С момента выхода серии релизов Delta Chat версии 2 (июль 2025 года)
|
||||
на сообщениях со сквозным шифрованием больше не отображаются замки или другие подобные индикаторы.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
<h3 id="могу-ли-я-получать-или-отправлять-письма-без-сквозного-шифрования">
|
||||
|
||||
|
||||
Как получить гарантированное сквозное шифрование и зелёные галочки? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Могу ли я получать или отправлять письма без сквозного шифрования? <a href="#могу-ли-я-получать-или-отправлять-письма-без-сквозного-шифрования" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Если у вас есть второй канал связи с вашим собеседником,
|
||||
например, видеочат или другой мессенджер,
|
||||
вы можете создать ссылку-приглашение.</p>
|
||||
<p>Если вы используете стандартные <a href="https://chatmail.at/relays">ретрансляторы chatmail</a>,
|
||||
невозможно получать или отправлять сообщения без сквозного шифрования.</p>
|
||||
|
||||
<p>Если вы встретились лично с собеседником,
|
||||
вы можете показать ему свой QR-код.</p>
|
||||
<p>Если же вы создаёте профиль с использованием обычного почтового сервера,
|
||||
то можете отправлять и получать сообщения без сквозного шифрования.
|
||||
Такие сообщения, не имеющие сквозного шифрования, отмечаются значком электронной почты
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
Как мне установить чат с новым контактом? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Вы можете отправить ссылку-приглашение через другой личный чат,
|
||||
показать QR-код приглашения, когда вы рядом или во время видеозвонка,
|
||||
или нажать на “контакт”, которым поделились в чате.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -720,141 +800,59 @@ Autocrypt использует ограниченное и <a href="#openpgp-sec
|
||||
и выберите “QR-код приглашения”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Для <strong>приглашений в прямой чат 1:1</strong>,
|
||||
<p>Для <strong>приглашений в прямой чат 1:1</strong>,
|
||||
коснитесь значка QR-кода <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
|
||||
на главном экране приложения Delta Chat.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Позвольте вашему собеседнику отсканировать QR-код
|
||||
<p>Попросите вашего собеседника отсканировать QR-код
|
||||
с помощью приложения Delta Chat,
|
||||
или нажмите “Копировать” или “Поделиться”, чтобы создать ссылку-приглашение
|
||||
и отправьте её вашему собеседнику.</p>
|
||||
|
||||
<p>Теперь ожидайте, пока <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">сообщения Secure-Join</a> будут переданы между обоими устройствами.</p>
|
||||
<p>Теперь дождитесь, <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">пока устанавливается сквозное шифрование</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Если оба устройства находятся в сети,
|
||||
обе стороны в конечном итоге увидят (групповой или прямой) чат с зелёной галочкой
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="зелёная галочка" />
|
||||
рядом с названием.</p>
|
||||
<p>Если оба участника онлайн, они вскоре увидят (групповой или прямой) чат
|
||||
и смогут начать защищённую переписку.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Если одно из устройств не подключено к сети, зелёные галочки появятся только после того,
|
||||
как устройство снова подключится к Интернету
|
||||
и сетевой протокол Secure-Join будет завершён.</p>
|
||||
<p>Если одна из сторон не в сети или имеет плохое соединение,
|
||||
возможность переписки будет отложена до восстановления связи.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Поздравляем!
|
||||
Теперь вы будете автоматически использовать гарантированное сквозное шифрование
|
||||
с этим контактом, и вы оба сможете добавлять друг друга в группы, отмеченные зелёной галочкой
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="зелёная галочка" />,
|
||||
тем самым автоматически распространяя гарантированное сквозное шифрование среди её участников.</p>
|
||||
Теперь вы автоматически будете использовать сквозное шифрование с данным контактом.
|
||||
Если вы добавите друг друга в групповые чаты,
|
||||
сквозное шифрование будет настроено для всех участников.</p>
|
||||
|
||||
<h3 id="e2eeguarantee">
|
||||
|
||||
|
||||
Что означает зелёная галочка и “гарантированное сквозное шифрование”? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
Что означает зеленая галочка в профиле контакта? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Чаты, помеченные зелёными галочками
|
||||
<p>В профиле контакта может отображаться зелёная галочка
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="зелёная галочка" />
|
||||
означают, что все сообщения в чате будут зашифрованы сквозным шифрованием
|
||||
и не могут быть прочитаны или изменены скомпрометированными серверами электронной почты или интернет-провайдерами.
|
||||
Присоединение к групповым чатам с зелёной галочкой
|
||||
безопасно распространяет информацию о шифровании всех участников (и зелёные галочки)
|
||||
таким образом, чтобы гарантировать сквозное шифрование в группе и между её участниками.</p>
|
||||
|
||||
<p>Профили контактов с зелёной галочкой
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="зелёная галочка" />
|
||||
означают, что отправка сообщений контакту в настоящее время гарантированно зашифрована сквозным шифрованием.
|
||||
Каждый контакт с зелёной галочкой либо совершил с вами прямое <a href="#howtoe2ee">QR-сканирование</a>,
|
||||
либо был представлен другим контактом с зелёной галочкой.
|
||||
Знакомство происходит автоматически при добавлении участников в группы.
|
||||
Тот, кто добавляет контакт в группу, отмеченную зелёной галочкой, становится представителем
|
||||
для тех участников, которые еще не знают о добавленном контакте.
|
||||
В профиле контакта можно несколько раз нажать на текст “Представлен …” несколько раз
|
||||
пока не дойдёте до того, с кем вы непосредственно провели <a href="#howtoe2ee">QR-сканирование</a>.</p>
|
||||
|
||||
<p>Обратите внимание, что в профиле контакта вы можете увидеть и присоединённых знакомых,
|
||||
но в заголовке профиля нет зелёной галочки.
|
||||
Обычно это означает, что контакт <a href="#nocryptanymore">“отправил сообщение с другого устройства”</a>.</p>
|
||||
и строка “Подтверждён пользователем”.
|
||||
Каждый контакт с зелёной галочкой либо выполнил непосредственное сканирование <a href="#howtoe2ee">QR-кода</a> с вами,
|
||||
либо был подтверждён другим контактом с зелёной галочкой.
|
||||
Подтверждения происходят автоматически при добавлении участников в группы.
|
||||
Тот, кто добавляет контакт с зелёной галочкой в группу, где только участники с зелёными галочками,
|
||||
становится подтверждающим.
|
||||
В профиле контакта вы можете последовательно нажимать на текст “Подтверждён …” до тех пор,
|
||||
пока не дойдёте до того, с кем вы напрямую выполнили сканирование <a href="#howtoe2ee">QR-кода</a>.</p>
|
||||
|
||||
<p>Для более подробного обсуждения “гарантированного сквозного шифрования”
|
||||
пожалуйста, обратитесь к <a href="https://securejoin.delta.chat/en/latest/new.html">протоколам Secure-Join</a>
|
||||
и прочитайте о “Проверенных группах”, техническом термине,
|
||||
который здесь называется “группами с зелёной галочкой” или чатами с “гарантированным сквозным шифрованием”.</p>
|
||||
|
||||
<h3 id="nocryptanymore">
|
||||
|
||||
|
||||
Контакт “отправил сообщение с другого устройства”, что делать? <a href="#nocryptanymore" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ваш чат с контактом утратил гарантированное сквозное шифрование.
|
||||
Зелёная галочка была удалена для этого чата и контакта, и когда вы увидели предупреждение.
|
||||
<strong>Если вы обнаружили внезапное прекращение гарантированного сквозного шифрования
|
||||
для этого контакта, не принимайте предупреждение!</strong>
|
||||
Вместо этого свяжитесь со своим контактом по второму каналу,
|
||||
например, видеозвонок, другой мессенджер или телефонный звонок,
|
||||
чтобы узнать, что произошло.</p>
|
||||
|
||||
<p>Если ваш контакт стал причиной потери гарантированного сквозного шифрования,
|
||||
пожалуйста, ознакомьтесь с распространёнными причинами и способами их устранения в следующих параграфах.
|
||||
Независимо от этого, все остальные чаты, отмеченные зелёной галочкой, остаются гарантированно зашифрованными сквозным шифрованием,
|
||||
даже если этот контакт является его участником.</p>
|
||||
|
||||
<p><strong>Ваш контакт использует Delta Chat на втором устройстве (телефоне или ноутбуке)</strong></p>
|
||||
|
||||
<p>Если у него есть другое устройство с запущенным приложением Delta Chat,
|
||||
ему следует удалить учётную запись с нового устройства
|
||||
и добавить его <a href="#multiclient">как второе устройство, как описано здесь</a>.
|
||||
После того, как он отправит вам сообщение, предупреждение исчезнет
|
||||
и гарантированное шифрование будет установлено на обоих устройствах вашего собеседника.</p>
|
||||
|
||||
<p><strong>Ваш контакт переустановил Delta Chat, используя старые учетные данные для входа</strong></p>
|
||||
|
||||
<p>Если у него есть <a href="#backup">файл резервной копии</a>,
|
||||
ему следует удалить профиль с нового устройства
|
||||
и вместо этого импортировать резервную копию для восстановления своего профиля.
|
||||
После того, как он отправит вам сообщение, предупреждение исчезнет,
|
||||
и гарантированное шифрование будет восстановлено для этого контакта.</p>
|
||||
|
||||
<p>Если у него нет файла резервной копии, лучше всего выполнить <a href="#howtoe2ee">сканирование QR-кода</a>
|
||||
с вашим собеседником, чтобы восстановить гарантированное сквозное шифрование.</p>
|
||||
|
||||
<p><strong>Ваш контакт отправил письмо через интерфейс веб-почты или другое приложение электронной почты
|
||||
и снова вернулся к использованию Delta Chat.</strong></p>
|
||||
|
||||
<p>Если вы уверены, что ваш контакт иногда использует веб-почту
|
||||
или другое приложение электронной почты, в котором отсутствует сквозное шифрование,
|
||||
то вы можете принять предупреждение.
|
||||
Как только контакт снова начнёт использовать Delta Chat,
|
||||
гарантированное сквозное шифрование будет автоматически восстановлено.</p>
|
||||
|
||||
<p><strong>Ваш контакт полностью прекратил использование Delta Chat</strong></p>
|
||||
|
||||
<p>Иногда оставаться на связи важнее, чем сквозное шифрование.
|
||||
<a href="#tls">“Протокол защиты транспортного уровня” (TLS)</a> всё ещё может существенно защитить
|
||||
конфиденциальность ваших сообщений между вашим устройством и сервером электронной почты.
|
||||
Но без сквозного шифрования вы и ваш контакт должны доверять серверу электронной почты,
|
||||
который не должен читать и манипулировать вашими сообщениями, и не передавать их третьим лицам.</p>
|
||||
|
||||
<p>В любом случае, вы ничего не можете сделать, кроме как принять предупреждение.
|
||||
Также удалите контакт из любой активной группы, отмеченной зелёной галочкой,
|
||||
которую можно найти в разделе “Общие чаты” в профиле контакта.
|
||||
Это избавит ваш контакт от получения “не читаемых” сообщений.</p>
|
||||
|
||||
<p>Если контакт удалил Delta Chat из-за ошибок или нежелательного поведения,
|
||||
пожалуйста, подумайте о том, чтобы поделиться этой информацией на нашем <a href="https://support.delta.chat">форуме поддержки</a>,
|
||||
чтобы помочь нам выявить и устранить общие проблемы. Спасибо!</p>
|
||||
|
||||
<h3 id="зашифрованы-ли-вложения-изображения-файлы-аудио-и-т-д-сквозным-шифрованием">
|
||||
|
||||
|
||||
@@ -879,9 +877,8 @@ Autocrypt использует ограниченное и <a href="#openpgp-sec
|
||||
</h3>
|
||||
|
||||
<p>Да, Delta Chat использует безопасное подмножество OpenPGP
|
||||
и отображает индикатор безопасности в виде замка только,
|
||||
если всё сообщение правильно зашифровано и подписано.
|
||||
Например, “Отдельные подписи” не считаются безопасными.</p>
|
||||
требующее, чтобы всё сообщение было правильно зашифровано и подписано.
|
||||
Например, “Отделённые подписи” не считаются безопасными.</p>
|
||||
|
||||
<p>OpenPGP сам по себе не является небезопасным.
|
||||
Большинство обсуждаемых в публичной сфере проблем безопасности OpenPGP
|
||||
@@ -944,17 +941,15 @@ Delta Chat вместо этого использует реализацию Ope
|
||||
<h3 id="tls">
|
||||
|
||||
|
||||
Будет ли сообщение передано в открытом виде, если сквозное шифрование недоступно? <a href="#tls" class="anchor"></a>
|
||||
Видны ли в Интернете сообщения, отмеченные значком почты? <a href="#tls" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Даже если не гарантируется сквозное шифрование ваших сообщений,
|
||||
они все равно защищены от интернет-провайдеров, сотовых операторов или кабельных компаний.
|
||||
Однако провайдеры электронной почты, ваш и ваших получателей
|
||||
могут читать, анализировать или даже изменять ваши сообщения,
|
||||
включая любые вложения,
|
||||
если они не зашифрованы сквозным шифрованием.</p>
|
||||
<p>Если вы отправляете или получаете электронные сообщения без сквозного шифрования (используя классический почтовый сервер),
|
||||
они всё равно защищены от операторов сотовой связи или интернет-провайдеров, которые не могут прочитать или изменить ваши электронные сообщения.
|
||||
Однако и ваш почтовый провайдер, и почтовый провайдер вашего получателя
|
||||
могут читать, анализировать или изменять ваши сообщения, включая любые вложения.</p>
|
||||
|
||||
<p>Delta Chat по умолчанию использует строгое
|
||||
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS-шифрование</a>,
|
||||
@@ -966,10 +961,6 @@ Delta Chat вместо этого использует реализацию Ope
|
||||
то между провайдерами электронной почты будет применяться протокол защиты транспортного уровня.
|
||||
В этом случае сообщения Delta Chat никогда не будут переданы в открытом виде через Интернет,
|
||||
даже если сообщение не было зашифровано сквозным шифрованием.</p>
|
||||
|
||||
<p>Обратите внимание, что <a href="#howtoe2ee">поддержание гарантированного сквозного шифрования</a> поверх шифрования TLS
|
||||
обеспечивает полную безопасность между вашими устройствами и устройствами получателя.
|
||||
Ни ваш провайдер электронной почты, ни провайдер Интернета не смогут прочитать или изменить ваши сообщения.</p>
|
||||
|
||||
<h3 id="message-metadata">
|
||||
|
||||
@@ -979,25 +970,25 @@ Delta Chat вместо этого использует реализацию Ope
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat защищает большинство метаданных сообщений, помещая следующую информацию,
|
||||
в зашифрованную сквозным шифрованием часть сообщений:</p>
|
||||
<p>В отличие от большинства других мессенджеров,
|
||||
приложения Delta Chat не сохраняют никакие метаданные о контактах или группах на серверах, даже в зашифрованной форме.
|
||||
Вместо этого все групповые метаданные шифруются сквозным шифрованием и хранятся исключительно на устройствах конечных пользователей.</p>
|
||||
|
||||
<p>Поэтому, почтовые серверы имеют доступ только к</p>
|
||||
|
||||
<ul>
|
||||
<li>Тема сообщения</li>
|
||||
<li>Аватар и название группы</li>
|
||||
<li>Запросы MDN (уведомление о прочтении) (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
|
||||
<li>Таймер исчезающих сообщений (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
|
||||
<li>Участник-группы-чата-удалён (<code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>); Участник-группы-чата-добавлен (<code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code>)</li>
|
||||
<li>Заголовок <code class="language-plaintext highlighter-rouge">Secure-Join</code>, содержащий команды безопасного соединения</li>
|
||||
<li>Уведомление о включении потоковой передачи местоположения</li>
|
||||
<li>URL-адрес комнаты WebRTC</li>
|
||||
<li>
|
||||
<p>дате сообщения,</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>адресам отправителя и получателя</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>и размеру сообщения.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Серверы электронной почты не получают доступ к этим защищённым метаданным,
|
||||
но они видят дату сообщения, а также его размер,
|
||||
и, что более важно, адреса отправителя и получателя.
|
||||
Серверам электронной почты нужны адреса получателей для маршрутизации и
|
||||
доставки сообщений на устройства получателей.</p>
|
||||
<p>Все прочие метаданные сообщений, контактов и групп содержатся в части сообщений, защищённой сквозным шифрованием.</p>
|
||||
|
||||
<h3 id="device-seizure">
|
||||
|
||||
@@ -1009,20 +1000,80 @@ Delta Chat вместо этого использует реализацию Ope
|
||||
|
||||
<p>Для защиты от серверов электронной почты, собирающих метаданные,
|
||||
а также от угрозы конфискации устройства,
|
||||
мы рекомендуем использовать <a href="https://delta.chat/chatmail">сервер chatmail</a>,
|
||||
для создания безымянных (псевдонимных), временных профилей через сканирование QR-кодов.
|
||||
мы рекомендуем использовать <a href="https://chatmail.at/relays">релей chatmail</a>
|
||||
для создания чат-профилей с использованием случайных электронных адресов для передачи сообщений.
|
||||
Обратите внимание, что приложения Delta Chat на всех платформах поддерживают несколько профилей,
|
||||
так что вы можете легко использовать отдельные профили, для конкретной ситуации,
|
||||
помимо вашего “основного” профиля,
|
||||
так что вы можете легко использовать отдельные профили, для конкретной ситуации, помимо вашего “основного” профиля,
|
||||
зная, что все их данные, вместе с метаданными, будут удалены.
|
||||
Кроме того, если устройство будет конфисковано, контакты, использующие временные профили,
|
||||
не могут быть легко идентифицированы, в отличие от мессенджеров, которые раскрывают
|
||||
номера телефонов в групповых чатах, которые часто связаны с реальными личностями.</p>
|
||||
Кроме того, если устройство изъято, контакты, использующие временные профили,
|
||||
не могут быть легко идентифицированы.</p>
|
||||
|
||||
<h3 id="как-я-могу-проверить-информацию-о-шифровании">
|
||||
<h3 id="sealedsender">
|
||||
|
||||
|
||||
Как я могу проверить информацию о шифровании? <a href="#как-я-могу-проверить-информацию-о-шифровании" class="anchor"></a>
|
||||
Поддерживает ли Delta Chat функцию “Sealed Sender” (Засекреченный отправитель)? <a href="#sealedsender" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Нет, пока нет.</p>
|
||||
|
||||
<p>Мессенджер Signal внедрил функцию <a href="https://signal.org/blog/sealed-sender/">“Sealed Sender” (Засекреченный отправитель) в 2018 году</a>,
|
||||
чтобы их серверная инфраструктура не имела информации о том, кто отправляет сообщение группе получателей.
|
||||
Это особенно важно, поскольку сервер Signal знает мобильный номер каждого аккаунта,
|
||||
который обычно привязан к паспортным данным.</p>
|
||||
|
||||
<p>Даже если <a href="https://chatmail.at/relays">релеи chatmail</a>
|
||||
не запрашивают никаких личных данных (включая телефонные номера),
|
||||
всё равно может быть полезно защитить реляционные метаданные между адресами
|
||||
Мы не видим серьёзных проблем в использовании случайных одноразовых электронных адресов для функции sealed sender,
|
||||
но реализация пока не определена как приоритетная задача.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Поддерживает ли Delta Chat свойство Perfect forward secrecy, PFS (Совершенную прямую секретность)? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Нет, пока нет.</p>
|
||||
|
||||
<p>На данный момент, Delta Chat не поддерживает Perfect Forward Secrecy (PFS) (Совершенную прямую секретность).
|
||||
Это означает, что если ваш приватный ключ дешифрования будет скомпрометирован,
|
||||
и кто-то собрал ваши предыдущие сообщения во время передачи,
|
||||
они смогут расшифровать и прочитать их, используя скомпрометированный ключ дешифрования.
|
||||
Обратите внимание, что Forward Secrecy (Прямая секретность) повышает безопасность только если вы удаляете сообщения.
|
||||
В противном случае, тот, кто получает ваши ключи дешифрования
|
||||
также может получить все ваши не удалённые сообщения
|
||||
и ему даже не нужно расшифровывать какие-либо ранее собранные сообщения.</p>
|
||||
|
||||
<p>Мы разработали подход к Forward Secrecy (Прямой секретности), который прошёл
|
||||
первичную проверку некоторыми криптографами и экспертами по реализации
|
||||
но требует более формального описания
|
||||
чтобы убедиться, что он надёжно работает в федеративном обмене сообщениями и при использовании нескольких устройств,
|
||||
прежде чем он может быть внедрён в <a href="https://github.com/chatmail/core">ядро chatmail</a>,
|
||||
что сделает его доступным во всех <a href="https://chatmail.at/clients">клиентах clients</a>.</p>
|
||||
|
||||
<h3 id="pqc">
|
||||
|
||||
|
||||
Поддерживает ли Delta Chat Post-Quantum-Cryptography (Постквантовую криптографию)? <a href="#pqc" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Нет, пока нет.</p>
|
||||
|
||||
<p>Delta Chat использует библиотеку OpenPGP на Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>,
|
||||
которая поддерживает последний <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">черновик IETF Post-Quantum-Cryptography OpenPGP</a>.
|
||||
Мы планируем добавить поддержку PQC в <a href="https://github.com/chatmail/core">ядро chatmail</a> после того, как черновик будет окончательно утвержден в IETF
|
||||
в сотрудничестве с другими разработчиками OpenPGP.</p>
|
||||
|
||||
<h3 id="как-можно-вручную-проверить-информацию-о-шифровании">
|
||||
|
||||
|
||||
Как можно вручную проверить информацию о шифровании? <a href="#как-можно-вручную-проверить-информацию-о-шифровании" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1033,121 +1084,6 @@ Delta Chat показывает там два отпечатка.
|
||||
Если на вашем устройстве и на устройстве вашего контакта показаны одинаковые отпечатки,
|
||||
соединение безопасно.</p>
|
||||
|
||||
<h3 id="как-я-могу-проверить-статус-шифрования-сообщений">
|
||||
|
||||
|
||||
Как я могу проверить статус шифрования сообщений? <a href="#как-я-могу-проверить-статус-шифрования-сообщений" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Маленький <strong>значок замка</strong> в сообщении означает,
|
||||
что сообщение было правильно зашифровано сквозным шифрованием от данного отправителя.
|
||||
Если <strong>замка нет</strong>, сообщение не было правильно зашифровано,
|
||||
возможно, потому что отправитель использует приложение или веб-интерфейс электронной почты
|
||||
без поддержки сквозного шифрования.</p>
|
||||
|
||||
<h3 id="почему-я-вижу-незашифрованные-сообщения">
|
||||
|
||||
|
||||
Почему я вижу незашифрованные сообщения? <a href="#почему-я-вижу-незашифрованные-сообщения" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Если контакт использует приложение электронной почты, не поддерживающее Autocrypt,
|
||||
все сообщения, включающие этого контакта (в групповом или личном 1:1 чате),
|
||||
не будут зашифрованы сквозным шифрованием, и поэтому не будут иметь “значок замка” в сообщениях.
|
||||
Обратите внимание, что даже если ваши контакты используют Delta Chat на своем аккаунте,
|
||||
они также могут использовать приложение электронной почты, не поддерживающее Autocrypt,
|
||||
на том же аккаунте, что может привести к периодически незашифрованным сообщениям.
|
||||
Ответ на незашифрованные сообщения незашифрованным сообщением является обязательным в Autocrypt,
|
||||
чтобы предотвратить появление нечитаемых сообщений на стороне ваших контактов
|
||||
и их приложении электронной почты, которое не поддерживает Autocrypt.</p>
|
||||
|
||||
<h3 id="как-я-могу-получить-зашифрованный-сквозным-шифрованием-чат-с-контактом-delta-chat-который-иногда-использует-веб-почту-или-другое-приложение-электронной-почты-не-поддерживающее-autocrypt">
|
||||
|
||||
|
||||
Как я могу получить зашифрованный сквозным шифрованием чат с контактом Delta Chat, который иногда использует веб-почту или другое приложение электронной почты, не поддерживающее Autocrypt? <a href="#как-я-могу-получить-зашифрованный-сквозным-шифрованием-чат-с-контактом-delta-chat-который-иногда-использует-веб-почту-или-другое-приложение-электронной-почты-не-поддерживающее-autocrypt" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Если вам нужен зашифрованный сквозным шифрованием чат с контактом,
|
||||
который использует свой адрес электронной почты как с Delta Chat, так и с приложениями, не поддерживающими Autocrypt (например, веб-почтой),
|
||||
лучше всего настроить с ним <a href="#howtoe2ee">гарантированное сквозное шифрование</a>
|
||||
и затем создать гарантированно зашифрованный сквозным шифрованием групповой чат с вами двумя как участниками.
|
||||
В этом групповом чате все сообщения будут зашифрованы сквозным шифрованием,
|
||||
даже если прямой чат между вами двумя имеет предупреждение
|
||||
<a href="#nocryptanymore">“… отправил сообщение с другого устройства”</a>.</p>
|
||||
|
||||
<h3 id="как-я-могу-обеспечить-сквозное-шифрование-и-удаление-сообщений">
|
||||
|
||||
|
||||
Как я могу обеспечить сквозное шифрование и удаление сообщений? <a href="#как-я-могу-обеспечить-сквозное-шифрование-и-удаление-сообщений" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Лучший способ обеспечить сквозное шифрование каждого сообщения,
|
||||
где метаданные удаляются как можно быстрее,
|
||||
это <a href="#howtoe2ee">использовать чаты с гарантированным сквозным шифрованием</a>
|
||||
и включить <a href="#ephemeralmsgs">исчезающие сообщения</a>.</p>
|
||||
|
||||
<p>Чаты с гарантированным сквозным шифрованием защищают от <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">атак “человек посередине”</a>,
|
||||
а включение исчезающих сообщений удаляет сообщения
|
||||
на сервере через заданное пользователем время.</p>
|
||||
|
||||
<p>Если вам не нужна долгоживущая копия ваших сообщений на сервере,
|
||||
вы также можете включить <a href="#delold">“удалять сообщения с сервера автоматически”</a>.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Поддерживает ли Delta Chat совершенную прямую секретность (Perfect forward secrecy, PFS)? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Нет, Delta Chat не поддерживает совершенную прямую секретность (PFS).
|
||||
Это означает, что если ваш личный ключ дешифрования Delta Chat будет скомпрометирован,
|
||||
и кто-то собрал ваши предыдущие сообщения, переданные по сети,
|
||||
то они смогут расшифровать и прочитать их с помощью скомпрометированного ключа дешифрования.</p>
|
||||
|
||||
<p>Обратите внимание, если кто-то получит доступ к вашим ключам дешифрования,
|
||||
они, как правило, также смогут получить доступ к вашим сообщениям,
|
||||
независимо от того, используется ли совершенная прямая секретность или нет.
|
||||
Типичная реальная ситуация для утечки ключей дешифрования - это изъятие устройства,
|
||||
о чём мы говорим в нашем ответе <a href="#device-seizure">о метаданных и изъятии устройства</a>.</p>
|
||||
|
||||
<p>Возможно, Delta Chat будет развиваться в направлении поддержки совершенной прямой секретности (PFS),
|
||||
поскольку OpenPGP является всего лишь контейнером для зашифрованных сообщений,
|
||||
но управление ключами шифрования (и, следовательно, ротация ключей или “переключение” ключей)
|
||||
могут быть организованы гибкими способами.
|
||||
См. <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">прототип PFS Seqouia</a>
|
||||
для существующих экспериментов в сообществе разработчиков OpenPGP.</p>
|
||||
|
||||
<h3 id="является-ли-сквозное-шифрование-delta-chat-таким-же-безопасным-как-signal">
|
||||
|
||||
|
||||
Является ли сквозное шифрование Delta Chat таким же безопасным как Signal? <a href="#является-ли-сквозное-шифрование-delta-chat-таким-же-безопасным-как-signal" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Это зависит от того, что для вас важно.
|
||||
Delta Chat <a href="#pfs">не поддерживает PFS</a>, как Signal,
|
||||
но обеспечивает <a href="#e2eeguarantee">гарантированно зашифрованные сквозным шифрованием чаты</a>
|
||||
защищенные от скомпрометированных серверов или поврежденных сетей.
|
||||
Signal и большинство других мессенджеров, поддерживающих PFS,
|
||||
не предоставляют практической схемы защиты групповых чатов от сетевых атак,
|
||||
которые, возможно, вызывают большее беспокойство,
|
||||
чем потенциальный злоумышленник, который захватывает ваш телефон и настройки персонального шифрования,
|
||||
но почему-то не ваши сообщения, но при этом имеет полный отчет обо всех прошлых зашифрованных сообщениях.</p>
|
||||
|
||||
<p>В любом случае, сквозное шифрование Delta Chat использует <a href="#openpgp-secure">безопасное подмножество OpenPGP</a>
|
||||
которое прошло <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">независимую проверку безопасности</a>.</p>
|
||||
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
@@ -1156,42 +1092,14 @@ Signal и большинство других мессенджеров, подд
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Да.
|
||||
The best way is to send an Autocrypt Setup Message from the other e-mail client.
|
||||
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
|
||||
<p>Нет.</p>
|
||||
|
||||
<p>Вместо этого, вы можете импортировать ключ вручную в разделе “Настройки -> Дополнительные параметры -> Импорт секретных ключей”.
|
||||
Предупреждение: Убедитесь, что ключ не защищён паролем, или удалите пароль заранее.</p>
|
||||
<p>Delta Chat генерирует безопасные ключи OpenPGP в соответствии со спецификацией Autocrypt 1.1.
|
||||
Вы можете экспортировать свой закрытый ключ, но не можете импортировать дополнительные закрытые ключи.</p>
|
||||
|
||||
<p>Если у вас нет ключа или вы даже не знали, что он вам нужен - не волнуйтесь: Delta Chat генерирует ключи по мере необходимости, вам не нужно для этого нажимать кнопку.</p>
|
||||
|
||||
<h3 id="я-не-могу-импортировать-мой-существующий-ключ-pgp-в-delta-chat">
|
||||
|
||||
|
||||
Я не могу импортировать мой существующий ключ PGP в Delta Chat. <a href="#я-не-могу-импортировать-мой-существующий-ключ-pgp-в-delta-chat" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Наиболее вероятная причина — это то, что ваш ключ зашифрован и/или имеет пароль.
|
||||
Delta Chat не поддерживает такие ключи.
|
||||
Вы можете снять шифрование пароля и пароль, а затем повторить попытку импорта.</p>
|
||||
|
||||
<p>Другая распространенная ошибка - неправильное расширение файла.
|
||||
Используйте формат ASCII armored и расширение файла <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
|
||||
|
||||
<p>Delta Chat поддерживает распространённые форматы закрытых ключей OpenPGP, однако
|
||||
маловероятно, что мы будем поддерживать все закрытые ключи из любых источников. Это
|
||||
не является основной целью Delta Chat. На самом деле, подавляющее большинство пользователей
|
||||
Delta Chat не будут иметь никакого ключа, прежде чем они начнут использовать его.
|
||||
Однако мы стремимся поддерживать закрытые ключи из как можно большего числа источников.</p>
|
||||
|
||||
<p>Удаление пароля закрытого ключа будет отличаться в зависимости от
|
||||
программного обеспечения, используемого для управления ключами PGP. В Enigmail вы можете установить пустой
|
||||
пароль в окне управления ключами. В GnuPG вы можете установить его
|
||||
<a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">через командную
|
||||
строку</a>.
|
||||
Для других программ, вы можете найти решение в интернете.</p>
|
||||
<p>В целом, мы не рекомендуем и не предлагаем пользователям выполнять ручное управление ключами.
|
||||
Мы стремимся к тому, чтобы аудиты безопасности могли сосредоточиться на нескольких проверенных криптографических алгоритмах,
|
||||
а не на всем разнообразии возможных алгоритмов, доступных с OpenPGP.</p>
|
||||
|
||||
<h3 id="security-audits">
|
||||
|
||||
@@ -1285,7 +1193,7 @@ Chat <a href="https://github.com/rpgp/rpgp">PGP</a> и
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Да. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
|
||||
<p>Да. You can use the same profile on different devices:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -1342,6 +1250,10 @@ Chat <a href="https://github.com/rpgp/rpgp">PGP</a> и
|
||||
<li>
|
||||
<p><strong>Гостевые сети</strong> могут блокировать взаимодействие между устройствами.
|
||||
Если возможно, используйте не гостевую сеть.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Если у вас всё ещё возникают проблемы с использованием одной и той же сети,
|
||||
попробуйте создать <strong>Мобильную точку доступа</strong> на одном устройстве и подключиться к этой сети Wi-Fi с другого устройства</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Убедитесь, что на устройстве-приемнике имеется <strong>достаточно места</strong></p>
|
||||
@@ -1389,6 +1301,23 @@ PIN-код разблокировки экрана, графический кл
|
||||
зашифрованных сквозным шифрованием сообщений с вашими собеседниками.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="синхронизируются-ли-функции-удаления-закрепления-архивирования-сохранения-отключения-звука-и-тд-на-всех-устройствах">
|
||||
|
||||
|
||||
Синхронизируются ли функции удаления, закрепления, архивирования, сохранения, отключения звука и т.д. на всех устройствах? <a href="#синхронизируются-ли-функции-удаления-закрепления-архивирования-сохранения-отключения-звука-и-тд-на-всех-устройствах" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Да.</p>
|
||||
|
||||
<p>Например, если вы удалите чат или сообщение со своего телефона,
|
||||
оно также будет удалено на вашем настольном компьютере, когда он подключится к интернету.</p>
|
||||
|
||||
<p>Исключениями из этого правила являются <a href="#delold">Удаление старых сообщений с устройства</a>,
|
||||
поскольку устройства могут иметь разные объёмы памяти,
|
||||
и системные настройки, характерные для каждого устройства, например, звуки оповещений.</p>
|
||||
|
||||
<h3 id="есть-ли-какие-либо-планы-по-внедрению-веб-клиента-delta-chat">
|
||||
|
||||
|
||||
@@ -1429,16 +1358,16 @@ PIN-код разблокировки экрана, графический кл
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Приложения webxdc не могут отправлять данные в Интернет или скачивать что-либо.</li>
|
||||
<li>Приложение webxdc может обмениваться данными только внутри чата Delta Chat, с его
|
||||
копиями на устройствах ваших собеседников по чату.
|
||||
В остальном, оно полностью
|
||||
<li>Приложения webxdc не имеют доступа к Интернету и не могут ничего загружать.</li>
|
||||
<li>Обмен данными в webxdc-приложении возможен только внутри чата Delta Chat, между
|
||||
копиями приложения на устройствах участников чата. В остальном оно полностью
|
||||
изолировано от Интернета.</li>
|
||||
<li>Конфиденциальность, которую обеспечивает приложение webxdc — это конфиденциальность вашего чата - пока
|
||||
вы доверяете людям, с которыми вы общаетесь, вы можете доверять приложению webxdc.</li>
|
||||
<li>Это также означает, что открытие приложений webxdc в чатах с участниками, которым вы
|
||||
не доверяете, тоже самое, что и с вложениями электронной почты, когда вы открываете
|
||||
вложения только от тех отправителей, которым доверяете, а не от спамеров.</li>
|
||||
<li>Уровень приватности webxdc-приложения соответствует приватности вашего чата — если вы
|
||||
доверяете собеседникам, можете доверять и приложению.</li>
|
||||
<li>Это значит, что открывать такие приложения в чатах с незнакомыми или подозрительными участниками может быть небезопасно.
|
||||
Как и с вложениями, видеозвонками или ссылками:
|
||||
открывайте их только от тех, кому доверяете, и не открывайте от спамеров.
|
||||
Спамеры могут получить любые данные, которые вы им отправите, а также узнать ваш IP-адрес.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="где-я-могу-получить-приложения-webxdc">
|
||||
@@ -1521,20 +1450,10 @@ Delta Chat</a>.</li>
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>С помощью списка рассылки вы можете отправить сообщение сразу нескольким получателям; когда
|
||||
они ответят вам, вы получите ответ в прямом чате с ними 1:1.
|
||||
Получатели не смогут видеть друг друга.</li>
|
||||
<li>Технически, это электронное письмо с несколькими получателями в поле BCC (скрытая копия).</li>
|
||||
<li>Включить функцию можно в разделе “Экспериментальные функции” в
|
||||
“Дополнительных параметрах”. Затем вы можете создать список рассылки в диалоге “Новый чат”.</li>
|
||||
<li>Если вы используете более одного устройства, списки рассылки в настоящее время не
|
||||
синхронизируются между ними.</li>
|
||||
<li>Сообщения, отправленные в списки рассылки, не шифруются. Шифрование нарушит
|
||||
анонимность, потому что тогда все получатели узнают, кто еще получил сообщение.
|
||||
(Отправка отдельных писем каждому будет хуже из-за ограничений скорости и
|
||||
потребления сети).</li>
|
||||
</ul>
|
||||
<p>Список рассылки позволяет отправлять сообщения сразу нескольким адресатам;
|
||||
получатели не могут отвечать в этом списке.
|
||||
Функция списков рассылки пока что экспериментальная
|
||||
и, скорее всего, в будущем будет заменена на что-то другое — следите за новостями. :)</p>
|
||||
|
||||
<h3 id="как-я-могу-поделиться-своим-местоположением-с-собеседниками-в-чате">
|
||||
|
||||
@@ -1591,6 +1510,11 @@ Delta Chat</a>.</li>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Примечание:
|
||||
Смена электронных адресов временно отключена
|
||||
из-за продолжающихся изменений в ядре DeltaChat.
|
||||
Функция должна снова заработать через несколько месяцев.</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
<p>Измените свой адрес в разделе “Настройки → Дополнительные параметры → Пароль и аккаунт” и
|
||||
@@ -1692,19 +1616,19 @@ Delta Chat</a>.</li>
|
||||
см. <a href="https://providers.delta.chat">Обзор провайдеров</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 id="я-хочу-управлять-своим-собственным-почтовым-сервером-для-delta-chat-что-вы-посоветуете">
|
||||
<h3 id="я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">
|
||||
|
||||
|
||||
Я хочу управлять своим собственным почтовым сервером для Delta Chat. Что вы посоветуете? <a href="#я-хочу-управлять-своим-собственным-почтовым-сервером-для-delta-chat-что-вы-посоветуете" class="anchor"></a>
|
||||
Я хочу управлять своим собственным сервером для Delta Chat. Что вы посоветуете? <a href="#я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Большинство почтовых серверов будут работать хорошо. Но лично мы рекомендуем,
|
||||
это сочетание mailcow и mailadm, как описано <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">в этом
|
||||
<li>Большинство почтовых серверов будут работать хорошо. Однако мы советуем использовать,
|
||||
relay-сервер chatmail, как описано <a href="https://delta.chat/en/2023-12-13-chatmail">в этом
|
||||
блоге</a>.</li>
|
||||
<li>Вы можете найти <a href="https://delta.chat/ru/serverguide">руководство по установке на нашем сайте</a>.</li>
|
||||
<li>Вы можете найти <a href="https://github.com/chatmail/relay">руководство по установке на GitHub</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="почему-я-должен-вводить-свой-пароль-от-электронной-почты-в-delta-chat-это-безопасно">
|
||||
@@ -1720,10 +1644,10 @@ Delta Chat необходим пароль, чтобы использовать
|
||||
хранится только на вашем устройстве и передается только вашему
|
||||
провайдеру электронной почты (при входе в систему), который и так имеет доступ к вашей почте.</p>
|
||||
|
||||
<p>Поскольку Delta Chat является программой открытым исходным кодом, вы
|
||||
можете изучить <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">исходный код</a>, если хотите убедиться, что ваши
|
||||
учётные данные обрабатываются безопасно. Мы рады получить обратную связь,
|
||||
которая поможет сделать приложение более безопасным для всех наших пользователей.</p>
|
||||
<p>Поскольку Delta Chat — это проект с открытым исходным кодом, вы
|
||||
можете проверить <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">исходный код</a>, если хотите убедиться, что ваши
|
||||
учётные данные обрабатываются безопасно. Мы будем рады отзывам,
|
||||
которые сделают приложение более безопасным для всех наших пользователей.</p>
|
||||
|
||||
<h3 id="какие-сообщения-отображаются-в-delta-chat">
|
||||
|
||||
@@ -1835,17 +1759,17 @@ Delta Chat необходим пароль, чтобы использовать
|
||||
папкой DeltaChat”, вы также должны отключить “Переместить сообщения чата в DeltaChat”.
|
||||
В противном случае удаление сообщений или настройки нескольких устройств могут не работать правильно.</p>
|
||||
|
||||
<h3 id="совместим-ли-delta-chat-с-protonmail--tutanota--criptext">
|
||||
<h3 id="совместим-ли-delta-chat-с-proton-mail--tutanota--criptext">
|
||||
|
||||
|
||||
Совместим ли Delta Chat с Protonmail / Tutanota / Criptext? <a href="#совместим-ли-delta-chat-с-protonmail--tutanota--criptext" class="anchor"></a>
|
||||
Совместим ли Delta Chat с Proton Mail / Tutanota / Criptext? <a href="#совместим-ли-delta-chat-с-proton-mail--tutanota--criptext" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Да и нет.</li>
|
||||
<li>Нет, вы не можете использовать свой аккаунт Protonmail, Tutanota или Criptext с Delta
|
||||
<li>Нет, вы не можете использовать свой аккаунт Proton Mail, Tutanota или Criptext с Delta
|
||||
Chat; они не поддерживают получение писем через IMAP.</li>
|
||||
<li>В любом случае вы можете использовать Delta Chat для отправки сообщений людям, которые используют
|
||||
Protonmail, Tutanota, или Criptext. Однако, эти сообщения не будут зашифрованы
|
||||
@@ -1898,7 +1822,7 @@ Chat.</li>
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Смотрите <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Стандарты, используемые в Delta Chat</a>.</li>
|
||||
<li>Смотрите <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарты, используемые в Delta Chat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="где-мои-друзья-могут-найти-delta-chat">
|
||||
@@ -2025,4 +1949,4 @@ U.S. Bureau of Democracy, Human Rights and Labor (DRL) для поддержки
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
</body></html>
|
||||
|
After Width: | Height: | Size: 145 B |
@@ -10,7 +10,9 @@
|
||||
<li><a href="#kush-e-sheh-profilin-tim">Kush e sheh profilin tim?</a></li>
|
||||
<li><a href="#signature">Can I set a Bio/Signature/Status/Motto with Delta Chat?</a></li>
|
||||
<li><a href="#çdo-të-thotë-fiksim-heshtim-arkivim">Ç’do të thotë Fiksim, Heshtim, Arkivim?</a></li>
|
||||
<li><a href="#save">How do “Saved Messages” work?</a></li>
|
||||
<li><a href="#çdo-të-thotë-pika-e-gjelbër">Ç’do të thotë pika e gjelbër?</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>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -34,29 +36,25 @@
|
||||
<li><a href="#why-does-delta-chat-integrate-with-centralized-proprietary-applegoogle-push-services">Why does Delta Chat integrate with centralized proprietary Apple/Google push services?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#fshehtëzim-dhe-siguri">Fshehtëzim dhe Siguri</a>
|
||||
<li><a href="#e2ee">Fshehtëzim dhe Siguri</a>
|
||||
<ul>
|
||||
<li><a href="#cilët-standarde-përdoren-për-fshehtëzim-skaj-më-skaj">Cilët standarde përdoren për fshehtëzim skaj-më-skaj?</a></li>
|
||||
<li><a href="#whene2e">How can i know if messages are end-to-end encrypted?</a></li>
|
||||
<li><a href="#howtoe2ee">How can I get guaranteed end-to-end encryption and green checkmarks?</a></li>
|
||||
<li><a href="#e2eeguarantee">What does the green checkmark and “guaranteed end-to-end encryption” mean?</a></li>
|
||||
<li><a href="#nocryptanymore">A contact “sent a message from another device”, what can i do?</a></li>
|
||||
<li><a href="#can-i-still-receive-or-send-mails-without-end-to-end-encryption">Can i still receive or send mails without end-to-end encryption?</a></li>
|
||||
<li><a href="#howtoe2ee">How can I establish a chat with a new contact?</a></li>
|
||||
<li><a href="#e2eeguarantee">What does the green checkmark in a contact profile mean?</a></li>
|
||||
<li><a href="#are-attachments-pictures-files-audio-etc-end-to-end-encrypted">Are attachments (pictures, files, audio etc.) end-to-end encrypted?</a></li>
|
||||
<li><a href="#openpgp-secure">A është i siguruar OpenPGP?</a></li>
|
||||
<li><a href="#openpgp-alternatives">Did you consider using alternatives to OpenPGP for end-to-end -encryption?</a></li>
|
||||
<li><a href="#openpgp-alternatives">Did you consider using alternatives to OpenPGP for end-to-end-encryption?</a></li>
|
||||
<li><a href="#a-mund-të-preket-delta-chat-i-nga-efail">A mund të preket Delta Chat-i nga EFAIL?</a></li>
|
||||
<li><a href="#tls">Is a message exposed in cleartext if end-to-end encryption is not available?</a></li>
|
||||
<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="#how-can-i-check-encryption-information">How can i check encryption information?</a></li>
|
||||
<li><a href="#si-mund-ta-kontrolloj-gjendjen-e-fshehtëzimit-të-mesazheve">Si mund ta kontrolloj gjendjen e fshehtëzimit të mesazheve?</a></li>
|
||||
<li><a href="#pse-shoh-mesazhe-të-pafshehtëzuar">Pse shoh mesazhe të pafshehtëzuar?</a></li>
|
||||
<li><a href="#how-can-i-get-an-end-to-end-encrypted-chat-with-a-delta-chat-contact-who-sometimes-uses-webmail-or-another-non-autocrypt-e-mail-app">How can i get an end-to-end encrypted chat with a Delta Chat contact who sometimes uses webmail or another non-Autocrypt e-mail app?</a></li>
|
||||
<li><a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion">How can I ensure message end-to-end encryption and deletion?</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="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">Is end-to-end encryption of Delta Chat as safe as Signal?</a></li>
|
||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||
<li><a href="#how-can-i-manually-check-encryption-information">How can I manually check encryption information?</a></li>
|
||||
<li><a href="#importkey">A mund të ripërdor kyçin tim ekzistues privat?</a></li>
|
||||
<li><a href="#seksportoj-dot-kyçet-e-mi-ekzistues-pgp-në-delta-chat">S’eksportoj dot kyçet e mi ekzistues PGP në Delta Chat.</a></li>
|
||||
<li><a href="#security-audits">A është bërë auditim i pavarur i Delta Chat-it për cenueshmëri sigurie?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -65,6 +63,7 @@
|
||||
<li><a href="#a-mund-ta-përdor-delta-chat-in-në-shumë-pajisje-njëherësh-në-të-njëjtën-kohë">A mund ta përdor Delta Chat-in në shumë pajisje njëherësh në të njëjtën kohë?</a></li>
|
||||
<li><a href="#diagnostikim">Diagnostikim</a></li>
|
||||
<li><a href="#backup">Manual Transfer</a></li>
|
||||
<li><a href="#is-deletion-pinning-archiving-saving-muting-etc-synced-to-all-devices">Is Deletion, Pinning, Archiving, Saving, Muting etc. synced to all devices?</a></li>
|
||||
<li><a href="#a-ka-ndonjë-plan-për-të-sjellë-një-klient-web-delta-chat">A ka ndonjë plan për të sjellë një Klient Web Delta Chat?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -88,7 +87,7 @@
|
||||
<ul>
|
||||
<li><a href="#çleje-lyp-delta-chat-i">Ç’leje lyp Delta Chat-i?</a></li>
|
||||
<li><a href="#a-funksionon-delta-chat-me-shërbimin-tim-email">A funksionon Delta Chat me shërbimin <em>tim</em> email?</a></li>
|
||||
<li><a href="#dua-të-administroj-shërbyesin-tim-email-për-delta-chat-çrekomandoni">Dua të administroj shërbyesin tim email për Delta Chat. Ç’rekomandoni?</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="#pse-më-duhet-të-jap-fjalëkalimin-e-email-it-tim-në-delta-chat-a-është-e-sigurt-kjo">Pse më duhet të jap fjalëkalimin e email-it tim në Delta Chat? A është e sigurt kjo?</a></li>
|
||||
<li><a href="#cilat-mesazhe-shfaqen-në-delta-chat">Cilat mesazhe shfaqen në Delta Chat?</a></li>
|
||||
<li><a href="#a-mbulon-delta-chat-i-email-e-html">A mbulon Delta Chat-i email-e HTML?</a></li>
|
||||
@@ -169,7 +168,7 @@ safe against network and server attacks.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Free and Open Source software, both app and server side.
|
||||
Built on <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">E-mail and Web Internet Standards</a>,
|
||||
Built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">E-mail and Web Internet Standards</a>,
|
||||
<a href="https://xkcd.com/927/">to avoid “yet another standard syndrome (xkcd 927)”</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -182,15 +181,20 @@ Built on <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/s
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Nëse një mesazh vjen prej një kontakti të panjohur, shfaqet si <strong>kërkesë</strong>.</p>
|
||||
|
||||
<ul>
|
||||
<li>Nëse një mesazh vjen prej një kontakti të panjohur, shfaqet si <strong>kërkesë</strong>.
|
||||
Duhet të pranoni kërkesën, para se të mund të përgjigjeni.</li>
|
||||
<li>Mundeni edhe ta “fshini”, nëse s’doni të bisedoni me të tani. Kjo <strong>nuk</strong>
|
||||
fshin mesazhin te shërbyesi, vetëm te pajisja juaj. Kështu, mundeni
|
||||
të merreni me mesazhin që nga një tjetër aplikacion email-esh.</li>
|
||||
<li>Nëse fshini një kërkesë, mesazhet e ardhshëm prej atij kontakti do të shfaqen
|
||||
<li>
|
||||
<p>Duhet të <strong>pranoni</strong> kërkesën, para se të mund të përgjigjeni.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Mundeni edhe ta <strong>fshini</strong>, nëse s’doni të bisedoni me të tani.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Nëse fshini një kërkesë, mesazhet e ardhshëm prej atij kontakti do të shfaqen
|
||||
ende si kërkesë për mesazh, që të mund të ndërroni mendje. Nëse vërtet
|
||||
s’doni të merrni mesazhe prej këtij personi, shihni mundësinë e <em>bllokimit</em> të tij.</li>
|
||||
s’doni të merrni mesazhe prej këtij personi, shihni mundësinë e <strong>bllokimit</strong> të tij.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="a-mbulon-delta-chat-i-figura-video-dhe-bashkëngjitje-të-tjera">
|
||||
@@ -305,6 +309,41 @@ Fjalosjet e arkivuara mbesin të përdorshme mbi listën e fjalosjeve, ose përm
|
||||
<p>Që të arkivoni ose fiksoni një fjalosje, prekeni gjatë (në Android), përdorni menunë e fjalosjes (në Android/Desktop), ose fërkojeni për majtas (në iOS);
|
||||
që të heshtoni një fjalosje, përdorni menunë e fjalosjes (në Android/Desktop), ose profilin e fjalosjes (në iOS).</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
How do “Saved Messages” work? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Saved Messages</strong> is a chat that you can use to easily remember and find messages.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>In any chat, long tap or right click a message and select <strong>Save</strong></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Saved messages are marked by the symbol
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
|
||||
next to the timestamp</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Later, open the “Saved Messages” chat - and you will see the saved messages there.
|
||||
By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
|
||||
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>
|
||||
</li>
|
||||
<li>
|
||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Messages stay saved even if they are edited or deleted -
|
||||
may it be by <a href="#edit">sender</a>, by <a href="#delold">device cleanup</a> or by <a href="#ephemeralmsgs">disappearing messages of other chats</a>.</p>
|
||||
|
||||
<h3 id="çdo-të-thotë-pika-e-gjelbër">
|
||||
|
||||
|
||||
@@ -313,25 +352,49 @@ që të heshtoni një fjalosje, përdorni menunë e fjalosjes (në Android/Deskt
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Këtej mundeni të shihni ndonjëherë një <strong>pikë të gjelbër</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> në krah të avatarit të një kontakti. Hollësisht: do të thotë se, në 10 minutat e fundit, Delta Chat-i i ka parë:</p>
|
||||
|
||||
<ul>
|
||||
<li>Nga Delta Chat 1.34 e këtej mundeni të shihni ndonjëherë një “pikë të gjelbër”
|
||||
në krah të avatarit të një kontakti. Ajo do të thotë se është “parë së fundi”.</li>
|
||||
<li>Hollësisht: do të thotë se, në 10 minutat e fundit, Delta Chat-i i ka parë:
|
||||
<ul>
|
||||
<li>ose pse ju dërguan mesazh drejtpërsëdrejti,</li>
|
||||
<li>ngaqë shkruan diçka te një grup ku jeni pjesë të dy palët,</li>
|
||||
<li>ngaqë ju dërguan një dëftesë leximi për një mesazh që shkruat,</li>
|
||||
<li>ose ngaqë dërguan të dhëna te aplikacioni juaj Delta Chat përmes një
|
||||
<a href="#webxdc">aplikacioni webxdc</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Pra, kjo s’është gjendje e njëmendtë aty për aty për qenie në linjë - dhe
|
||||
nëse dikush nuk përgjigjet menjëherë, edhe pse duket të jetë në linjë, mos
|
||||
u merakosni dhe lëruni ca kohë ;-)</li>
|
||||
<li>Më anë tjetër, të tjerët jo përherë “do të shohin se jeni në linjë”. Nëse keni
|
||||
çaktivizuar dëftesa leximesh, s’do të shohin pikën e gjelbër para se ju
|
||||
t’u dërgoni një mesazh, ose të shkruani te një grup ku bëjnë pjesë edhe ata.</li>
|
||||
<li>ose pse ju dërguan mesazh drejtpërsëdrejti,</li>
|
||||
<li>ngaqë shkruan diçka te një grup ku jeni pjesë të dy palët,</li>
|
||||
<li>ngaqë ju dërguan një dëftesë leximi për një mesazh që shkruat,</li>
|
||||
<li>ose ngaqë dërguan të dhëna te aplikacioni juaj Delta Chat përmes një <a href="#webxdc">aplikacioni webxdc</a>.</li>
|
||||
</ul>
|
||||
|
||||
<p>Pra, kjo s’është gjendje e njëmendtë aty për aty për qenie në linjë - dhe
|
||||
nëse dikush nuk përgjigjet menjëherë, edhe pse duket të jetë në linjë, mos
|
||||
u merakosni dhe lëruni ca kohë :)</p>
|
||||
|
||||
<p>Më anë tjetër, të tjerët jo përherë “do të shohin se jeni në linjë”. Nëse keni
|
||||
çaktivizuar dëftesa leximesh, s’do të shohin pikën e gjelbër para se ju
|
||||
t’u dërgoni një mesazh, ose të shkruani te një grup ku bëjnë pjesë edhe ata.</p>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Correct typos and delete messages after sending <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>You can edit the text of your messages after sending.
|
||||
For that, long tap or right click the message and select <strong>Edit</strong>
|
||||
or <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you have sent a message accidentally,
|
||||
from the same menu, select <strong>Delete</strong> and then <strong>Delete for Everyone</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>While edited messages will have the word “Edited” next to the timestamp,
|
||||
deleted messages will be removed without a marker in the chat.
|
||||
Notifications are not sent and there is no time limit.</p>
|
||||
|
||||
<p>Note, that the original message may still be received by chat members
|
||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
@@ -650,7 +713,7 @@ would not reveal private information that Push services do not already have.</p>
|
||||
|
||||
<p>Delta Chat is a free and open source decentralized messenger with free server choice,
|
||||
but we want users to reliably experience “instant delivery” of messages,
|
||||
like they experience from Whatsapp, Signal or Telegram apps,
|
||||
like they experience from WhatsApp, Signal or Telegram apps,
|
||||
without asking questions up-front that are more suited to expert users or developers.</p>
|
||||
|
||||
<p>Note that Delta Chat has a <a href="#privacy-notifications">small and privacy-preserving Push Notification system</a>
|
||||
@@ -658,10 +721,10 @@ that achieves “instant delivery” of messages for all chatmail servers
|
||||
including a potential one <a href="https://delta.chat/chatmail#selfhosted">you might setup yourself without our permission</a>.
|
||||
Welcome to the power of the interoperable and massive chatmail and e-mail system :)</p>
|
||||
|
||||
<h2 id="fshehtëzim-dhe-siguri">
|
||||
<h2 id="e2ee">
|
||||
|
||||
|
||||
Fshehtëzim dhe Siguri <a href="#fshehtëzim-dhe-siguri" class="anchor"></a>
|
||||
Fshehtëzim dhe Siguri <a href="#e2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
@@ -674,18 +737,26 @@ Welcome to the power of the interoperable and massive chatmail and e-mail system
|
||||
|
||||
</h3>
|
||||
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||
establishing end-to-end encryption with contacts and group chats.
|
||||
Autocrypt uses a limited and <a href="#openpgp-secure">secure subset of the OpenPGP standard</a>.
|
||||
End-to-End encrypted messages are marked with a padlock
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" />.</p>
|
||||
<p>Delta Chat uses a <a href="#openpgp-secure">secure subset of the OpenPGP standard</a>
|
||||
to provide automatic end-to-end encryption using these protocols:</p>
|
||||
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join protocols</a>
|
||||
are used for establishing chats with guaranteed end-to-end encryption
|
||||
which protects against network attacks and compromised servers.
|
||||
Chats marked with a green checkmark
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
guarantee end-to-end encrypted messages.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a>
|
||||
to exchange encryption setup information through QR-code scanning or “invite links”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
||||
chat</a>
|
||||
enables receivers to use end-to-end encryption with the contact.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Delta Chat does not query, publish or interact with any OpenPGP key servers.</p>
|
||||
|
||||
<h3 id="whene2e">
|
||||
|
||||
@@ -695,28 +766,37 @@ guarantee end-to-end encrypted messages.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>All end-to-end encrypted messages carry a padlock:</p>
|
||||
|
||||
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
|
||||
|
||||
<p>End-to-end encryption is guaranteed if there is a green checkmark next to the chat title:</p>
|
||||
|
||||
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
|
||||
<p>All messages in Delta Chat are <strong>end-to-end encrypted by default</strong>.
|
||||
Since the Delta Chat Version 2 release series (July 2025)
|
||||
there are no lock or similar markers on end-to-end encrypted messages, anymore.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
<h3 id="can-i-still-receive-or-send-mails-without-end-to-end-encryption">
|
||||
|
||||
|
||||
How can I get guaranteed end-to-end encryption and green checkmarks? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Can i still receive or send mails without end-to-end encryption? <a href="#can-i-still-receive-or-send-mails-without-end-to-end-encryption" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If you have a second communication channel with your chat partner,
|
||||
like a video chat or a different messenger,
|
||||
you can generate an invite link.</p>
|
||||
<p>If you use default <a href="https://chatmail.at/relays">chatmail relays</a>,
|
||||
it is impossible to receive or send messages without end-to-end encryption.</p>
|
||||
|
||||
<p>If you are together in person,
|
||||
you can show a QR code to your chat partner.</p>
|
||||
<p>If you instead create a profile using a classic e-mail server,
|
||||
you can send and receive messages without end-to-end encryption.
|
||||
Such messages lacking end-to-end encryption are marked with an e-mail icon
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
How can I establish a chat with a new contact? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can send an invite link through another private chat,
|
||||
show an invitation QR code when next to each other or in a video call,
|
||||
or click on a “contact” that was shared in a chat.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -725,141 +805,60 @@ tap the chat group title to see its member list,
|
||||
and select “QR Invite code”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>For <strong>direct 1:1 chat invitations</strong>,
|
||||
<p>For <strong>direct 1:1 chat invitations</strong>,
|
||||
tap the QR Code icon <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
|
||||
on the Delta Chat app main screen.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Let your chat partner scan the QR image
|
||||
<p>Ask your chat partner to scan the QR image
|
||||
with their Delta Chat app,
|
||||
or click “Copy” or “Share” to create an invite link
|
||||
and share it with your chat partner.</p>
|
||||
|
||||
<p>Now wait while <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">Secure-Join network messages are exchanged</a> between both devices.</p>
|
||||
<p>Now wait while <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">end-to-end encryption is getting established</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>If both devices are online,
|
||||
both sides will eventually see a (group or direct) chat with a green checkmark
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
next to the title.</p>
|
||||
<p>If both sides are online, they will soon see a (group or direct) chat
|
||||
and can start messaging securely.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If one of the devices is offline, the green checkmarks will only
|
||||
appear later when the device is internet-connected again
|
||||
and the Secure-Join network protocol completed.</p>
|
||||
<p>If one side is offline or in bad network,
|
||||
the ability to chat is delayed until connectivity is restored.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Congratulations!
|
||||
You now will automatically use guaranteed end-to-end encryption
|
||||
with this contact and both of you can add each other to green-checkmarked groups
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />,
|
||||
thereby automatically spreading guaranteed end-to-end encryption among its members.</p>
|
||||
You now will automatically use end-to-end encryption
|
||||
with this contact.
|
||||
If you add each other to chat groups,
|
||||
end-to-end encryption will be established among all members.</p>
|
||||
|
||||
<h3 id="e2eeguarantee">
|
||||
|
||||
|
||||
What does the green checkmark and “guaranteed end-to-end encryption” mean? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
What does the green checkmark in a contact profile mean? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Chat titles with green checkmarks
|
||||
<p>A contact profile might show a green checkmark
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
mean that all messages in the chat will be end-to-end encrypted
|
||||
and can not be read or altered by compromised e-mail servers or Internet providers.
|
||||
Joining green-checkmarked group chats
|
||||
safely spreads everybody’s encryption information (and green checkmarks)
|
||||
in a manner that guarantees end-to-end encryption in the group and among members.</p>
|
||||
|
||||
<p>Contact profiles with green checkmarks
|
||||
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
|
||||
mean that messaging a contact is currently guaranteed to be end-to-end encrypted.
|
||||
and an “Introduced by” line.
|
||||
Every green-checkmarked contact either did a direct <a href="#howtoe2ee">QR-scan</a> with you
|
||||
or was introduced by a another green-checkmarked contact.
|
||||
Introductions happen automatically when adding members to groups.
|
||||
Whoever adds a contact to a green-checkmarked group becomes an introducer
|
||||
to those members who didn’t yet know about the added contact.
|
||||
Whoever adds a green-checkmarked contact to a group with only green-checkmarked members
|
||||
becomes an introducer.
|
||||
In a contact profile you can tap on the “Introduced by …” text repeatedly
|
||||
until you get to the one with whom you directly did a <a href="#howtoe2ee">QR-scan</a>.</p>
|
||||
|
||||
<p>Note that in a contact profile you may see and tap introducers
|
||||
but there is no green checkmark in the profile title.
|
||||
This usually means that the contact <a href="#nocryptanymore">“sent a message from another device”</a>.</p>
|
||||
|
||||
<p>For more in-depth discussion of “guaranteed end-to-end encryption”
|
||||
please see <a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join protocols</a>
|
||||
and specifically read about “Verified Groups”, the technical term
|
||||
of what is called here “green-checkmarked” or “guaranteed end-to-end encrypted” chats.</p>
|
||||
|
||||
<h3 id="nocryptanymore">
|
||||
|
||||
|
||||
A contact “sent a message from another device”, what can i do? <a href="#nocryptanymore" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Your chat with a contact lost guaranteed end-to-end encryption.
|
||||
The green checkmark was removed for this chat and contact when you see this warning.
|
||||
<strong>If you find the sudden drop of guaranteed end-to-end encryption
|
||||
surprising for this contact then don’t accept the warning!</strong>
|
||||
Instead check with your contact through a second channel
|
||||
like a video call, other messenger or a phone call,
|
||||
to find out what happened.</p>
|
||||
|
||||
<p>If your contact actually caused the drop of guaranteed end-to-end encryption
|
||||
please see the next paragraphs for common reasons and their mitigations.
|
||||
Regardless, all other green-checkmarked chats remain guaranteed end-to-end encrypted
|
||||
even if the contact is a member there.</p>
|
||||
|
||||
<p><strong>Your contact is using Delta Chat on a second device (phone or laptop)</strong></p>
|
||||
|
||||
<p>If they have another device with a Delta Chat app running,
|
||||
they should remove the profile from the new device
|
||||
and add it <a href="#multiclient">as a second device as described here</a>.
|
||||
As soon as they message you afterwards, the warning will be gone
|
||||
and guaranteed encryption is established with both devices of your contact.</p>
|
||||
|
||||
<p><strong>Your contact reinstalled Delta Chat using their old account login</strong></p>
|
||||
|
||||
<p>If they have <a href="#backup">a backup file</a>,
|
||||
they should remove the profile from the new device
|
||||
and rather import the backup file to re-create their profile.
|
||||
As soon as they message you afterwards, the warning will be gone
|
||||
and guaranteed encryption is re-established for this contact.</p>
|
||||
|
||||
<p>If they don’t have a backup file, it’s best to perform a <a href="#howtoe2ee">QR scan</a>
|
||||
with your chat partner to re-establish guaranteed end-to-end encryption.</p>
|
||||
|
||||
<p><strong>Your contact sent a mail through a webmail interface or another e-mail app
|
||||
and will get back to using Delta Chat soon again.</strong></p>
|
||||
|
||||
<p>If you are sure that the contact sometimes uses webmail,
|
||||
or another mail app lacking end-to-end encryption,
|
||||
then you may accept the warning.
|
||||
As soon as your contact uses Delta Chat again,
|
||||
guaranteed end-to-end encryption will be automatically re-established.</p>
|
||||
|
||||
<p><strong>Your contact stopped using Delta Chat entirely</strong></p>
|
||||
|
||||
<p>Sometimes remaining in contact is more important than end-to-end encryption.
|
||||
<a href="#tls">“Transport Layer Encryption” (TLS)</a> may still meaningfully protect
|
||||
the confidentiality of your messages between your device and the e-mail server.
|
||||
But without end-to-end encryption you and your contact are trusting your e-mail server
|
||||
to not read or manipulate your messages, and to not hand them to third parties.</p>
|
||||
|
||||
<p>In any case, you can not do much else than accept the warning.
|
||||
Please also remove the contact from any active green-checkmarked group
|
||||
which you can find in “Shared chats” in the Contact profile.
|
||||
This spares your contact from getting “unreadable” messages.</p>
|
||||
|
||||
<p>If the contact removed Delta Chat because of buggy or undesirable behaviour,
|
||||
please consider posting to our <a href="https://support.delta.chat">support forum</a>
|
||||
to help us identify and address common problems. Thanks!</p>
|
||||
|
||||
<h3 id="are-attachments-pictures-files-audio-etc-end-to-end-encrypted">
|
||||
|
||||
|
||||
@@ -884,12 +883,11 @@ and attachment metadata such as filenames.</p>
|
||||
</h3>
|
||||
|
||||
<p>Yes, Delta Chat uses a secure subset of OpenPGP
|
||||
and only displays a padlock security indicator on a message
|
||||
if the whole message is properly encrypted and signed.
|
||||
requiring the whole message to be properly encrypted and signed.
|
||||
For example, “Detached signatures” are not treated as secure.</p>
|
||||
|
||||
<p>OpenPGP is not insecure by itself.
|
||||
Most publically discussed OpenPGP security problems
|
||||
Most publicly discussed OpenPGP security problems
|
||||
actually stem from bad usability or bad implementations of tools or apps (or both).
|
||||
It is particularly important to distinguish between OpenPGP, the IETF encryption standard,
|
||||
and GnuPG (GPG), a command line tool implementing OpenPGP.
|
||||
@@ -906,7 +904,7 @@ which was thankfully adopted in summer 2023.</p>
|
||||
<h3 id="openpgp-alternatives">
|
||||
|
||||
|
||||
Did you consider using alternatives to OpenPGP for end-to-end -encryption? <a href="#openpgp-alternatives" class="anchor"></a>
|
||||
Did you consider using alternatives to OpenPGP for end-to-end-encryption? <a href="#openpgp-alternatives" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -949,17 +947,15 @@ as defined by the Autocrypt Level 1 specification.</p>
|
||||
<h3 id="tls">
|
||||
|
||||
|
||||
Is a message exposed in cleartext if end-to-end encryption is not available? <a href="#tls" class="anchor"></a>
|
||||
Are messages marked with the mail icon exposed on the Internet? <a href="#tls" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Even if your messages are not guaranteed to be end-to-end encrypted,
|
||||
they are still protected from Internet providers like cell or cable companies.
|
||||
However, your and your recipient’s e-mail providers
|
||||
may read, analyze or even modify your messages,
|
||||
including any attachments,
|
||||
if they are not end-to-end encrypted.</p>
|
||||
<p>If you are sending or receiving e-mail messages without end-to-end encryption (using a classic e-mail server),
|
||||
they are still protected from cell or cable companies who can not read or modify your e-mail messages.
|
||||
But both your and your recipient’s e-mail providers
|
||||
may read, analyze or modify your messages, including any attachments.</p>
|
||||
|
||||
<p>Delta Chat by default uses strict
|
||||
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS encryption</a>
|
||||
@@ -971,10 +967,6 @@ If the involved e-mail servers support <a href="https://datatracker.ietf.org/doc
|
||||
then transport encryption will be enforced between e-mail 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>Note that <a href="#howtoe2ee">maintaining guaranteed end-to-end encryption</a> on top of TLS encryption
|
||||
provides pervasive safety between your and the recipient’s devices.
|
||||
Not even your e-mail or Internet provider will be able to read or modify your messages.</p>
|
||||
|
||||
<h3 id="message-metadata">
|
||||
|
||||
@@ -984,25 +976,25 @@ Not even your e-mail or Internet provider will be able to read or modify your me
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat protects most message metadata by putting the following information
|
||||
into the end-to-end encrypted part of messages:</p>
|
||||
<p>Unlike most other messengers,
|
||||
Delta Chat apps do not store any metadata about contacts or groups on servers, also not in encrypted form.
|
||||
Instead, all group metadata is end-to-end encrypted and stored on end-user devices, only.</p>
|
||||
|
||||
<p>E-mail Servers can therefore only see</p>
|
||||
|
||||
<ul>
|
||||
<li>Rresht subjekti</li>
|
||||
<li>Avatar dhe emër grupi</li>
|
||||
<li>Kërkesa MDN (dëftesë leximi) (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
|
||||
<li>Afatmatës mesazhesh që zhduken (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
|
||||
<li><code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code></li>
|
||||
<li>Krye <code class="language-plaintext highlighter-rouge">Secure-Join</code> që përmban urdhra për pjesëmarrje të siguruar</li>
|
||||
<li>Njoftim mbi aktivizim tregimi vendndodhjeje</li>
|
||||
<li>URL dhome WebRTC</li>
|
||||
<li>
|
||||
<p>the message date,</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>sender and receiver addresses</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>and message size.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>E-Mail servers do not get access to this protected metadata
|
||||
but they do see the message date as well as the message size,
|
||||
and, more importantly, the sender and receiver addresses.
|
||||
E-mail servers need receiver addresses to route and
|
||||
deliver messages to recipient’s devices.</p>
|
||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||
|
||||
<h3 id="device-seizure">
|
||||
|
||||
@@ -1014,19 +1006,80 @@ deliver messages to recipient’s devices.</p>
|
||||
|
||||
<p>Both for protecting against metadata-collecting e-mail servers
|
||||
as well as against the threat of device seizure
|
||||
we recommend to use a <a href="https://delta.chat/chatmail">chatmail server</a>
|
||||
to create pseudonymous temporary profiles through QR-code scans.
|
||||
we recommend to use a <a href="https://chatmail.at/relays">chatmail relay</a>
|
||||
to create chat profiles using random e-mail addresses for transport.
|
||||
Note that Delta Chat apps on all platforms support multiple profiles
|
||||
so you can easily use situation-specific profiles next to your “main” profile
|
||||
with the knowledge that all their data, along with all metadata, will be deleted.
|
||||
Moreover, if a device is seized then contacts using temporary profiles
|
||||
can not be identified easily, as compared to messengers which reveal
|
||||
phone numbers in chat groups which in turn are often associated with legal identities.</p>
|
||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||
can not be identified easily.</p>
|
||||
|
||||
<h3 id="how-can-i-check-encryption-information">
|
||||
<h3 id="sealedsender">
|
||||
|
||||
|
||||
How can i check encryption information? <a href="#how-can-i-check-encryption-information" class="anchor"></a>
|
||||
Does Delta Chat support “Sealed Sender”? <a href="#sealedsender" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, not yet.</p>
|
||||
|
||||
<p>The Signal messenger introduced <a href="https://signal.org/blog/sealed-sender/">“Sealed Sender” in 2018</a>
|
||||
to keep their server infrastructure ignorant of who is sending a message to a set of recipients.
|
||||
It is particularly important because the Signal server knows the mobile number of each account,
|
||||
which is usually associated with a passport identity.</p>
|
||||
|
||||
<p>Even if <a href="https://chatmail.at/relays">chatmail relays</a>
|
||||
do not ask for any private data (including no phone numbers),
|
||||
it might still be worthwhile to protect relational metadata between addresses.
|
||||
We don’t foresee bigger problems in using random throw-away e-mail addresses for sealed sending
|
||||
but an implementation has not been agreed as a priority yet.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Does Delta Chat support Perfect Forward Secrecy? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, not yet.</p>
|
||||
|
||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||
This means that if your private decryption key is leaked,
|
||||
and someone has collected your prior in-transit messages,
|
||||
they will be able to decrypt and read them using the leaked decryption key.
|
||||
Note that Forward Secrecy only increases security if you delete messages.
|
||||
Otherwise, someone obtaining your decryption keys
|
||||
is typically also able to get all your non-deleted messages
|
||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||
|
||||
<p>We designed a Forward Secrecy approach that withstood
|
||||
initial examination from some cryptographers and implementation experts
|
||||
but is pending a more formal write up
|
||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
||||
|
||||
<h3 id="pqc">
|
||||
|
||||
|
||||
Does Delta Chat support Post-Quantum-Cryptography? <a href="#pqc" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, not yet.</p>
|
||||
|
||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
||||
in collaboration with other OpenPGP implementers.</p>
|
||||
|
||||
<h3 id="how-can-i-manually-check-encryption-information">
|
||||
|
||||
|
||||
How can I manually check encryption information? <a href="#how-can-i-manually-check-encryption-information" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1037,122 +1090,6 @@ Delta Chat shows two fingerprints there.
|
||||
If the same fingerprints appear on your own and your contact’s device,
|
||||
the connection is safe.</p>
|
||||
|
||||
<h3 id="si-mund-ta-kontrolloj-gjendjen-e-fshehtëzimit-të-mesazheve">
|
||||
|
||||
|
||||
Si mund ta kontrolloj gjendjen e fshehtëzimit të mesazheve? <a href="#si-mund-ta-kontrolloj-gjendjen-e-fshehtëzimit-të-mesazheve" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>A little <strong>padlock</strong> in a message bubble denotes
|
||||
that the message was properly end-to-end encrypted from the given sender.
|
||||
If there is <strong>no padlock</strong>, the message was not properly end-to-end encrypted
|
||||
most likely because the sender uses an app or webmail interface
|
||||
without support for end-to-end–encryption.</p>
|
||||
|
||||
<h3 id="pse-shoh-mesazhe-të-pafshehtëzuar">
|
||||
|
||||
|
||||
Pse shoh mesazhe të pafshehtëzuar? <a href="#pse-shoh-mesazhe-të-pafshehtëzuar" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If a contact uses a non-Autocrypt e-mail app,
|
||||
all messages involving this contact (in a group or 1:1 chat)
|
||||
will not be end-to-end encrypted, and thus not show a “padlock” with messages.
|
||||
Note that even if your contacts use Delta Chat on their account,
|
||||
they might also use a non-Autocrypt e-mail app on that account
|
||||
which then may cause intermittently unencrypted messages.
|
||||
Replying unencrypted to unencrypted messages is mandated by Autocrypt
|
||||
to prevent unreadable messages on the side of your contacts
|
||||
and their non-Autocrypt e-mail app.</p>
|
||||
|
||||
<h3 id="how-can-i-get-an-end-to-end-encrypted-chat-with-a-delta-chat-contact-who-sometimes-uses-webmail-or-another-non-autocrypt-e-mail-app">
|
||||
|
||||
|
||||
How can i get an end-to-end encrypted chat with a Delta Chat contact who sometimes uses webmail or another non-Autocrypt e-mail app? <a href="#how-can-i-get-an-end-to-end-encrypted-chat-with-a-delta-chat-contact-who-sometimes-uses-webmail-or-another-non-autocrypt-e-mail-app" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If you need a safely end-to-end encrypted chat with a contact
|
||||
who is using their e-mail account both with Delta Chat and non-Autocrypt apps (e.g. webmail),
|
||||
it’s best to setup <a href="#howtoe2ee">guaranteed end-to-end encryption with them</a>
|
||||
and then create a guaranteed end-to-end encrypted group chat with you two as members.
|
||||
In this group chat all messages will be end-to-end encrypted
|
||||
even if the direct chat between you two has a
|
||||
<a href="#nocryptanymore">“… sent a message from another device”</a> warning.</p>
|
||||
|
||||
<h3 id="how-can-i-ensure-message-end-to-end-encryption-and-deletion">
|
||||
|
||||
|
||||
How can I ensure message end-to-end encryption and deletion? <a href="#how-can-i-ensure-message-end-to-end-encryption-and-deletion" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>The best way to ensure every message is end-to-end encrypted,
|
||||
and metadata deleted as quickly as possible
|
||||
is <a href="#howtoe2ee">using chats with guaranteed end-to-end encryption</a>
|
||||
and turning on <a href="#ephemeralmsgs">disappearing messages</a>.</p>
|
||||
|
||||
<p>Guaranteed end-to-end encrypted chats protect against <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM attacks</a>
|
||||
and turning on disappearing messages deletes the messages
|
||||
on the server after a user-configured time.</p>
|
||||
|
||||
<p>Nëse s’ju duhet te shërbyesi një kopje jetëgjatë e mesazheve tuaj,
|
||||
mund edhe të aktivizoni <a href="#delold">“fshiji automatikisht nga shërbyesi mesazhe”</a>.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
|
||||
Does Delta Chat support Perfect Forward Secrecy? <a href="#pfs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>No, Delta Chat doesn’t support Perfect Forward Secrecy (PFS).
|
||||
This means that if your Delta Chat private decryption key is leaked,
|
||||
and someone has collected your prior in-transit messages,
|
||||
they will be able to decrypt and read them using the leaked decryption key.</p>
|
||||
|
||||
<p>Note, however, that if anyone obtains to your decryption keys,
|
||||
they will typically also be able to obtain your messages,
|
||||
irrespective if Perfect Forward Secrecy is in place or not.
|
||||
The typical real-world situation for leaked decryption keys is device seizure
|
||||
which we discuss in our answer <a href="#device-seizure">on metadata and device seizure</a>.</p>
|
||||
|
||||
<p>It is possible that Delta Chat evolves to support Perfect Forward Secrecy,
|
||||
because OpenPGP is just a container for encrypted messages
|
||||
but encryption key management (and thus key rotation or key “ratcheting”)
|
||||
could be organized in flexible ways.
|
||||
See <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">Seqouia’s PFS prototype</a>
|
||||
for existing experiments in the OpenPGP implementor community.</p>
|
||||
|
||||
<h3 id="is-end-to-end-encryption-of-delta-chat-as-safe-as-signal">
|
||||
|
||||
|
||||
Is end-to-end encryption of Delta Chat as safe as Signal? <a href="#is-end-to-end-encryption-of-delta-chat-as-safe-as-signal" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>It depends on what is important to you.
|
||||
Delta Chat <a href="#pfs">does not support PFS</a> like Signal does
|
||||
but it provides <a href="#e2eeguarantee">guaranteed end-to-end encrypted chats</a>
|
||||
that are safe against compromised servers or corrupted networks.
|
||||
Signal and most other PFS-supporting messengers do not provide
|
||||
a practical scheme for protecting chat groups from network attacks
|
||||
which are arguably more worrysome
|
||||
than a potential attacker who seizes your phone and private encryption setup
|
||||
but somehow not your messages, yet has a full record of all
|
||||
past encrypted messages.</p>
|
||||
|
||||
<p>In any case, Delta Chat’s end-to-end encryption uses a <a href="#openpgp-secure">secure subset of OpenPGP</a>
|
||||
which has been <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">independently security-audited</a>.</p>
|
||||
|
||||
<h3 id="importkey">
|
||||
|
||||
|
||||
@@ -1161,42 +1098,14 @@ which has been <a href="https://delta.chat/assets/blog/2019-first-security-revie
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Po
|
||||
The best way is to send an Autocrypt Setup Message from the other e-mail client.
|
||||
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
|
||||
<p>No.</p>
|
||||
|
||||
<p>Ndryshe, mund ta importoni kyçin dorazi te “Rregullime -> Rregullime të mëtejshme -> Importoni kyçe të fshehtë”.
|
||||
Kujdes: Sigurohuni se kyçi s’është i mbrojtur me fjalëkalim, ose hiqeni fjalëkalimin që më parë.</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>Nëse s’keni kyç, ose as që e dinit se mund t’ju duhej një i tillë… mos u bëni merak: Delta Chat-i prodhon një të tillë, kur duhet dhe s’ju duhet të shtypni një buton për këtë.</p>
|
||||
|
||||
<h3 id="seksportoj-dot-kyçet-e-mi-ekzistues-pgp-në-delta-chat">
|
||||
|
||||
|
||||
S’eksportoj dot kyçet e mi ekzistues PGP në Delta Chat. <a href="#seksportoj-dot-kyçet-e-mi-ekzistues-pgp-në-delta-chat" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ka shumë mundësi që problemi të jetë se kyçi juaj është i fshehtëzuar dhe/ose
|
||||
përdor një fjalëkalim. Kyçe të tillë nuk mbulohen nga Delta Chat. Ju lutemi,
|
||||
hiqeni fshehtëzimin dhe fjalëkalimin dhe riprovoni importimin.</p>
|
||||
|
||||
<p>Another common error is having the wrong file ending.
|
||||
Use the ASCII armored format and an <code class="language-plaintext highlighter-rouge">.asc</code> file ending.</p>
|
||||
|
||||
<p>Për sa u takon formateve, Delta Chat-i mbulon formate të rëndomtë OpenPGP
|
||||
kyçesh private, megjithatë, ka pak gjasa që të mbulojmë 100% të krejt kyçeve
|
||||
private të çfarëdo burimi. Kjo gjithashtu s’është fokusi kryesor i Delta Chat-it
|
||||
(në fakt, shumica dërrmuese e përdoruesve të Delta Chat-it s’do të kenë ndonjë
|
||||
kyç përpara se të zënë të përdorin Delta-n). Sidofoqtë, përpiqemi të mbulojmë
|
||||
kyçe private prej burimesh të tjera sa më mirë që të mundet.</p>
|
||||
|
||||
<p>Heqja e fjalëkalimi nga kyçi privat do të jetë e ndryshme, varet nga software-i
|
||||
që ju përdorni për administrim kyçesh PGP. Me Enigmail-in, mund t’i jepni
|
||||
fjalëkalimit tuaj një vlerë të zbrazët, që nga dritarja Administrim Kyçesh. Me
|
||||
GnuPG-në mund ta bëni <a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">përmes rreshti urdhrash</a>.
|
||||
Për programe të tjera, mund të gjeni një zgjidhje në internet.</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>
|
||||
|
||||
<h3 id="security-audits">
|
||||
|
||||
@@ -1214,7 +1123,7 @@ from most recent to older:</p>
|
||||
<li>
|
||||
<p>2024 December, an <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">NLNET-commissioned Evaluation of
|
||||
rPGP</a> by <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a> took place.
|
||||
rPGP serves as the end-to-end encyption <a href="https://openpgp.org">OpenPGP</a> engine of Delta Chat.
|
||||
rPGP serves as the end-to-end encryption <a href="https://openpgp.org">OpenPGP</a> engine of Delta Chat.
|
||||
Two advisories were released related to the findings of this audit:</p>
|
||||
|
||||
<ul>
|
||||
@@ -1289,7 +1198,7 @@ Mund të lexoni <a href="https://delta.chat/assets/blog/2019-first-security-revi
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Po Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
|
||||
<p>Po You can use the same profile on different devices:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -1346,6 +1255,10 @@ që dihet se shkakton probleme (veçanërisht në Windows).
|
||||
<li>
|
||||
<p><strong>Guest Networks</strong> may not allow devices to communicate with each other.
|
||||
If possible, use a non-guest network.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you still have troubles using the same network,
|
||||
try to open <strong>Mobile Hotspot</strong> on one device and join that Wi-Fi from the other one</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Garantoni se ka <strong>depozitë të mjaftueshme</strong> te pajisja vendmbërritje</p>
|
||||
@@ -1393,6 +1306,23 @@ help you.</li>
|
||||
end-to-end encrypted messages with your communication partners.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="is-deletion-pinning-archiving-saving-muting-etc-synced-to-all-devices">
|
||||
|
||||
|
||||
Is Deletion, Pinning, Archiving, Saving, Muting etc. synced to all devices? <a href="#is-deletion-pinning-archiving-saving-muting-etc-synced-to-all-devices" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Po</p>
|
||||
|
||||
<p>If you e.g. delete a chat or a message from your phone,
|
||||
it will be deleted on your desktop as soon as it comes online again.</p>
|
||||
|
||||
<p>Notable exceptions are <a href="#delold">Delete old messages from Device</a>,
|
||||
as different devices may have different storage capacities,
|
||||
and system specific settings as notification sounds.</p>
|
||||
|
||||
<h3 id="a-ka-ndonjë-plan-për-të-sjellë-një-klient-web-delta-chat">
|
||||
|
||||
|
||||
@@ -1441,9 +1371,10 @@ copies on the devices of your chat partners. Other than that, it’s completely
|
||||
isolated from the Internet.</li>
|
||||
<li>The privacy a webxdc app offers is the privacy of your chat - as long as you
|
||||
trust the people you chat with, you can trust the webxdc app as well.</li>
|
||||
<li>This also means: it can be a privacy risk to open webxdc apps in chats where
|
||||
you don’t trust the members - as you know it from e-mail attachments, where
|
||||
you only open attachments from senders you trust, and not from spammers.</li>
|
||||
<li>This also means: it can be a privacy risk to open apps in chats with untrusted members.
|
||||
Just like with e-mail attachments, video calls or plain links:
|
||||
open them only from senders you trust, and not from spammers.
|
||||
Spammers can get to know any data you send to them, as well as your IP address.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="ku-mund-të-marr-aplikacione-webxdc">
|
||||
@@ -1514,7 +1445,7 @@ will not get interrupted by a video chat invite.</li>
|
||||
link in the settings.</li>
|
||||
<li>For example, to use the flagship Jitsi Meet instance, you could enter
|
||||
<code class="language-plaintext highlighter-rouge">https://meet.jit.si/$ROOM</code>. The <code class="language-plaintext highlighter-rouge">$ROOM</code> variable will be a random value;
|
||||
this way, you will have a new random jitsi room every time you call someone.</li>
|
||||
this way, you will have a new random Jitsi room every time you call someone.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="çjanë-listat-e-transmetimeve-dhe-si-mund-ti-përdor">
|
||||
@@ -1525,22 +1456,10 @@ this way, you will have a new random jitsi room every time you call someone.</li
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Me një Listë Transmetimi mund të dërgoni një mesazh te shumë marrës njëherësh;
|
||||
kur ju përgjigjen, përgjigjen e merrni një fjalosjen tuaj të drejtpërdrejt tek për tek
|
||||
Marrësit s’mund të shohin njëri-tjetrin.</li>
|
||||
<li>Teknikisht, është një email me shumë marrës si BCC.</li>
|
||||
<li>Veçorinë mund ta aktivizoni te ndarja “veçori eksperimentale”, te rregullimet
|
||||
e mëtejshme. Mandej mund të krijoni një Listë Transmetimi që nga dialogu
|
||||
“Fjalosje e Re”.</li>
|
||||
<li>Në rast se përdorni më shumë se një pajisje, Listat e Transmetimit aktualisht nuk
|
||||
njëkohësohen mes tyre.</li>
|
||||
<li>Mesazhet e dërguar te lista transmetimi s’janë të fshehtëzuar. Fshehtëzimi
|
||||
do të dëmtonte anonimitetin, ngaqë atëherë krejt marrësit do të dinin se cili tjetër
|
||||
e mori mesazhin.
|
||||
(Dërgimi i email-eve individualë për këdo do të ishte edhe më keq, për shkak
|
||||
kufizimesh sasie email-esh që dërgohen dhe konsum trafiku në rrjet).</li>
|
||||
</ul>
|
||||
<p>With a Broadcast List you can send a message to many recipients at once;
|
||||
the recipients cannot reply in that list.
|
||||
Broadcast lists are still highly experimental
|
||||
and will very probably be replaced by something else, stay tuned :)</p>
|
||||
|
||||
<h3 id="si-mund-tu-tregoj-partnerëve-të-mi-në-fjalosje-vendndodhjen-time">
|
||||
|
||||
@@ -1597,6 +1516,11 @@ DeltaChat. Zakonisht kjo do të bëhej nga aplikacioni Delta Chat.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Note:
|
||||
Changing email addresses is temporarily disabled
|
||||
because of ongoing changes to the DeltaChat core.
|
||||
It should be available again in a few months.</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
<p>Change your address in “Settings → Advanced → Password and Account” and
|
||||
@@ -1699,19 +1623,19 @@ Sidoqoftë, disa furnizues shërbimesh kanë nevojë për mundësi speciale, që
|
||||
të funksionojnë si duhet, shihni <a href="https://providers.delta.chat">Provider Overview</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 id="dua-të-administroj-shërbyesin-tim-email-për-delta-chat-çrekomandoni">
|
||||
<h3 id="i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">
|
||||
|
||||
|
||||
Dua të administroj shërbyesin tim email për Delta Chat. Ç’rekomandoni? <a href="#dua-të-administroj-shërbyesin-tim-email-për-delta-chat-çrekomandoni" class="anchor"></a>
|
||||
I want to manage my own server for Delta Chat. What do you recommend? <a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Shumica e shërbyesve email do të funksionojnë mirë. Por çka
|
||||
rekomandojmë personalisht është një ndërthurje e Mailcow-ut dhe Mailadm-it,
|
||||
siç përshkruhet <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">në këtë postim blogu</a>.</li>
|
||||
<li>Mund të gjeni një <a href="https://delta.chat/sq/serverguide">udhërrëfyes instalimi në sajtin tonë</a>.</li>
|
||||
<li>Most mail servers will work well. But what we personally recommend is a
|
||||
chatmail relay server, as described <a href="https://delta.chat/en/2023-12-13-chatmail">in this
|
||||
blogpost</a>.</li>
|
||||
<li>You can find an <a href="https://github.com/chatmail/relay">installation guide on GitHub</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="pse-më-duhet-të-jap-fjalëkalimin-e-email-it-tim-në-delta-chat-a-është-e-sigurt-kjo">
|
||||
@@ -1728,7 +1652,7 @@ Sigurisht, fjalëkalimi depozitohet vetëm në pajisjen tuaj. Fjalëkalimi i tra
|
||||
vetëm furnizuesit të email-it tuaj (kur bëni hyrjen), i cili mund të hyjë te email-et
|
||||
tuaj, sido qoftë.</p>
|
||||
|
||||
<p>Ngaqë Delta Chat-i është Me Burim të Hapur, mund të kontrolloni <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">Kodin
|
||||
<p>Ngaqë Delta Chat-i është Me Burim të Hapur, mund të kontrolloni <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">Kodin
|
||||
Burim</a>,
|
||||
nëse doni të verifikoni se a trajtohen me siguri kredencialet tuaja. Na gëzojnë
|
||||
përshtypjet që e bëjn aplikacionin më të sigurt për krejt përdoruesit tanë.</p>
|
||||
@@ -1856,16 +1780,16 @@ shumë pajisje mund të mos punojë si duhet.</p>
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Yes and No.</li>
|
||||
<li>No, you can not use your Protonmail, Tutanota, or Criptext account with Delta
|
||||
Chat; they do not offer receiving mails via IMAP.</li>
|
||||
<li>In any case you can use Delta Chat to send Messages to people who use
|
||||
Protonmail, Tutanota, or Criptext. Those messages will not be end-to-end
|
||||
encrypted, though. The end-to-end encryption those providers offer is not
|
||||
compatible with <a href="https://autocrypt.org/">Autocrypt</a>, the standard Delta Chat
|
||||
uses.</li>
|
||||
<li>Delta Chat can end-to-end-encrypt through any e-mail provider with any
|
||||
<a href="https://autocrypt.org/dev-status.html">Autocrypt-enabled e-mail app</a>.</li>
|
||||
<li>Po dhe Jo.</li>
|
||||
<li>Jo, me Delta Chat-in s’mund të përdorni llogarinë tuaj Protonmail, Tutanota,
|
||||
ose Criptext; ato nuk ofrojnë marrje email-esh përmes IMAP-it.</li>
|
||||
<li>Sidoqoftë, mund të përdorni Delta Chat-in të dërgoni Mesazhe për persona që
|
||||
përdorin Protonmail, Tutanota, ose Criptext. Këto mesazhe ama s’do të jenë
|
||||
të fshehtëzuara Skaj-më-Skaj. Fshehtëzimi Skaj-më-Skaj që japin këto shërbime
|
||||
s’është i përputhshëm me <a href="https://autocrypt.org/">Autocrypt-in</a>, standardin që
|
||||
përdor Delta Chat-i.</li>
|
||||
<li>Delta Chat-i mund të kryejë fshehtëzim skaj-më-skaj përmes cilitdo shërbim
|
||||
email-i me çfarëdo <a href="https://autocrypt.org/dev-status.html">aplikacioni email që punon me Autocrypt</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="remove-account">
|
||||
@@ -1910,7 +1834,7 @@ Otherwise you might receive undecryptable messages from those group chats.</p>
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Shihni <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Standarde të përdorur në Delta Chat</a>.</li>
|
||||
<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>
|
||||
|
||||
<h3 id="where-can-my-friends-find-delta-chat">
|
||||
@@ -2041,4 +1965,4 @@ Frajburg (Gjermani) dhe u shpërndahet më tepër se një duzine kontribuesish n
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
</body></html>
|
||||
@@ -10,7 +10,9 @@
|
||||
<li><a href="#хто-бачить-моє-зображення-профілю">Хто бачить моє зображення профілю?</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>
|
||||
<li><a href="#edit">Виправлення помилок та видалення повідомлень після надсилання</a></li>
|
||||
<li><a href="#ephemeralmsgs">Як працюють повідомлення, що зникають?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -34,29 +36,25 @@
|
||||
<li><a href="#чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle">Чому Delta Chat інтегрується з централізованими пропрієтарними push-сервісами Apple/Google?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#шифрування-та-безпека">Шифрування та безпека</a>
|
||||
<li><a href="#e2ee">Шифрування та безпека</a>
|
||||
<ul>
|
||||
<li><a href="#які-стандарти-використовуються-для-наскрізного-шифрування">Які стандарти використовуються для наскрізного шифрування?</a></li>
|
||||
<li><a href="#whene2e">Як дізнатися, чи повідомлення зашифровано наскрізним шифруванням?</a></li>
|
||||
<li><a href="#howtoe2ee">Як отримати гарантоване наскрізне шифрування та зелені галочки?</a></li>
|
||||
<li><a href="#e2eeguarantee">Що означає зелена галочка і “гарантоване наскрізне шифрування”?</a></li>
|
||||
<li><a href="#nocryptanymore">Контакт “надіслав повідомлення з іншого пристрою”, що робити?</a></li>
|
||||
<li><a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">Чи можу я отримувати та надсилати пошту без наскрізного шифрування?</a></li>
|
||||
<li><a href="#howtoe2ee">Як створити чат з новим контактом?</a></li>
|
||||
<li><a href="#e2eeguarantee">Що означає зелена галочка в профілі контакту?</a></li>
|
||||
<li><a href="#чи-зашифровані-наскрізно-вкладення-зображення-файли-аудіо-тощо">Чи зашифровані наскрізно вкладення (зображення, файли, аудіо тощо)?</a></li>
|
||||
<li><a href="#openpgp-secure">Чи безпечний OpenPGP?</a></li>
|
||||
<li><a href="#openpgp-alternatives">Чи розглядали ви можливість використання альтернатив OpenPGP для наскрізного шифрування?</a></li>
|
||||
<li><a href="#чи-вразливий-delta-chat-до-efail">Чи вразливий Delta Chat до EFAIL?</a></li>
|
||||
<li><a href="#tls">Чи буде показано повідомлення відкритим текстом, якщо наскрізне шифрування недоступне?</a></li>
|
||||
<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="#як-перевірити-інформацію-про-шифрування">Як перевірити інформацію про шифрування?</a></li>
|
||||
<li><a href="#як-перевірити-стан-шифрування-повідомлень">Як перевірити стан шифрування повідомлень?</a></li>
|
||||
<li><a href="#чому-я-бачу-незашифровані-повідомлення">Чому я бачу незашифровані повідомлення?</a></li>
|
||||
<li><a href="#як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt">Як я можу отримати наскрізно зашифрований чат з контактом Delta Chat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt?</a></li>
|
||||
<li><a href="#як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень">Як забезпечити наскрізне шифрування та видалення повідомлень?</a></li>
|
||||
<li><a href="#sealedsender">Чи підтримує Delta Chat функцію “Запечатаний відправник”?</a></li>
|
||||
<li><a href="#pfs">Чи підтримує Delta Chat цілковиту пряму секретність (Perfect Forward Secrecy)?</a></li>
|
||||
<li><a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal">Чи є наскрізне шифрування Delta Chat таким же безпечним, як Signal?</a></li>
|
||||
<li><a href="#pqc">Чи підтримує Delta Chat пост-квантову криптографію?</a></li>
|
||||
<li><a href="#як-я-можу-вручну-перевірити-інформацію-про-шифрування">Як я можу вручну перевірити інформацію про шифрування?</a></li>
|
||||
<li><a href="#importkey">Чи можна повторно використовувати існуючий закритий ключ?</a></li>
|
||||
<li><a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat">Я не можу імпортувати свій існуючий PGP ключ у Delta Chat.</a></li>
|
||||
<li><a href="#security-audits">Чи проходив Delta Chat незалежний аудит на наявність вразливостей у безпеці?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -65,6 +63,7 @@
|
||||
<li><a href="#чи-можна-використовувати-delta-chat-на-декількох-пристроях-одночасно">Чи можна використовувати Delta Chat на декількох пристроях одночасно?</a></li>
|
||||
<li><a href="#вирішення-проблем">Вирішення проблем</a></li>
|
||||
<li><a href="#backup">Ручне перенесення</a></li>
|
||||
<li><a href="#чи-синхронізовані-видалення-закріплення-архівування-збереження-вимкнення-сповіщень-тощо-з-усіма-пристроями">Чи синхронізовані видалення, закріплення, архівування, збереження, вимкнення сповіщень тощо з усіма пристроями?</a></li>
|
||||
<li><a href="#чи-планується-впровадження-веб-клієнта-delta-chat">Чи планується впровадження веб-клієнта Delta Chat?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -81,14 +80,14 @@
|
||||
<li><a href="#що-таке-списки-широкомовлення-та-як-ними-користуватися">Що таке списки широкомовлення та як ними користуватися?</a></li>
|
||||
<li><a href="#як-я-можу-поділитися-своїм-місцезнаходженням-зі-своїми-співрозмовниками-в-чаті">Як я можу поділитися своїм місцезнаходженням зі своїми співрозмовниками в чаті?</a></li>
|
||||
<li><a href="#чому-я-можу-вибрати-лише-стеження-за-папкою-deltachat">Чому я можу вибрати лише стеження за папкою DeltaChat?</a></li>
|
||||
<li><a href="#як-я-можу-змінити-мій-обліковий-запис-на-іншу-адресу-електронної-пошти">Як я можу змінити мій обліковий запис на іншу адресу електронної пошти?</a></li>
|
||||
<li><a href="#як-я-можу-використовувати-іншу-адресу-електронної-пошти-у-своєму-профілі">Як я можу використовувати іншу адресу електронної пошти у своєму профілі?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#інше">Інше</a>
|
||||
<ul>
|
||||
<li><a href="#яких-дозволів-потребує-delta-chat">Яких дозволів потребує Delta Chat?</a></li>
|
||||
<li><a href="#чи-підтримує-delta-chat-роботу-з-моїм-провайдером-електронної-пошти">Чи підтримує Delta Chat роботу з <em>моїм</em> провайдером електронної пошти?</a></li>
|
||||
<li><a href="#я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите">Я хочу керувати власним сервером електронної пошти для Delta Chat. Що ви порадите?</a></li>
|
||||
<li><a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте?</a></li>
|
||||
<li><a href="#чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно">Чому я маю вводити пароль до моєї електронної пошти у Delta Chat? Чи це безпечно?</a></li>
|
||||
<li><a href="#які-повідомлення-відображаються-у-delta-chat">Які повідомлення відображаються у Delta Chat?</a></li>
|
||||
<li><a href="#чи-підтримує-delta-chat-html-листи">Чи підтримує Delta Chat HTML-листи?</a></li>
|
||||
@@ -96,7 +95,7 @@
|
||||
<li><a href="#для-чого-потрібне-налаштування-відправити-копію-собі">Для чого потрібне налаштування “Відправити копію собі”?</a></li>
|
||||
<li><a href="#чому-я-можу-обрати-стеження-за--папкою-надіслані">Чому я можу обрати стеження за папкою “Надіслані”?</a></li>
|
||||
<li><a href="#чому-я-можу-відмовитись-від-стеження-за--папкою-deltachat">Чому я можу відмовитись від стеження за папкою DeltaChat?</a></li>
|
||||
<li><a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext">Чи сумісний Delta Chat із Protonmail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#чи-сумісний-delta-chat-із-proton-mail--tutanota--criptext">Чи сумісний Delta Chat із Proton Mail / Tutanota / Criptext?</a></li>
|
||||
<li><a href="#remove-account">Як мені видалити свій обліковий запис?</a></li>
|
||||
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
|
||||
<li><a href="#де-мої-друзі-можуть-знайти-delta-chat">Де мої друзі можуть знайти Delta Chat?</a></li>
|
||||
@@ -117,7 +116,7 @@
|
||||
|
||||
<p>Delta Chat - це надійний, децентралізований та безпечний додаток для обміну повідомленнями, доступний для мобільних і десктопних платформ.</p>
|
||||
|
||||
<p>Delta Chat схожий на Whatsapp або Telegram, але ви також можете використовувати його як додаток електронної пошти. Ви можете анонімно зареєструватися на різних <a href="https://delta.chat/chatmail">сумісних chatmail-серверах</a> які є мінімальними поштовими серверами, оптимізованими для швидкої та безпечної роботи. Або ви можете використовувати класичні поштові сервери та існуючий обліковий запис електронної пошти в цьому випадку Delta Chat буде працювати як поштовий додаток.</p>
|
||||
<p>Delta Chat схожий на Whatsapp або Telegram, але ви також можете використовувати його як додаток електронної пошти. Ви можете анонімно зареєструватися на різних <a href="https://delta.chat/chatmail">сумісних chatmail-серверах</a> які є мінімальними поштовими серверами, оптимізованими для швидкої та безпечної роботи. Або ви можете використовувати класичні поштові сервери та існуючий профіль електронної пошти в цьому випадку Delta Chat буде працювати як поштовий додаток.</p>
|
||||
|
||||
<p><img style="float:right; width:50%; max-width:360%; margin:1em;" src="../delta-what-optim.png" /></p>
|
||||
|
||||
@@ -155,7 +154,7 @@
|
||||
<p><a href="#security-audits">Аудитоване наскрізне шифрування</a> захищене від мережевих та серверних атак.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Вільне програмне забезпечення з відкритим вихідним кодом, як для додатків, так і для сервера. Побудовано на основі <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">Стандартів електронної пошти та інтернету</a>, <a href="https://xkcd.com/927/">щоб уникнути “синдрому ще одного стандарту (xkcd 927)”</a></p>
|
||||
<p>Вільне програмне забезпечення з відкритим вихідним кодом, як для додатків, так і для сервера. Побудовано на основі <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандартів електронної пошти та інтернету</a>, <a href="https://xkcd.com/927/">щоб уникнути “синдрому ще одного стандарту (xkcd 927)”</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -167,10 +166,18 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Якщо повідомлення приходить від невідомого контакту, воно відображається як <strong>запит</strong>.</p>
|
||||
|
||||
<ul>
|
||||
<li>Якщо повідомлення приходить від невідомого контакту, воно відображається як <strong>запит</strong>. ви потрібно прийняти запит, перш ніж ви зможете відповісти.</li>
|
||||
<li>Ви також можете “видалити” його, якщо ви не хочете зараз спілкуватися з ними. Це <em>не</em> видаляє повідомлення на сервері, лише на вашому пристрої. Отже, ви можете як і раніше обробляти повідомлення в іншій поштовій програмі.</li>
|
||||
<li>Якщо ви видалите запит, майбутні повідомлення від цього контакту все одно відображатимуться як запит на повідомлення, щоб ви могли змінити свою думку. Якщо дуже не хочеться отримувати повідомлення від цієї особи, подумайте про її <em>блокування</em>.</li>
|
||||
<li>
|
||||
<p>ви потрібно прийняти запит, перш ніж ви зможете відповісти.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Ви також можете “видалити” його, якщо ви не хочете зараз спілкуватися з ними.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Якщо ви видалите запит, майбутні повідомлення від цього контакту все одно відображатимуться як запит на повідомлення, щоб ви могли змінити свою думку. Якщо дуже не хочеться отримувати повідомлення від цієї особи, подумайте про її <em>блокування</em>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">
|
||||
@@ -270,6 +277,36 @@
|
||||
|
||||
<p>Щоб скористатися функціями, утримуйте натиснутою клавішу або клацніть правою кнопкою миші на чаті у списку чатів.</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
Як працюють “Збережені повідомлення”? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Збережені повідомлення</strong> - це чат, за допомогою якого ви можете легко запам’ятовувати та знаходити повідомлення.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>У будь-якому чаті натисніть і утримуйте повідомлення або клацніть правою кнопкою миші та виберіть <strong>Зберегти</strong>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Збережені повідомлення позначені символом <img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" /> поруч з міткою часу</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Пізніше відкрийте чат “Збережені повідомлення” - і ви побачите там збережені повідомлення. Натиснувши <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />, ви можете повернутися до початкового повідомлення в оригінальному чаті</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Нарешті, ви також можете використовувати “Зберегти повідомлення”, щоб робити <strong>особисті нотатки</strong> - відкрити чат, набрати щось, додати фотографію або голосове повідомлення тощо.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Оскільки “Збережені повідомлення” синхронізуються, вони можуть стати дуже зручними для передачі даних між пристроями</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Повідомлення залишаються збереженими, навіть якщо вони були відредаговані або видалені - чи то через <a href="#edit">відправника</a>, чи то через <a href="#delold">очищення пристрою</a>, чи то через <a href="#ephemeralmsgs">зникнення повідомлень інших чатів</a>.</p>
|
||||
|
||||
<h3 id="що-означає-зелена-точка">
|
||||
|
||||
|
||||
@@ -278,16 +315,40 @@
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Іноді ви можете бачити <strong>зелену крапку</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> поруч з аватаркою контакту. Це означає, що його <strong>недавно бачили</strong> протягом останніх 10 хвилин:</p>
|
||||
|
||||
<ul>
|
||||
<li>Починаючи з Delta Chat 1.34, ви іноді можете бачити “зелену крапку” поруч із аватаром контакту. Це означає, що контакт «нещодавно бачили».</li>
|
||||
<li>Детально: це означає, що за останні 10 хвилин Delta Chat бачив їх:</li>
|
||||
<li>або тому, що вони надіслали вам повідомлення безпосередньо,</li>
|
||||
<li>тому що вони написали щось групі, учасником якої є ви обоє,</li>
|
||||
<li>тому що вони надіслали вам сповіщення про прочитання повідомлення, яке ви написали,</li>
|
||||
<li>або тому, що вони надіслали дані до вашої програми Delta Chat за допомогою a <a href="#webxdc">приватна програма</a>.
|
||||
– Отже, це не онлайн-статус у реальному часі – і якщо хтось не відповідає відразу, навіть якщо вони, здаються, онлайн, не хвилюйтесь і дайте їм трохи простору ;-)
|
||||
– З іншого боку, інші не завжди «побачать, що ви онлайн». Якщо ви вимкнули сповіщення про прочитання, вони не побачать зелену крапку, доки ви не надішлете їм повідомлення або напишете у групу, до якої вони входять.</li>
|
||||
<li>або тому, що вони написали вам безпосередньо,</li>
|
||||
<li>тому що вони написали щось у групі, в якій ви обидва є учасниками,</li>
|
||||
<li>тому що вони надіслали вам квитанцію про прочитання повідомлення, яке ви написали,</li>
|
||||
<li>тому що вони відредагували або видалили повідомлення у спільному з вами чаті,</li>
|
||||
<li>або тому, що вони використовують <a href="#webxdc">app</a> у спільному з вами чаті.</li>
|
||||
</ul>
|
||||
|
||||
<p>Отже, це не онлайн статус в реальному часі - і якщо хтось не відповідає одразу, хоча здається, що вони онлайн, не хвилюйтеся і дайте їм трохи часу :)</p>
|
||||
|
||||
<p>З іншого боку, інші не завжди “бачать, що ви онлайн”. Якщо ви вимкнули звіти про прочитання, вони не побачать зелену крапку доки не буде виконано одну з вищезазначених умов.</p>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Виправлення помилок та видалення повідомлень після надсилання <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Ви можете редагувати текст ваших повідомлень після відправлення. Для цього натисніть на повідомлення довгим натисканням або правою кнопкою миші і виберіть <strong>Редагувати</strong> або <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Якщо ви випадково надіслали повідомлення, в тому ж меню виберіть <strong>Видалити</strong>, а потім <strong>Видалити для всіх</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Відредаговані повідомлення матимуть позначку “Відредаговано” поруч з міткою часу, видалені повідомлення будуть видалені без позначки в чаті. Сповіщення не надсилаються і відсутнє часове обмеження.</p>
|
||||
|
||||
<p>Зауважте, що початкове повідомлення все ще може бути отримане учасниками чату які могли вже відповісти, переслати, зберегти, зробити знімок екрану або іншим чином скопіювати повідомлення.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
@@ -400,7 +461,7 @@
|
||||
<p>Щоб увімкнути його, перейдіть до <strong>Видалити старі повідомлення → Видалити повідомлення з сервера</strong> в налаштуваннях «Чати та медіа». Ви можете встановити часові рамки між «Одразу» та «Через 1 рік». Усі електронні листи, отримані Delta Chat, будуть видалені з сервера після закінчення цього терміну.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Зауважте, що якщо ви використовуєте Delta Chat на кількох пристроях, вам слід залишити повідомлення на сервері, доки інший пристрій не зможе завантажити їх. У цьому випадку вам слід встановити для автоматичного видалення значення «через день» або щось подібне, залежно від того, як часто ви вмикаєте інший пристрій.</p>
|
||||
<p>Зверніть увагу, що якщо ви використовуєте Delta Chat на декількох пристроях, вам потрібно залишити повідомлення на сервері з достатнім проміжком часу щоб інші пристрої також могли їх завантажити.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -525,14 +586,14 @@ Push-сповіщення автоматично активуються для
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat - це безкоштовний децентралізований месенджер з відкритим вихідним кодом і вільним вибором сервера, але ми хочемо, щоб користувачі отримували надійну “миттєву доставку” повідомлень, як у додатках Whatsapp, Signal або Telegram, без попередніх запитань, які більше підходять для досвідчених користувачів або розробників.</p>
|
||||
<p>Delta Chat - це безкоштовний децентралізований месенджер з відкритим вихідним кодом і вільним вибором сервера, але ми хочемо, щоб користувачі отримували надійну “миттєву доставку” повідомлень, як у додатках WhatsApp, Signal або Telegram, без попередніх запитань, які більше підходять для досвідчених користувачів або розробників.</p>
|
||||
|
||||
<p>Зверніть увагу, що Delta Chat має <a href="#privacy-notifications">невелику систему push-повідомлень, що зберігає конфіденційність</a> яка забезпечує “миттєву доставку” повідомлень на всі chatmail-сервери включаючи потенційний <a href="https://delta.chat/chatmail#selfhosted">який ви можете налаштувати самостійно без нашого дозволу</a>. Ласкаво просимо до потужності сумісної та масової системи чат-пошти та електронної пошти :)</p>
|
||||
|
||||
<h2 id="шифрування-та-безпека">
|
||||
<h2 id="e2ee">
|
||||
|
||||
|
||||
Шифрування та безпека <a href="#шифрування-та-безпека" class="anchor"></a>
|
||||
Шифрування та безпека <a href="#e2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
@@ -545,10 +606,21 @@ Push-сповіщення автоматично активуються для
|
||||
|
||||
</h3>
|
||||
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> використовується для автоматичного встановлення наскрізного шифрування з контактами та груповими чатами.
|
||||
Autocrypt використовує обмежену і <a href="#openpgp-secure">безпечну підмножину стандарту OpenPGP</a>. Зашифровані наскрізним шифруванням повідомлення позначаються замком <img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" />.</p>
|
||||
<p>Delta Chat використовує [безпечну підмножину стандарту OpenPGP] (#openpgp-secure) для забезпечення автоматичного наскрізного шифрування за допомогою цих протоколів:</p>
|
||||
|
||||
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Протоколи Secure-Join</a> використовуються для створення чатів з гарантованим наскрізним шифруванням що захищає від мережевих атак і скомпрометованих серверів. Чати, відмічені зеленою галочкою <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> гарантують наскрізне шифрування повідомлень.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Використовуйте <a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a> щоб обмінюватися інформацією про налаштування шифрування, через сканування QR-коду або “посилання-запрошення”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://autocrypt.org">Autocrypt</a> використовується для автоматичного встановлення наскрізного шифрування між контактами і всіма учасниками групового чату.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>[Поширення контакту в чаті] (https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message) дозволяє отримувачам використовувати наскрізне шифрування з контактом.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Delta Chat не запитує, не публікує і не взаємодіє з будь-якими серверами ключів OpenPGP.</p>
|
||||
|
||||
<h3 id="whene2e">
|
||||
|
||||
@@ -558,102 +630,67 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Всі наскрізні зашифровані повідомлення мають навісний замок:</p>
|
||||
|
||||
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
|
||||
|
||||
<p>Наскрізне шифрування гарантується, якщо поруч із заголовком чату стоїть зелена галочка:</p>
|
||||
|
||||
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
|
||||
<p>Всі повідомлення в Delta Chat за замовчуванням <strong>наскрізно зашифровані</strong>. Починаючи з версії 2 Delta Chat (липень 2025 року) на наскрізних зашифрованих повідомленнях більше немає замків або інших подібних маркерів.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
<h3 id="чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">
|
||||
|
||||
|
||||
Як отримати гарантоване наскрізне шифрування та зелені галочки? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Чи можу я отримувати та надсилати пошту без наскрізного шифрування? <a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Якщо у вас є другий канал зв’язку з вашим партнером по чату, наприклад, відеочат або інший месенджер, ви можете згенерувати посилання-запрошення.</p>
|
||||
<p>Якщо ви використовуєте стандартні <a href="https://chatmail.at/relays">ретранслятори чату</a>, неможливо отримувати або надсилати повідомлення без наскрізного шифрування.</p>
|
||||
|
||||
<p>Якщо ви разом особисто, ви можете показати QR-код своєму співрозмовнику.</p>
|
||||
<p>Якщо ви створите профіль за допомогою класичного поштового сервера, ви зможете надсилати та отримувати повідомлення без наскрізного шифрування. Такі повідомлення без наскрізного шифрування позначаються значком електронної пошти <img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
Як створити чат з новим контактом? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ви можете надіслати посилання-запрошення через інший приватний чат, показати QR-код запрошення, коли ви знаходитесь поруч один з одним або під час відеодзвінка, або натиснути на “контакт”, яким ви поділилися в чаті.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Для <strong>Запрошення до групи</strong>, торкніться назви групи чату, щоб побачити список її учасників, і виберіть “QR-код запрошення”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Для <strong>прямих запрошень у чат 1:1</strong>, торкніться іконки QR-коду <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> на головному екрані програми Delta Chat.</p>
|
||||
<p>Для <strong>прямих запрошень у чат один-на-один</strong>, торкніться іконки QR-коду <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> на головному екрані програми Delta Chat.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Дозвольте вашому партнеру по чату відсканувати QR-зображення
|
||||
у своєму додатку Delta Chat, або натисніть “Копіювати” чи “Поділитися”, щоб створити посилання-запрошення і поділитися ним з вашим співрозмовником.</p>
|
||||
<p>Попросіть вашого партнера по чату відсканувати QR-зображення у своєму додатку Delta Chat, або натисніть “Копіювати” чи “Поділитися”, щоб створити посилання-запрошення і поділитися ним з вашим партнером по чату.</p>
|
||||
|
||||
<p>Тепер зачекайте, поки між обома пристроями <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">відбудеться обмін мережевими повідомленнями Secure-Join</a>.</p>
|
||||
<p>Тепер зачекайте, поки встановиться <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">наскрізне шифрування</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Якщо обидва пристрої онлайн, обидві сторони зрештою побачать (груповий або прямий) чат із зеленою галочкою <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> поруч із заголовком.</p>
|
||||
<p>Якщо обидві сторони онлайн, вони незабаром побачать (груповий або прямий) чат і можуть почати безпечно обмінюватися повідомленнями.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Якщо один з пристроїв не в мережі, зелені галочки з’являться пізніше, коли пристрій знову буде підключено до Інтернету а мережевий протокол Secure-Join буде завершено.</p>
|
||||
<p>Якщо одна зі сторін перебуває в офлайні або в поганій мережі, можливість спілкуватися в чаті затримується до відновлення з’єднання.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Вітаємо! Тепер ви автоматично використовуватимете гарантоване наскрізне шифрування з цим контактом, і ви обидва можете додавати один одного в групи, позначені зеленою галочкою <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />, таким чином автоматично поширюючи гарантоване наскрізне шифрування серед її членів.</p>
|
||||
<p>Вітаємо!
|
||||
Тепер ви автоматично використовуватимете наскрізне шифрування з цим контактом. Якщо ви додасте один одного в групи чату, наскрізне шифрування буде встановлено між усіма учасниками.</p>
|
||||
|
||||
<h3 id="e2eeguarantee">
|
||||
|
||||
|
||||
Що означає зелена галочка і “гарантоване наскрізне шифрування”? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
Що означає зелена галочка в профілі контакту? <a href="#e2eeguarantee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Назви чатів із зеленими галочками <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> означають, що всі повідомлення в чаті будуть наскрізно зашифровані і не можуть бути прочитані або змінені скомпрометованими поштовими серверами або інтернет-провайдерами.
|
||||
Приєднання до групових чатів із зеленими галочками безпечно поширює інформацію про шифрування (і зелені галочки) всіх учасників таким чином, що гарантує наскрізне шифрування в групі та між її учасниками.</p>
|
||||
|
||||
<p>Профілі контактів із зеленими галочками <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> означають, що повідомлення контакту наразі гарантовано зашифровані наскрізним шифруванням. Кожен контакт із зеленою галочкою або зробив пряме <a href="#howtoe2ee">QR-сканування</a> з вами або був представлений іншим контактом, позначеним зеленою галочкою. Знайомство відбувається автоматично під час додавання учасників до груп. Той, хто додає контакт до групи, позначеної зеленою галочкою, стає представником для тих учасників, які ще не знали про доданий контакт. У профілі контакту ви можете кілька разів натиснути на текст “Представлений …” поки не потрапите до того, з ким ви безпосередньо зробили <a href="#howtoe2ee">QR-сканування</a>.</p>
|
||||
|
||||
<p>Зверніть увагу, що в профілі контакту ви можете бачити і натискати рекомендувачів але в заголовку профілю немає зеленої галочки. Зазвичай це означає, що контакт <a href="#nocryptanymore">“надіслав повідомлення з іншого пристрою”</a>.</p>
|
||||
<p>У профілі контакту може відображатися зелена галочка <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> і рядок “Представлений”. Кожен контакт із зеленою галочкою або зробив пряме [QR-сканування] (#howtoe2ee) з вами або був представлений іншим контактом, позначеним зеленою галочкою. Знайомство відбувається автоматично під час додавання учасників до груп. Той, хто додає контакт із зеленою галочкою до групи, в якій є лише учасники із зеленою галочкою стає представником. У профілі контакту ви можете кілька разів натиснути на текст “Представлений …” поки не потрапите до того, з ким ви безпосередньо зробили [QR-сканування] (#howtoe2ee).</p>
|
||||
|
||||
<p>Для більш детального обговорення “гарантованого наскрізного шифрування” будь ласка, перегляньте <a href="https://securejoin.delta.chat/en/latest/new.html">Протоколи безпечного приєднання</a> і, зокрема, прочитайте про “Перевірені групи”, технічний термін того, що тут називається чатами з “зеленою галочкою” або “гарантованим наскрізним шифруванням”.</p>
|
||||
|
||||
<h3 id="nocryptanymore">
|
||||
|
||||
|
||||
Контакт “надіслав повідомлення з іншого пристрою”, що робити? <a href="#nocryptanymore" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ваш чат з контактом втратив гарантоване наскрізне шифрування. Зелену галочку було знято для цього чату та контакту, коли ви побачили це попередження. **Якщо ви вважаєте раптове зникнення гарантованого наскрізного шифрування несподіваним для цього контакту, не приймайте попередження! Замість цього зв’яжіться з контактом через другий канал наприклад, відеодзвінок, інший месенджер або телефонний дзвінок, щоб з’ясувати, що сталося.</p>
|
||||
|
||||
<p>Якщо ваш контакт дійсно спричинив втрату гарантованого наскрізного шифрування будь ласка, зверніться до наступних параграфів, щоб дізнатися про типові причини та способи їх усунення. Незважаючи на це, всі інші чати, позначені зеленою галочкою, залишаються гарантовано зашифрованими з кінця в кінець навіть якщо контакт є їхнім учасником.</p>
|
||||
|
||||
<p><strong>Ваш контакт використовує Delta Chat на другому пристрої (телефоні або ноутбуці)</strong>.</p>
|
||||
|
||||
<p>Якщо у них є інший пристрій із запущеним додатком Delta Chat, вони повинні видалити обліковий запис з нового пристрою і додати його <a href="#multiclient">як другий пристрій, як описано тут</a>. Як тільки вони напишуть вам повідомлення, попередження зникне і гарантоване шифрування буде встановлено на обох пристроях вашого контакту.</p>
|
||||
|
||||
<p><strong>Ваш контакт перевстановив Delta Chat, використовуючи свій старий логін</strong></p>
|
||||
|
||||
<p>Якщо у них є <a href="#backup">файл резервної копії</a>, вони повинні видалити обліковий запис з нового пристрою і, замість цього, імпортувати файл резервної копії для відновлення свого облікового запису. Як тільки вони напишуть вам повідомлення, попередження зникне і гарантоване шифрування буде відновлено для цього контакту.</p>
|
||||
|
||||
<p>Якщо у них немає резервної копії файлу, найкраще виконати <a href="#howtoe2ee">QR-сканування</a> з вашим співрозмовником, щоб відновити гарантоване кінцеве шифрування.</p>
|
||||
|
||||
<p><strong>Ваш контакт надіслав листа через веб-інтерфейс або іншу поштову програму і незабаром повернеться до використання Delta Chat.</strong></p>
|
||||
|
||||
<p>Якщо ви впевнені, що контакт іноді користується веб-поштою, або іншу поштову програму без наскрізного шифрування, ви можете прийняти попередження. Як тільки ваш контакт знову скористається Delta Chat, гарантоване наскрізне шифрування буде автоматично відновлено.</p>
|
||||
|
||||
<p><strong>Ваш контакт повністю припинив користуватися Delta Chat</strong>.</p>
|
||||
|
||||
<p>Іноді залишатися на зв’язку важливіше, ніж наскрізне шифрування. <a href="#tls">“Шифрування на транспортному рівні” (TLS)</a> все ще може ефективно захищати конфіденційність ваших повідомлень між вашим пристроєм і сервером електронної пошти. Але без наскрізного шифрування ви та ваш контакт довіряєте серверу електронної пошти не читати і не маніпулювати вашими повідомленнями, а також не передавати їх третім особам.</p>
|
||||
|
||||
<p>У будь-якому випадку, ви не можете зробити нічого іншого, окрім як прийняти попередження. Будь ласка, також видаліть контакт з будь-якої активної групи, позначеної зеленою галочкою які ви можете знайти в розділі “Загальні чати” в профілі контакту. Це позбавить ваш контакт від отримання “нечитабельних” повідомлень.</p>
|
||||
|
||||
<p>Якщо контакт видалив Delta Chat через помилки або небажану поведінку, будь ласка, розгляньте можливість написати повідомлення на нашому <a href="https://support.delta.chat">форумі підтримки</a> щоб допомогти нам виявити та вирішити загальні проблеми. Дякуємо!</p>
|
||||
|
||||
<h3 id="чи-зашифровані-наскрізно-вкладення-зображення-файли-аудіо-тощо">
|
||||
|
||||
|
||||
@@ -674,7 +711,7 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Так, Delta Chat використовує безпечну підмножину OpenPGP і відображає індикатор безпеки у вигляді замка в повідомленні лише тоді, коли все повідомлення належним чином зашифровано і підписано. Наприклад, “Відокремлені підписи” не вважаються безпечними.</p>
|
||||
<p>Так, Delta Chat використовує безпечну підмножину OpenPGP яка вимагає, щоб все повідомлення було належним чином зашифровано і підписано. Наприклад, “відокремлені підписи” не вважаються безпечними.</p>
|
||||
|
||||
<p>OpenPGP сам по собі не є небезпечним. Більшість публічно обговорюваних проблем безпеки OpenPGP насправді виникають через недостатню зручність використання або погану реалізацію інструментів чи програм (або обох).
|
||||
Особливо важливо розрізняти OpenPGP, стандарт шифрування IETF, і GnuPG (GPG), інструмент командного рядка, що реалізує OpenPGP.
|
||||
@@ -707,19 +744,17 @@ Delta Chat скоріше використовує реалізацію OpenPGP
|
||||
|
||||
<p>Delta Chat також ніколи не був вразливим до EFAIL-атаки “Пряма ексфільтрація” тому що він розшифровує лише “багатокомпонентні/зашифровані” повідомлення, які містять рівно одну зашифровану і підписану частину, як визначено специфікацією Autocrypt Level 1.</p>
|
||||
|
||||
<h3 id="tls">
|
||||
<h3 id="чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls">
|
||||
|
||||
|
||||
Чи буде показано повідомлення відкритим текстом, якщо наскрізне шифрування недоступне? <a href="#tls" class="anchor"></a>
|
||||
Чи повідомлення, позначені значком пошти, доступні в Інтернеті?{#tls} <a href="#чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Навіть якщо ваші повідомлення не гарантовано зашифровані наскрізним шифруванням, вони все одно захищені від інтернет-провайдерів, таких як мобільні або кабельні компанії. Однак, ваші провайдери та провайдери електронної пошти одержувача можуть читати, аналізувати або навіть змінювати ваші повідомлення, включаючи будь-які вкладення, якщо вони не зашифровані наскрізним шифруванням.</p>
|
||||
<p>Якщо ви надсилаєте або отримуєте електронні листи без наскрізного шифрування (використовуючи класичний сервер електронної пошти), вони все одно захищені від мобільних або кабельних компаній, які не можуть читати чи змінювати ваші повідомлення. Однак як ваш, так і поштовий провайдер одержувача можуть читати, аналізувати або змінювати ваші листи, включаючи будь-які вкладення.</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>
|
||||
|
||||
<p>Зверніть увагу, що <a href="#howtoe2ee">підтримка гарантованого наскрізного шифрування</a>, на додаток до шифрування TLS, забезпечує повну безпеку між вашим пристроєм і пристроєм одержувача. Навіть ваш провайдер електронної пошти або інтернет-провайдер не зможуть прочитати або змінити ваші повідомлення.</p>
|
||||
|
||||
<h3 id="message-metadata">
|
||||
|
||||
@@ -729,20 +764,23 @@ Delta Chat скоріше використовує реалізацію OpenPGP
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Delta Chat захищає більшість метаданих повідомлень, поміщаючи наступну інформацію в наскрізно зашифровану частину повідомлень:</p>
|
||||
<p>На відміну від більшості інших месенджерів, додатки Delta Chat не зберігають жодних метаданих про контакти чи групи на серверах, навіть у зашифрованому вигляді. Натомість усі метадані груп наскрізно зашифровані та зберігаються виключно на пристроях користувачів.</p>
|
||||
|
||||
<p>Тому поштові сервери можуть бачити лише</p>
|
||||
|
||||
<ul>
|
||||
<li>Тема повідомлення</li>
|
||||
<li>Аватар та назва групи</li>
|
||||
<li>Запити MDN (підтвердження прочитання) (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
|
||||
<li>Таймер зникнення повідомлень (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
|
||||
<li><code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed-Member-Added</code>.</li>
|
||||
<li>Заголовок <code class="language-plaintext highlighter-rouge">Secure-Join</code>, що містить команди безпечного приєднання</li>
|
||||
<li>Сповіщення про увімкнення потокового передавання місцезнаходження</li>
|
||||
<li>URL-адреса кімнати WebRTC</li>
|
||||
<li>
|
||||
<p>дату повідомлення,</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>адреси відправника та одержувача</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>і розмір повідомлення.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Поштові сервери не мають доступу до цих захищених метаданих але вони бачать дату і розмір повідомлення, і, що важливіше, адреси відправника та отримувача. Поштовим серверам потрібні адреси одержувачів, щоб маршрутизувати і доставляти повідомлення на пристрої одержувача.</p>
|
||||
<p>Усі інші метадані повідомлень, контактів і груп містяться в наскрізно зашифрованій частині повідомлень.</p>
|
||||
|
||||
<h3 id="device-seizure">
|
||||
|
||||
@@ -752,62 +790,21 @@ Delta Chat скоріше використовує реалізацію OpenPGP
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Як для захисту від поштових серверів, що збирають метадані, так і для захисту від загрози вилучення пристрою ми рекомендуємо використовувати оптимізований для Delta Chat <a href="https://delta.chat/serverguide">екземпляр поштового сервера</a> для створення псевдонімних тимчасових акаунтів за допомогою сканування QR-коду. Зверніть увагу, що додатки Delta Chat на всіх платформах підтримують кілька облікових записів тому ви можете легко використовувати “1-тижневі” або “1-місячні” акаунти поруч з вашим “основним” акаунтом знаючи, що всі дані тимчасових акаунтів разом з усіма метаданими будуть видалені. Більше того, якщо пристрій вилучається, то контакти, які використовують тимчасові електронні скриньки, не можуть бути легко ідентифіковані, на відміну від месенджерів, які розкривають телефонні номери в групах чату, які, в свою чергу, часто пов’язані з юридичними особами.</p>
|
||||
<p>Для захисту як від серверів електронної пошти, що збирають метадані, так і від загрози вилучення пристрою, ми рекомендуємо використовувати <a href="https://chatmail.at/relays">чатмейл-релей</a> для створення чат-профілів із випадковими адресами електронної пошти для передавання повідомлень. Зверніть увагу, що додатки Delta Chat на всіх платформах підтримують кілька профілів, тому ви можете легко користуватися профілями, створеними для конкретних ситуацій, поруч із вашим «основним» профілем, з упевненістю, що всі їхні дані, включно з усіма метаданими, буде видалено. Більше того, у разі вилучення пристрою ідентифікувати чат-контакти, які використовують короткочасні профілі, буде вкрай складно.</p>
|
||||
|
||||
<h3 id="як-перевірити-інформацію-про-шифрування">
|
||||
<h3 id="sealedsender">
|
||||
|
||||
|
||||
Як перевірити інформацію про шифрування? <a href="#як-перевірити-інформацію-про-шифрування" class="anchor"></a>
|
||||
Чи підтримує Delta Chat функцію “Запечатаний відправник”? <a href="#sealedsender" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ви можете перевірити стан наскрізного шифрування вручну в діалоговому вікні “Шифрування” (профіль користувача на Android/iOS або клацніть правою кнопкою миші на елементі списку чату користувача на робочому столі). Delta Chat показує там два відбитки. Якщо на вашому пристрої та пристрої вашого співрозмовника з’являються однакові відбитки, з’єднання безпечне.</p>
|
||||
|
||||
<h3 id="як-перевірити-стан-шифрування-повідомлень">
|
||||
|
||||
|
||||
Як перевірити стан шифрування повідомлень? <a href="#як-перевірити-стан-шифрування-повідомлень" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
<p>Ні, поки ще ні.</p>
|
||||
|
||||
<p>Маленький <strong>замок</strong> в бульбашці повідомлення позначає, що повідомлення було належним чином наскрізно зашифроване від відправника. Якщо <strong>немає замка</strong>, повідомлення не було належним чином наскрізно зашифровано, найімовірніше, тому що відправник використовує додаток або інтерфейс веб-пошти без підтримки кінцевого шифрування.</p>
|
||||
|
||||
<h3 id="чому-я-бачу-незашифровані-повідомлення">
|
||||
|
||||
|
||||
Чому я бачу незашифровані повідомлення? <a href="#чому-я-бачу-незашифровані-повідомлення" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
<p>Месенджер Signal запровадив [“Запечатаного відправника” у 2018 році] (https://signal.org/blog/sealed-sender/) щоб їхня серверна інфраструктура не знала, хто надсилає повідомлення певній групі одержувачів. Це особливо важливо, оскільки сервер Signal знає номер мобільного телефону кожного акаунта, який зазвичай асоціюється з паспортними даними.</p>
|
||||
|
||||
<p>Якщо контакт використовує поштову програму, яка не підтримує Autocrypt всі повідомлення за участю цього контакту (в групі або чаті 1:1) не будуть наскрізно зашифровані, а отже, не показуватимуть “висячого замка” з повідомленнями. Зверніть увагу, що навіть якщо ваші контакти використовують Delta Chat у своєму акаунті, вони також можуть використовувати програму електронної пошти без функції шифрування, що може спричинити періодичні незашифровані повідомлення. Відповідати незашифрованими на незашифровані повідомлення вимагає Autocrypt щоб запобігти отриманню нечитабельних повідомлень на стороні ваших контактів та їхніх поштових програм, які не підтримують Autocrypt.</p>
|
||||
|
||||
<h3 id="як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt">
|
||||
|
||||
|
||||
Як я можу отримати наскрізно зашифрований чат з контактом Delta Chat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt? <a href="#як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Якщо вам потрібен безпечний наскрізно зашифрований чат з контактом який використовує свій акаунт як у Delta Chat, так і в інших додатках (наприклад, веб-пошті), що не підтримують автошифрування, найкраще налаштувати <a href="#howtoe2ee">гарантоване наскрізне шифрування з ними</a>, а потім створити груповий чат з гарантованим наскрізним шифруванням, учасниками якого будете ви двоє. У цьому груповому чаті всі повідомлення будуть наскрізно зашифровані навіть якщо в прямому чаті між вами буде <a href="#nocryptanymore">“… надіслано повідомлення з іншого пристрою”</a>.</p>
|
||||
|
||||
<h3 id="як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень">
|
||||
|
||||
|
||||
Як забезпечити наскрізне шифрування та видалення повідомлень? <a href="#як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Найкращий спосіб забезпечити наскрізне шифрування кожного повідомлення, а метадані видалялися якнайшвидше, це <a href="#howtoe2ee">використання чатів з гарантованим наскрізним шифруванням</a>
|
||||
та увімкнення <a href="#ephemeralmsgs">зникаючих повідомлень</a>.</p>
|
||||
|
||||
<p>Гарантований наскрізно шифрований чат захищає від <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM-атак</a>, а увімкнення функції зникнення повідомлень видаляє повідомлення на сервері через певний час, налаштований користувачем.</p>
|
||||
|
||||
<p>Якщо вам не потрібне більш довготривале зберігання копій ваших повідомлень на сервері, ви також можете увімкнути <a href="#delold">“автоматично видаляти повідомлення з сервера”</a>.</p>
|
||||
<p>Навіть якщо <a href="https://chatmail.at/relays">чат-мейл релей</a> не запитує ніяких приватних даних (в тому числі номерів телефонів), все одно може мати сенс захистити реляційні метадані між адресами. Ми не передбачаємо великих проблем у використанні випадкових одноразових адрес електронної пошти для запечатаних відправлень але реалізація такої можливості ще не є пріоритетною.</p>
|
||||
|
||||
<h3 id="pfs">
|
||||
|
||||
@@ -817,23 +814,33 @@ Delta Chat скоріше використовує реалізацію OpenPGP
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ні, Delta Chat не підтримує ідеальну пряму секретність (PFS). Це означає, що якщо ваш приватний ключ дешифрування Delta Chat витік, і хтось зібрав ваші попередні транзитні повідомлення, він зможе розшифрувати і прочитати їх за допомогою витоку ключа розшифрування.</p>
|
||||
<p>Ні, поки ще ні.</p>
|
||||
|
||||
<p>Зауважте, однак, що якщо хтось отримає ваші ключі розшифрування, вони, як правило, також зможуть отримати ваші повідомлення, незалежно від того, чи працює Perfect Forward Secrecy чи ні. Типовою реальною ситуацією для витоку ключів дешифрування є вилучення пристрою яку ми обговорюємо в нашій відповіді <a href="#device-seizure">про метадані та вилучення пристрою</a>.</p>
|
||||
<p>Delta Chat наразі не підтримує ідеальну пряму секретність (Perfect Forward Secrecy, PFS). Це означає, що якщо ваш приватний ключ для розшифрування буде скомпрометовано, а хтось заздалегідь зібрав ваші повідомлення під час передачі, він зможе розшифрувати та прочитати їх, використовуючи зламаний ключ. Зверніть увагу, що пряма секретність підвищує рівень безпеки лише в тому разі, якщо ви видаляєте повідомлення. Інакше, якщо хтось отримує доступ до ваших ключів розшифрування, він зазвичай також має доступ до всіх ваших невидалених повідомлень і навіть не потребує розшифровувати заздалегідь перехоплені дані.</p>
|
||||
|
||||
<p>Можливо, що Delta Chat розвивається для підтримки Perfect Forward Secrecy, тому що OpenPGP - це лише контейнер для зашифрованих повідомлень, але керування ключами шифрування (і, відповідно, ротація ключів або “храповик” ключів) може бути організоване у гнучкий спосіб. Дивіться <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">Прототип PFS від Seqouia</a> щодо існуючих експериментів у спільноті реалізаторів OpenPGP.</p>
|
||||
<p>Ми розробили підхід Forward Secrecy, який витримав початкову експертизу від деяких криптографів та експертів з реалізації але чекає на більш офіційний звіт щоб переконатися, що він надійно працює в об’єднаних системах обміну повідомленнями та при використанні декількох пристроїв, перш ніж його можна буде реалізувати в <a href="https://github.com/chatmail/core">ядрі чату</a>, що зробить його доступним у всіх <a href="https://chatmail.at/clients">клієнтах чату</a>.</p>
|
||||
|
||||
<h3 id="чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal">
|
||||
<h3 id="pqc">
|
||||
|
||||
|
||||
Чи є наскрізне шифрування Delta Chat таким же безпечним, як Signal? <a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal" class="anchor"></a>
|
||||
Чи підтримує Delta Chat пост-квантову криптографію? <a href="#pqc" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Це залежить від того, що для вас важливо. Delta Chat <a href="#pfs">не підтримує PFS</a>, як Signal але він забезпечує <a href="#e2eeguarantee">гарантовано наскрізні зашифровані чати</a> які захищені від скомпрометованих серверів або пошкоджених мереж. Signal та більшість інших месенджерів, що підтримують PFS, не надають практичної схеми захисту чат-груп від мережевих атак які, можливо, викликають більше занепокоєння ніж потенційний зловмисник, який заволодіє вашим телефоном і приватними налаштуваннями шифрування, але чомусь не ваші повідомлення, але має повний запис усіх минулих зашифрованих повідомлень.</p>
|
||||
<p>Ні, поки ще ні.</p>
|
||||
|
||||
<p>У будь-якому випадку, наскрізне шифрування Delta Chat використовує <a href="#openpgp-secure">безпечну підмножину OpenPGP</a> який пройшов <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">незалежний аудит безпеки</a>.</p>
|
||||
<p>Delta Chat використовує бібліотеку Rust OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a> яка підтримує останню версію <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>. Ми плануємо додати підтримку PQC у <a href="https://github.com/chatmail/core">chatmail core</a> після того, як проект буде завершено у IETF у співпраці з іншими розробниками OpenPGP.</p>
|
||||
|
||||
<h3 id="як-я-можу-вручну-перевірити-інформацію-про-шифрування">
|
||||
|
||||
|
||||
Як я можу вручну перевірити інформацію про шифрування? <a href="#як-я-можу-вручну-перевірити-інформацію-про-шифрування" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Ви можете перевірити стан наскрізного шифрування вручну в діалоговому вікні “Шифрування” (профіль користувача на Android/iOS або клацніть правою кнопкою миші на елементі списку чату користувача на робочому столі). Delta Chat показує там два відбитки. Якщо на вашому пристрої та пристрої вашого співрозмовника з’являються однакові відбитки, з’єднання безпечне.</p>
|
||||
|
||||
<h3 id="importkey">
|
||||
|
||||
@@ -843,29 +850,11 @@ Delta Chat скоріше використовує реалізацію OpenPGP
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Так.
|
||||
The best way is to send an Autocrypt Setup Message from the other e-mail client.
|
||||
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
|
||||
<p>Ні.</p>
|
||||
|
||||
<p>Крім того, ви можете імпортувати ключ вручну в “Налаштування -> Додаткові налаштування -> Імпорт секретних ключів”. Застереження: Переконайтеся, що ключ не захищено паролем, або видаліть його заздалегідь.</p>
|
||||
<p>Delta Chat генерує безпечні ключі OpenPGP відповідно до специфікації Autocrypt 1.1. Ви можете експортувати свій приватний ключ, але не можете імпортувати додаткові приватні ключі.</p>
|
||||
|
||||
<p>Якщо у вас немає ключа або ви навіть не знаєте, що він вам знадобиться – не хвилюйтеся: Delta Chat генерує ключі в міру необхідності, вам не потрібно натискати кнопку для цього.</p>
|
||||
|
||||
<h3 id="я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat">
|
||||
|
||||
|
||||
Я не можу імпортувати свій існуючий PGP ключ у Delta Chat. <a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Найімовірнішою причиною є те, що ваш ключ зашифрований та/або використовується пароль. Такі ключі не підтримуються Delta Chat. Ви можете видалити шифрування парольної фрази та пароль і спробувати імпорт знову.</p>
|
||||
|
||||
<p>Ще одна поширена помилка – неправильне закінчення файлу. Використовуйте захищений формат ASCII і закінчення файлу <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
|
||||
|
||||
<p>Delta Chat підтримує поширені формати приватних ключів OpenPGP, однак навряд чи приватні ключі з усіх джерел будуть повністю підтримуватися. Це не головна мета Delta Chat. Фактично, більшість нових користувачів не матимуть жодного ключа до використання Delta Chat. Однак ми намагаємось підтримувати приватні ключі з якомога більшої кількості джерел.</p>
|
||||
|
||||
<p>Видалення пароля з приватного ключа буде залежати від програмного забезпечення, яке використовується для управління ключами PGP. За допомогою Enigmail ви можете встановити для порожній пароль у вікні Керування ключами. За допомогою GnuPG ви можете встановити його <a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">через командний рядок</a>. Для інших програм ви зможете знайти рішення в інтернеті.</p>
|
||||
<p>Загалом, ми не рекомендуємо і не пропонуємо користувачам керувати ключами вручну. Ми хочемо гарантувати, що аудит безпеки може зосередитися на декількох перевірених криптографічних алгоритмах а не на всій широті можливих алгоритмів, дозволених у OpenPGP.</p>
|
||||
|
||||
<h3 id="security-audits">
|
||||
|
||||
@@ -921,7 +910,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Так. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
|
||||
<p>Так. You can use the same profile on different devices:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -970,6 +959,9 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
<li>
|
||||
<p><strong>Гостьові мережі</strong> можуть не дозволяти пристроям зв’язуватися один з одним. Якщо можливо, використовуйте негостьову мережу.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Якщо у вас все ще виникають проблеми з використанням однієї мережі, спробуйте відкрити <strong>Мобільну точку доступу</strong> на одному пристрої та приєднатися до цього Wi-Fi з іншого</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Переконайтеся, що на цільовому пристрої <strong>достатньо пам’яті</strong></p>
|
||||
</li>
|
||||
@@ -977,7 +969,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
<p>Якщо передача почалася, переконайтеся, що пристрої <strong>залишаються активними</strong> і не засинають. Не виходьте з Delta Chat. (ми докладаємо всіх зусиль, щоб програма працювала у фоновому режимі, але <a href="https://dontkillmyapp.com">системи, як правило, вбивають програми</a>, на жаль)</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Delta Chat <strong>уже ввійшов</strong> на цільовому пристрої? Ви можете використовувати кілька облікових записів на одному пристрої, просто <a href="#multiple-accounts">додайте інший обліковий запис</a></p>
|
||||
<p>Delta Chat <strong>вже зареєстрований</strong> на цільовому пристрої? Ви можете використовувати кілька профілів на одному пристрої, просто <a href="#multiple-accounts">додайте ще один профіль</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Якщо у вас усе ще виникають проблеми або якщо ви <strong>не можете відсканувати QR-код</strong> спробуйте <strong>перенесення вручну</strong>, описане нижче</p>
|
||||
@@ -995,15 +987,26 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
<p>Цей спосіб рекомендований, лише якщо «Додати другий пристрій», як описано вище, не працює.</p>
|
||||
|
||||
<ul>
|
||||
<li>На старому пристрої перейдіть до “Налаштування -> Чати та медіа -> Експортувати резервну копію”. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати Резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</li>
|
||||
<li>На новому пристрої на екрані входу замість того, щоб увійти до свого облікового запису електронної пошти, виберіть “Імпортувати резервну копію” виберіть “Імпортувати резервну копію”. Після імпорту ваші листування, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.
|
||||
<ul>
|
||||
<li>Якщо ви користуєтеся iOS:** і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізно зашифрованих повідомлень зі своїми партнерами по спілкуванню.</li>
|
||||
<li>На старому пристрої перейдіть до “Налаштування -> Чати та медіа -> Експортувати резервну копію”. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</li>
|
||||
<li>На новому пристрої в меню “У мене вже є профіль” виберіть “Відновити з резервної копії”. Після імпорту ваші розмови, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.</li>
|
||||
<li>Якщо ви користуєтеся iOS:** і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
|
||||
<li>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізних зашифрованих повідомлень зі своїми партнерами по спілкуванню.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="чи-синхронізовані-видалення-закріплення-архівування-збереження-вимкнення-сповіщень-тощо-з-усіма-пристроями">
|
||||
|
||||
|
||||
Чи синхронізовані видалення, закріплення, архівування, збереження, вимкнення сповіщень тощо з усіма пристроями? <a href="#чи-синхронізовані-видалення-закріплення-архівування-збереження-вимкнення-сповіщень-тощо-з-усіма-пристроями" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Так.</p>
|
||||
|
||||
<p>Якщо ви, наприклад, видалите чат або повідомлення з телефону, воно буде видалено на вашому робочому столі, щойно ви знову з’явитесь в мережі.</p>
|
||||
|
||||
<p>Винятком є <a href="#delold">Видалення старих повідомлень з пристрою</a>, оскільки різні пристрої можуть мати різний обсяг пам’яті, а також системні налаштування звуків сповіщень.</p>
|
||||
|
||||
<h3 id="чи-планується-впровадження-веб-клієнта-delta-chat">
|
||||
|
||||
|
||||
@@ -1038,9 +1041,12 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
<ul>
|
||||
<li>Додатки webxdc не можуть надсилати дані в Інтернет або завантажувати щось.</li>
|
||||
<li>Програма webxdc може обмінюватися даними лише в межах чату Delta Chat з її копіями на пристроях ваших партнерів по чату. В іншому, вони повністю ізольовані від Інтернету.</li>
|
||||
<li>Програма webxdc може обмінюватися даними лише в межах чату Delta Chat з її копіями на пристроях ваших партнерів по чату. В іншому, вона повністю ізольована від Інтернету.</li>
|
||||
<li>Конфіденційність, яку пропонує додаток webxdc, є конфіденційністю вашого чату - доки ви довіряєте людям, з якими ви спілкуєтеся, ви можете довіряти і додатку webxdc.</li>
|
||||
<li>Це також означає, що відкриття додатків webxdc в чатах, де ви не довіряєте учасникам, як ви знаєте з вкладень в електронній пошті, де ви відкриваєте вкладення тільки від відправників, яким довіряєте, а не від спамерів.</li>
|
||||
<li>Це також означає, що відкриття додатків у чатах з користувачами, яким ви не довіряєте, може становити ризик для конфіденційності.
|
||||
Так само, як і з вкладеннями електронної пошти, відеодзвінками або звичайними посиланнями:
|
||||
відкривайте їх лише від відправників, яким ви довіряєте, а не від спамерів.
|
||||
Спамери можуть дізнатися будь-які дані, які ви їм надсилаєте, а також вашу IP-адресу.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="де-я-можу-отримати-webxdc-додатки">
|
||||
@@ -1108,13 +1114,9 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>За допомогою списку розсилки ви можете надіслати повідомлення багатьом одержувачам одночасно; коли вони відповідають вам, ви отримуєте відповідь у своєму прямому чаті 1:1 з ними. Одержувачі не бачать один одного.</li>
|
||||
<li>Технічно це електронний лист із багатьма одержувачами в BCC.</li>
|
||||
<li>Ви можете ввімкнути функцію в розділі «експериментальні функції» в розширених налаштуваннях. Потім ви можете створити список трансляцій у діалоговому вікні «Новий чат».</li>
|
||||
<li>Якщо ви використовуєте більше ніж один пристрій, списки трансляцій наразі не синхронізуються між ними.</li>
|
||||
<li>Повідомлення, надіслані до списків розсилки, не шифруються. Шифрування порушило б анонімність, оскільки тоді всі одержувачі знали б, хто ще його отримав (надсилання окремих листів усім було б гіршим через обмеження швидкості та споживання мережі).</li>
|
||||
</ul>
|
||||
<p>За допомогою списку розсилки ви можете надіслати повідомлення одразу багатьом одержувачам;
|
||||
одержувачі не можуть відповідати у цьому списку.
|
||||
Списки розсилки все ще дуже експериментальні і, ймовірно, будуть замінені чимось іншим, слідкуйте за новинами :)</p>
|
||||
|
||||
<h3 id="як-я-можу-поділитися-своїм-місцезнаходженням-зі-своїми-співрозмовниками-в-чаті">
|
||||
|
||||
@@ -1152,17 +1154,22 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
<p>У цьому випадку Delta Chat не потрібно стежити за папкою «Вхідні», а достатньо лише стежити за папкою DeltaChat.</p>
|
||||
|
||||
<h3 id="як-я-можу-змінити-мій-обліковий-запис-на-іншу-адресу-електронної-пошти">
|
||||
<h3 id="як-я-можу-використовувати-іншу-адресу-електронної-пошти-у-своєму-профілі">
|
||||
|
||||
|
||||
Як я можу змінити мій обліковий запис на іншу адресу електронної пошти? <a href="#як-я-можу-змінити-мій-обліковий-запис-на-іншу-адресу-електронної-пошти" class="anchor"></a>
|
||||
Як я можу використовувати іншу адресу електронної пошти у своєму профілі? <a href="#як-я-можу-використовувати-іншу-адресу-електронної-пошти-у-своєму-профілі" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Примітка:
|
||||
Зміна адреси електронної пошти тимчасово відключена
|
||||
через постійні зміни в ядрі DeltaChat.
|
||||
Ця функція буде знову доступна через кілька місяців.</p>
|
||||
|
||||
<ol>
|
||||
<li>
|
||||
<p>Змініть свою адресу в розділі “Налаштування → Додатково → Пароль та обліковий запис” та введіть пароль вашого нового облікового запису (і, за необхідності, налаштування сервера). Ви отримаєте інформаційне повідомлення про те, що ви переїжджаєте на нову адресу. Додаткове повідомлення також з’явиться у вашому чаті “Повідомлення пристрою”.</p>
|
||||
<p>Змініть свою адресу в розділі “Налаштування → Додатково → Пароль та обліковий запис” та введіть пароль вашого нового поштового акаунта (і, за необхідності, налаштування сервера). Ви отримаєте інформаційне повідомлення про те, що ви переїжджаєте на нову адресу. Додаткове повідомлення також з’явиться у вашому чаті “Повідомлення пристрою”.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Якщо можливо, нехай ваш старий провайдер електронної пошти пересилає всі повідомлення на вашу нову адресу.</p>
|
||||
@@ -1249,17 +1256,17 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
Проте для коректної роботи деяких провайдерів потрібні специфічні налаштування. Дивіться наш <a href="https://providers.delta.chat">огляд провайдерів</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 id="я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите">
|
||||
<h3 id="я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">
|
||||
|
||||
|
||||
Я хочу керувати власним сервером електронної пошти для Delta Chat. Що ви порадите? <a href="#я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите" class="anchor"></a>
|
||||
Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте? <a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Більшість поштових серверів працюватимуть добре. Але ми особисто рекомендуємо поєднання mailcow і mailadm, як описано <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">у цьому пості</a>.</li>
|
||||
<li>Ви можете знайти <a href="https://delta.chat/uk/serverguide">посібник із встановлення на нашому веб-сайті</a>.</li>
|
||||
<li>Більшість поштових серверів будуть працювати добре. Але ми особисто рекомендуємо використовувати сервер ретрансляції чатової пошти, як описано [в цій статті] (https://delta.chat/en/2023-12-13-chatmail).</li>
|
||||
<li>Ви можете знайти <a href="https://github.com/chatmail/relay">посібник зі встановлення на GitHub</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно">
|
||||
@@ -1272,7 +1279,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
<p>Як і інші поштові програми, такі як Thunderbird, K9-Mail або Outlook, програма програма потребує пароля, щоб ви могли використовувати її для надсилання листів. Звичайно, пароль пароль зберігається лише на вашому пристрої. Пароль передається лише вашому поштовому провайдеру (коли ви входите в систему), який і так має доступ до вашої пошти.</p>
|
||||
|
||||
<p>Оскільки Delta Chat має відкритий код, ви можете ознайомитись із <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">початковим кодом</a> якщо бажаєте перевірити що ваші дані для авторизації надійно зберігаються. Ми будемо раді вашим пропозиціям, які зроблять додаток більш безпечним для всіх користувачів.</p>
|
||||
<p>Оскільки Delta Chat має відкритий код, ви можете ознайомитись із <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">початковим кодом</a> якщо бажаєте перевірити що ваші дані для авторизації надійно зберігаються. Ми будемо раді вашим пропозиціям, які зроблять додаток більш безпечним для всіх користувачів.</p>
|
||||
|
||||
<h3 id="які-повідомлення-відображаються-у-delta-chat">
|
||||
|
||||
@@ -1351,17 +1358,17 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
<p>Деякі люди використовують Delta Chat як звичайний поштовий клієнт і хочуть використовувати папку Вхідні для своєї пошти замість папки DeltaChat. Якщо ви вимкнете “Перегляд папки DeltaChat”, вам слід також вимкнути “переміщення повідомлень чату до DeltaChat”.
|
||||
В іншому випадку видалення повідомлень або налаштування декількох пристроїв може не працювати належним чином.</p>
|
||||
|
||||
<h3 id="чи-сумісний-delta-chat-із-protonmail--tutanota--criptext">
|
||||
<h3 id="чи-сумісний-delta-chat-із-proton-mail--tutanota--criptext">
|
||||
|
||||
|
||||
Чи сумісний Delta Chat із Protonmail / Tutanota / Criptext? <a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext" class="anchor"></a>
|
||||
Чи сумісний Delta Chat із Proton Mail / Tutanota / Criptext? <a href="#чи-сумісний-delta-chat-із-proton-mail--tutanota--criptext" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Так і ні.</li>
|
||||
<li>Ні, ви не можете використовувати свій обліковий запис Protonmail, Tutanota або Criptext у Delta Chat; вони не пропонують отримання листів через IMAP.</li>
|
||||
<li>Ні, ви не можете використовувати свій обліковий запис Proton Mail, Tutanota або Criptext у Delta Chat; вони не пропонують отримання листів через IMAP.</li>
|
||||
<li>У будь-якому випадку, ви можете використовувати Delta Chat для надсилання повідомлень людям, які користуються Protonmail, Tutanota або Criptext. Ці повідомлення не будуть наскрізно зашифрованими. Наскрізне шифрування, яке пропонують ці провайдери, не є сумісним з <a href="https://autocrypt.org/">Autocrypt</a>, стандартним шифруванням, яке використовує Delta Chat.</li>
|
||||
<li>Delta Chat може наскрізно шифрувати через будь-якого провайдера електронної пошти з будь-якою <a href="https://autocrypt.org/dev-status.html">поштовою програмою з підтримкою автошифрування</a>.</li>
|
||||
</ul>
|
||||
@@ -1393,7 +1400,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>Дивіться <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</li>
|
||||
<li>Дивіться <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="де-мої-друзі-можуть-знайти-delta-chat">
|
||||
@@ -1455,7 +1462,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
завершення прив’язок Rust/Python та запуск екосистеми чат-ботів.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>У 2021 році ми отримали подальше фінансування ЄС для двох Інтернет-технологій наступного покоління пропозиції, а саме для <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - каталог перенесення електронної пошти</a> (~97 тис. євро) та <a href="https://nlnet.nl/project/EmailPorting/">AEAP - перенесення електронної адреси</a> (~90 тис. євро), що призвело до кращої підтримки кількох облікових записів, покращеного QR-коду контактів і налаштувань груп, а також багатьох покращень роботи мережі на всіх платформах.</p>
|
||||
<p>У 2021 році ми отримали подальше фінансування від ЄС на дві пропозиції щодо Інтернету наступного покоління а саме на <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - каталог перенесення провайдерів електронної пошти</a> (~97 тис. євро) та <a href="https://nlnet.nl/project/EmailPorting/">AEAP - перенесення адрес електронної пошти</a> (~90 тис. євро), що дозволило нам покращити багатопрофільну підтримку, вдосконалити налаштування контактів та груп за допомогою QR-коду та багато інших мережевих покращень на всіх платформах.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>З кінця 2021 до березня 2023 року ми отримували фінансування <em>Internet Freedom</em> (500 тис. дол. США) від Бюро США з питань демократії, прав людини та праці (DRL). Це фінансування підтримало наші довгострокові цілі зробити Delta Chat більш зручним для використання і сумісним з широким спектром серверів електронної пошти по всьому світу, більш стійким і безпечним в місцях, які постраждали від інтернет-цензури та відключення інтернету.</p>
|
||||
@@ -1483,4 +1490,4 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
|
||||
|
||||
</body></html>
|
||||
</body></html>
|
||||
@@ -6,7 +6,8 @@ public class DcChat {
|
||||
public static final int DC_CHAT_TYPE_SINGLE = 100;
|
||||
public static final int DC_CHAT_TYPE_GROUP = 120;
|
||||
public static final int DC_CHAT_TYPE_MAILINGLIST = 140;
|
||||
public static final int DC_CHAT_TYPE_BROADCAST = 160;
|
||||
public static final int DC_CHAT_TYPE_OUT_BROADCAST = 160;
|
||||
public static final int DC_CHAT_TYPE_IN_BROADCAST = 165;
|
||||
|
||||
public static final int DC_CHAT_NO_CHAT = 0;
|
||||
public final static int DC_CHAT_ID_ARCHIVED_LINK = 6;
|
||||
@@ -38,12 +39,12 @@ public class DcChat {
|
||||
public native String getMailinglistAddr();
|
||||
public native String getProfileImage ();
|
||||
public native int getColor ();
|
||||
public native boolean isEncrypted ();
|
||||
public native boolean isUnpromoted ();
|
||||
public native boolean isSelfTalk ();
|
||||
public native boolean isDeviceTalk ();
|
||||
public native boolean canSend ();
|
||||
public native boolean isProtected ();
|
||||
public native boolean isProtectionBroken();
|
||||
public native boolean isSendingLocations();
|
||||
public native boolean isMuted ();
|
||||
public native boolean isContactRequest ();
|
||||
@@ -53,19 +54,18 @@ public class DcChat {
|
||||
|
||||
public boolean isMultiUser() {
|
||||
int type = getType();
|
||||
return type == DC_CHAT_TYPE_GROUP || type == DC_CHAT_TYPE_MAILINGLIST || type == DC_CHAT_TYPE_BROADCAST;
|
||||
return type != DC_CHAT_TYPE_SINGLE;
|
||||
}
|
||||
|
||||
public boolean isMailingList() {
|
||||
return getType() == DC_CHAT_TYPE_MAILINGLIST;
|
||||
}
|
||||
|
||||
public boolean isBroadcast() {
|
||||
return getType() == DC_CHAT_TYPE_BROADCAST;
|
||||
public boolean isInBroadcast() {
|
||||
return getType() == DC_CHAT_TYPE_IN_BROADCAST;
|
||||
}
|
||||
|
||||
public boolean isHalfBlocked() {
|
||||
return isProtectionBroken() || isContactRequest();
|
||||
public boolean isOutBroadcast() {
|
||||
return getType() == DC_CHAT_TYPE_OUT_BROADCAST;
|
||||
}
|
||||
|
||||
// working with raw c-data
|
||||
|
||||
@@ -10,8 +10,9 @@ public class DcContact {
|
||||
public final static int DC_CONTACT_ID_NEW_GROUP = -2; // - " -
|
||||
public final static int DC_CONTACT_ID_ADD_MEMBER = -3; // - " -
|
||||
public final static int DC_CONTACT_ID_QR_INVITE = -4; // - " -
|
||||
public final static int DC_CONTACT_ID_NEW_BROADCAST_LIST = -5; // - " -
|
||||
public final static int DC_CONTACT_ID_NEW_BROADCAST = -5; // - " -
|
||||
public final static int DC_CONTACT_ID_ADD_ACCOUNT = -6; // - " -
|
||||
public final static int DC_CONTACT_ID_NEW_UNENCRYPTED_GROUP = -7; // - " -
|
||||
|
||||
public DcContact(long contactCPtr) {
|
||||
this.contactCPtr = contactCPtr;
|
||||
@@ -50,7 +51,6 @@ public class DcContact {
|
||||
public native String getAuthName ();
|
||||
public native String getDisplayName ();
|
||||
public native String getAddr ();
|
||||
public native String getNameNAddr ();
|
||||
public native String getProfileImage();
|
||||
public native int getColor ();
|
||||
public native String getStatus ();
|
||||
@@ -58,6 +58,7 @@ public class DcContact {
|
||||
public native boolean wasSeenRecently();
|
||||
public native boolean isBlocked ();
|
||||
public native boolean isVerified ();
|
||||
public native boolean isKeyContact ();
|
||||
public native int getVerifierId ();
|
||||
public native boolean isBot ();
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ public class DcContext {
|
||||
public final static int DC_EVENT_MSG_READ = 2015;
|
||||
public final static int DC_EVENT_CHAT_MODIFIED = 2020;
|
||||
public final static int DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED = 2021;
|
||||
public final static int DC_EVENT_CHAT_DELETED = 2023;
|
||||
public final static int DC_EVENT_CONTACTS_CHANGED = 2030;
|
||||
public final static int DC_EVENT_LOCATION_CHANGED = 2035;
|
||||
public final static int DC_EVENT_CONFIGURE_PROGRESS = 2041;
|
||||
@@ -38,6 +39,7 @@ public class DcContext {
|
||||
|
||||
public final static int DC_GCL_VERIFIED_ONLY = 1;
|
||||
public final static int DC_GCL_ADD_SELF = 2;
|
||||
public final static int DC_GCL_ADDRESS = 0x04;
|
||||
public final static int DC_GCL_ARCHIVED_ONLY = 0x01;
|
||||
public final static int DC_GCL_NO_SPECIALS = 0x02;
|
||||
public final static int DC_GCL_ADD_ALLDONE_HINT = 0x04;
|
||||
@@ -118,7 +120,6 @@ public class DcContext {
|
||||
public native void setStockTranslation (int stockId, String translation);
|
||||
public native String getBlobdir ();
|
||||
public native String getLastError ();
|
||||
public native void configure ();
|
||||
public native void stopOngoingProcess ();
|
||||
public native int isConfigured ();
|
||||
public native boolean open (String passphrase);
|
||||
@@ -144,7 +145,6 @@ public class DcContext {
|
||||
public native String getConnectivityHtml ();
|
||||
public native String getOauth2Url (String addr, String redirectUrl);
|
||||
public native String initiateKeyTransfer ();
|
||||
public native boolean continueKeyTransfer (int msg_id, String setup_code);
|
||||
public native void imex (int what, String dir);
|
||||
public native String imexHasBackup (String dir);
|
||||
public DcBackupProvider newBackupProvider () { return new DcBackupProvider(newBackupProviderCPtr()); }
|
||||
@@ -246,23 +246,6 @@ public class DcContext {
|
||||
return displayname;
|
||||
}
|
||||
|
||||
public boolean isCommunity() {
|
||||
return getConfigInt("is_community") == 1;
|
||||
}
|
||||
|
||||
public void setCommunityMode(boolean enable) {
|
||||
setConfig("is_community", enable? "1" : null);
|
||||
}
|
||||
|
||||
public String getCommunityUser() {
|
||||
String name = getConfig("ui.community.selfname");
|
||||
return name == null? "" : name;
|
||||
}
|
||||
|
||||
public void setCommunityUser(String name) {
|
||||
setConfig("ui.community.selfname", name);
|
||||
}
|
||||
|
||||
public boolean isChatmail() {
|
||||
return getConfigInt("is_chatmail") == 1;
|
||||
}
|
||||
|
||||
@@ -33,9 +33,9 @@ public class DcMsg {
|
||||
public final static int DC_INFO_LOCATION_ONLY = 9;
|
||||
public final static int DC_INFO_EPHEMERAL_TIMER_CHANGED = 10;
|
||||
public final static int DC_INFO_PROTECTION_ENABLED = 11;
|
||||
public final static int DC_INFO_PROTECTION_DISABLED = 12;
|
||||
public final static int DC_INFO_INVALID_UNENCRYPTED_MAIL = 13;
|
||||
public final static int DC_INFO_WEBXDC_INFO_MESSAGE = 32;
|
||||
public final static int DC_INFO_CHAT_E2EE = 50;
|
||||
|
||||
public final static int DC_STATE_UNDEFINED = 0;
|
||||
public final static int DC_STATE_IN_FRESH = 10;
|
||||
@@ -123,6 +123,7 @@ public class DcMsg {
|
||||
private native int getViewType ();
|
||||
public int getType () { return getDownloadState()==DC_DOWNLOAD_DONE? getViewType() : DC_MSG_TEXT; }
|
||||
public native int getInfoType ();
|
||||
public native int getInfoContactId ();
|
||||
public native int getState ();
|
||||
public native int getDownloadState ();
|
||||
public native int getChatId ();
|
||||
@@ -142,16 +143,16 @@ public class DcMsg {
|
||||
public native byte[] getWebxdcBlob (String filename);
|
||||
public JSONObject getWebxdcInfo () {
|
||||
try {
|
||||
return new JSONObject(getWebxdcInfoJson());
|
||||
String json = getWebxdcInfoJson();
|
||||
if (json != null && !json.isEmpty()) return new JSONObject(json);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
return new JSONObject();
|
||||
}
|
||||
return new JSONObject();
|
||||
}
|
||||
public native String getWebxdcHref ();
|
||||
public native boolean isForwarded ();
|
||||
public native boolean isInfo ();
|
||||
public native boolean isSetupMessage ();
|
||||
public native boolean hasHtml ();
|
||||
public native String getSetupCodeBegin ();
|
||||
public native String getVideochatUrl ();
|
||||
@@ -169,7 +170,6 @@ public class DcMsg {
|
||||
public native String getQuotedText ();
|
||||
public native String getError ();
|
||||
public native String getOverrideSenderName();
|
||||
public native int getSenderColor();
|
||||
public native boolean isEdited ();
|
||||
|
||||
public String getSenderName(DcContact dcContact) {
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
package com.b44t.messenger.rpc;
|
||||
|
||||
public class EnteredLoginParam {
|
||||
// Email address.
|
||||
private final String addr;
|
||||
|
||||
// Password.
|
||||
private final String password;
|
||||
|
||||
// ============ IMAP settings ============
|
||||
|
||||
// Server hostname or IP address.
|
||||
private final String imapServer;
|
||||
|
||||
// Server port.
|
||||
private final int imapPort;
|
||||
|
||||
// Socket security.
|
||||
private final SocketSecurity imapSecurity;
|
||||
|
||||
// Username.
|
||||
private final String imapUser;
|
||||
|
||||
// ============ SMTP settings ============
|
||||
|
||||
// Server hostname or IP address.
|
||||
private final String smtpServer;
|
||||
|
||||
// Server port.
|
||||
private final int smtpPort;
|
||||
|
||||
// Socket security.
|
||||
private final SocketSecurity smtpSecurity;
|
||||
|
||||
// Username.
|
||||
private final String smtpUser;
|
||||
|
||||
// SMTP Password. Only needs to be specified if different than IMAP password.
|
||||
private final String smtpPassword;
|
||||
|
||||
// TLS options: whether to allow invalid certificates and/or
|
||||
// invalid hostnames
|
||||
private final EnteredCertificateChecks certificateChecks;
|
||||
|
||||
// If true, login via OAUTH2 (not recommended anymore)
|
||||
private final boolean oauth2;
|
||||
|
||||
public EnteredLoginParam(String addr,
|
||||
String password,
|
||||
String imapServer,
|
||||
int imapPort,
|
||||
SocketSecurity imapSecurity,
|
||||
String imapUser,
|
||||
String smtpServer,
|
||||
int smtpPort,
|
||||
SocketSecurity smtpSecurity,
|
||||
String smtpUser,
|
||||
String smtpPassword,
|
||||
EnteredCertificateChecks certificateChecks,
|
||||
boolean oauth2) {
|
||||
this.addr = addr;
|
||||
this.password = password;
|
||||
this.imapServer = imapServer;
|
||||
this.imapPort = imapPort;
|
||||
this.imapSecurity = imapSecurity;
|
||||
this.imapUser = imapUser;
|
||||
this.smtpServer = smtpServer;
|
||||
this.smtpPort = smtpPort;
|
||||
this.smtpSecurity = smtpSecurity;
|
||||
this.smtpUser = smtpUser;
|
||||
this.smtpPassword = smtpPassword;
|
||||
this.certificateChecks = certificateChecks;
|
||||
this.oauth2 = oauth2;
|
||||
}
|
||||
|
||||
public String getAddr() {
|
||||
return addr;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public String getImapServer() {
|
||||
return imapServer;
|
||||
}
|
||||
|
||||
public int getImapPort() {
|
||||
return imapPort;
|
||||
}
|
||||
|
||||
public SocketSecurity getImapSecurity() {
|
||||
return imapSecurity;
|
||||
}
|
||||
|
||||
public String getImapUser() {
|
||||
return imapUser;
|
||||
}
|
||||
|
||||
public String getSmtpServer() {
|
||||
return smtpServer;
|
||||
}
|
||||
|
||||
public int getSmtpPort() {
|
||||
return smtpPort;
|
||||
}
|
||||
|
||||
public SocketSecurity getSmtpSecurity() {
|
||||
return smtpSecurity;
|
||||
}
|
||||
|
||||
public String getSmtpUser() {
|
||||
return smtpUser;
|
||||
}
|
||||
|
||||
public String getSmtpPassword() {
|
||||
return smtpPassword;
|
||||
}
|
||||
|
||||
public EnteredCertificateChecks getCertificateChecks() {
|
||||
return certificateChecks;
|
||||
}
|
||||
|
||||
public boolean isOauth2() {
|
||||
return oauth2;
|
||||
}
|
||||
|
||||
public enum EnteredCertificateChecks {
|
||||
automatic, strict, acceptInvalidCertificates,
|
||||
}
|
||||
|
||||
public static EnteredCertificateChecks certificateChecksFromInt(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return EnteredCertificateChecks.automatic;
|
||||
case 1:
|
||||
return EnteredCertificateChecks.strict;
|
||||
case 2:
|
||||
return EnteredCertificateChecks.acceptInvalidCertificates;
|
||||
}
|
||||
throw new IllegalArgumentException("Invalid certificate position: " + position);
|
||||
}
|
||||
|
||||
public enum SocketSecurity {
|
||||
// Unspecified socket security, select automatically.
|
||||
automatic,
|
||||
|
||||
// TLS connection.
|
||||
ssl,
|
||||
|
||||
// STARTTLS connection.
|
||||
starttls,
|
||||
|
||||
// No TLS, plaintext connection.
|
||||
plain,
|
||||
}
|
||||
|
||||
public static SocketSecurity socketSecurityFromInt(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return SocketSecurity.automatic;
|
||||
case 1:
|
||||
return SocketSecurity.ssl;
|
||||
case 2:
|
||||
return SocketSecurity.starttls;
|
||||
case 3:
|
||||
return SocketSecurity.plain;
|
||||
}
|
||||
throw new IllegalArgumentException("Invalid socketSecurity position: " + position);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.b44t.messenger.rpc;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.b44t.messenger.DcJsonrpcInstance;
|
||||
import com.b44t.messenger.util.concurrent.SettableFuture;
|
||||
import com.google.gson.Gson;
|
||||
@@ -14,9 +16,12 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class Rpc {
|
||||
private final static String TAG = Rpc.class.getSimpleName();
|
||||
|
||||
private final Map<Integer, SettableFuture<JsonElement>> requestFutures = new ConcurrentHashMap<>();
|
||||
private final DcJsonrpcInstance dcJsonrpcInstance;
|
||||
private int requestId = 0;
|
||||
private boolean started = false;
|
||||
private final Gson gson = new GsonBuilder().serializeNulls().create();
|
||||
|
||||
public Rpc(DcJsonrpcInstance dcJsonrpcInstance) {
|
||||
@@ -25,9 +30,13 @@ public class Rpc {
|
||||
|
||||
private void processResponse() throws JsonSyntaxException {
|
||||
String jsonResponse = dcJsonrpcInstance.getNextResponse();
|
||||
Response response = gson.fromJson(jsonResponse, Response.class);
|
||||
|
||||
if (response.id == 0) { // Got JSON-RPC notification/event, ignore
|
||||
Response response = gson.fromJson(jsonResponse, Response.class);
|
||||
if (response == null) {
|
||||
Log.e(TAG, "Error parsing JSON: " + jsonResponse);
|
||||
return;
|
||||
} else if (response.id == 0) {
|
||||
// Got JSON-RPC notification/event, ignore
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -37,7 +46,14 @@ public class Rpc {
|
||||
}
|
||||
|
||||
if (response.error != null) {
|
||||
future.setException(new RpcException(response.error.toString()));
|
||||
String message;
|
||||
try {
|
||||
message = response.error.getAsJsonObject().get("message").getAsString();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Can't get response error message: " + e);
|
||||
message = response.error.toString();
|
||||
}
|
||||
future.setException(new RpcException(message));
|
||||
} else if (response.result != null) {
|
||||
future.set(response.result);
|
||||
} else {
|
||||
@@ -46,18 +62,21 @@ public class Rpc {
|
||||
}
|
||||
|
||||
public void start() {
|
||||
started = true;
|
||||
new Thread(() -> {
|
||||
while (true) {
|
||||
try {
|
||||
processResponse();
|
||||
} catch (JsonSyntaxException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}, "jsonrpcThread").start();
|
||||
}
|
||||
|
||||
public SettableFuture<JsonElement> call(String method, Object... params) {
|
||||
public SettableFuture<JsonElement> call(String method, Object... params) throws RpcException {
|
||||
if (!started) throw new RpcException("RPC not started yet.");
|
||||
|
||||
int id;
|
||||
synchronized (this) {
|
||||
id = ++requestId;
|
||||
@@ -125,10 +144,34 @@ public class Rpc {
|
||||
return getResult("get_account_file_size", accountId).getAsInt();
|
||||
}
|
||||
|
||||
public void changeContactName(int accountId, int contactId, String name) throws RpcException {
|
||||
getResult("change_contact_name", accountId, contactId, name);
|
||||
}
|
||||
|
||||
public int addAccount() throws RpcException {
|
||||
return getResult("add_account").getAsInt();
|
||||
}
|
||||
|
||||
public void addTransportFromQr(int accountId, String qrCode) throws RpcException {
|
||||
getResult("add_transport_from_qr", accountId, qrCode);
|
||||
}
|
||||
|
||||
public void addOrUpdateTransport(int accountId, EnteredLoginParam param) throws RpcException {
|
||||
getResult("add_or_update_transport", accountId, param);
|
||||
}
|
||||
|
||||
public int createBroadcast(int accountId, String chatName) throws RpcException {
|
||||
return gson.fromJson(getResult("create_broadcast", accountId, chatName), Integer.class);
|
||||
}
|
||||
|
||||
public int createGroupChatUnencrypted(int accountId, String chatName) throws RpcException {
|
||||
return gson.fromJson(getResult("create_group_chat_unencrypted", accountId, chatName), Integer.class);
|
||||
}
|
||||
|
||||
public void setAccountsOrder(List<Integer> order) throws RpcException {
|
||||
getResult("set_accounts_order", order);
|
||||
}
|
||||
|
||||
private static class Request {
|
||||
private final String jsonrpc = "2.0";
|
||||
public final String method;
|
||||
@@ -142,6 +185,10 @@ public class Rpc {
|
||||
}
|
||||
}
|
||||
|
||||
public String getMigrationError(int accountId) throws RpcException {
|
||||
return gson.fromJson(getResult("get_migration_error", accountId), String.class);
|
||||
}
|
||||
|
||||
private static class Response {
|
||||
public final int id;
|
||||
public final JsonElement result;
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class AllMediaActivity extends PassphraseRequiredActionBarActivity
|
||||
implements DcEventCenter.DcEventDelegate
|
||||
{
|
||||
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
public static final String CONTACT_ID_EXTRA = "contact_id";
|
||||
public static final String FORCE_GALLERY = "force_gallery";
|
||||
|
||||
static class TabData {
|
||||
final int title;
|
||||
final int type1;
|
||||
final int type2;
|
||||
final int type3;
|
||||
TabData(int title, int type1, int type2, int type3) {
|
||||
this.title = title;
|
||||
this.type1 = type1;
|
||||
this.type2 = type2;
|
||||
this.type3 = type3;
|
||||
}
|
||||
};
|
||||
|
||||
private DcContext dcContext;
|
||||
private int chatId;
|
||||
private int contactId;
|
||||
|
||||
private final ArrayList<TabData> tabs = new ArrayList<>();
|
||||
private Toolbar toolbar;
|
||||
private TabLayout tabLayout;
|
||||
private ViewPager viewPager;
|
||||
|
||||
@Override
|
||||
protected void onPreCreate() {
|
||||
dynamicTheme = new DynamicNoActionBarTheme();
|
||||
super.onPreCreate();
|
||||
dcContext = DcHelper.getContext(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle bundle, boolean ready) {
|
||||
tabs.add(new TabData(R.string.webxdc_apps, DcMsg.DC_MSG_WEBXDC, 0, 0));
|
||||
tabs.add(new TabData(R.string.tab_gallery, DcMsg.DC_MSG_IMAGE, DcMsg.DC_MSG_GIF, DcMsg.DC_MSG_VIDEO));
|
||||
tabs.add(new TabData(R.string.files, DcMsg.DC_MSG_FILE, 0, 0));
|
||||
tabs.add(new TabData(R.string.audio, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0));
|
||||
|
||||
setContentView(R.layout.all_media_activity);
|
||||
|
||||
initializeResources();
|
||||
|
||||
setSupportActionBar(this.toolbar);
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (supportActionBar != null) {
|
||||
supportActionBar.setDisplayHomeAsUpEnabled(true);
|
||||
supportActionBar.setTitle(isGlobalGallery() ? R.string.menu_all_media : R.string.apps_and_media);
|
||||
}
|
||||
|
||||
this.tabLayout.setupWithViewPager(viewPager);
|
||||
this.viewPager.setAdapter(new AllMediaPagerAdapter(getSupportFragmentManager()));
|
||||
if (getIntent().getBooleanExtra(FORCE_GALLERY, false)) {
|
||||
this.viewPager.setCurrentItem(1, false);
|
||||
}
|
||||
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
DcHelper.getEventCenter(this).removeObservers(this);
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
}
|
||||
|
||||
private void initializeResources() {
|
||||
chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, 0);
|
||||
contactId = getIntent().getIntExtra(CONTACT_ID_EXTRA, 0);
|
||||
|
||||
if (contactId!=0) {
|
||||
chatId = dcContext.getChatIdByContactId(contactId);
|
||||
}
|
||||
|
||||
if(chatId!=0) {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
if(!dcChat.isMultiUser()) {
|
||||
final int[] members = dcContext.getChatContacts(chatId);
|
||||
contactId = members.length>=1? members[0] : 0;
|
||||
}
|
||||
}
|
||||
|
||||
this.viewPager = ViewUtil.findById(this, R.id.pager);
|
||||
this.toolbar = ViewUtil.findById(this, R.id.toolbar);
|
||||
this.tabLayout = ViewUtil.findById(this, R.id.tab_layout);
|
||||
}
|
||||
|
||||
private boolean isGlobalGallery() {
|
||||
return contactId==0 && chatId==0;
|
||||
}
|
||||
|
||||
private class AllMediaPagerAdapter extends FragmentStatePagerAdapter {
|
||||
private Object currentFragment = null;
|
||||
|
||||
AllMediaPagerAdapter(FragmentManager fragmentManager) {
|
||||
super(fragmentManager);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
|
||||
super.setPrimaryItem(container, position, object);
|
||||
if (currentFragment != null && currentFragment != object) {
|
||||
ActionMode action = null;
|
||||
if (currentFragment instanceof MessageSelectorFragment) {
|
||||
action = ((MessageSelectorFragment) currentFragment).getActionMode();
|
||||
}
|
||||
if (action != null) {
|
||||
action.finish();
|
||||
}
|
||||
}
|
||||
currentFragment = object;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
TabData data = tabs.get(position);
|
||||
Fragment fragment;
|
||||
Bundle args = new Bundle();
|
||||
|
||||
if (data.type1 == DcMsg.DC_MSG_IMAGE) {
|
||||
fragment = new AllMediaGalleryFragment();
|
||||
args.putInt(AllMediaGalleryFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalGallery())? -1 : chatId);
|
||||
} else {
|
||||
fragment = new AllMediaDocumentsFragment();
|
||||
args.putInt(AllMediaDocumentsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalGallery())? -1 : chatId);
|
||||
args.putInt(AllMediaDocumentsFragment.VIEWTYPE1, data.type1);
|
||||
args.putInt(AllMediaDocumentsFragment.VIEWTYPE2, data.type2);
|
||||
}
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return tabs.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
return getString(tabs.get(position).title);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
|
||||
class AllMediaDocumentsAdapter extends StickyHeaderGridAdapter {
|
||||
|
||||
private final Context context;
|
||||
private final ItemClickListener itemClickListener;
|
||||
@@ -57,9 +57,9 @@ class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
ProfileDocumentsAdapter(@NonNull Context context,
|
||||
BucketedThreadMedia media,
|
||||
ItemClickListener clickListener)
|
||||
AllMediaDocumentsAdapter(@NonNull Context context,
|
||||
BucketedThreadMedia media,
|
||||
ItemClickListener clickListener)
|
||||
{
|
||||
this.context = context;
|
||||
this.media = media;
|
||||
@@ -102,16 +102,18 @@ class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
|
||||
viewHolder.audioView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
|
||||
viewHolder.audioView.disablePlayer(!selected.isEmpty());
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
|
||||
viewHolder.date.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else if (slide != null && slide.isWebxdcDocument()) {
|
||||
viewHolder.audioView.setVisibility(View.GONE);
|
||||
viewHolder.documentView.setVisibility(View.GONE);
|
||||
|
||||
viewHolder.webxdcView.setVisibility(View.VISIBLE);
|
||||
viewHolder.webxdcView.setWebxdc(dcMsg, context.getString(R.string.webxdc_app));
|
||||
viewHolder.webxdcView.setWebxdc(dcMsg, "");
|
||||
viewHolder.webxdcView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
|
||||
viewHolder.webxdcView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
|
||||
viewHolder.date.setVisibility(View.GONE);
|
||||
}
|
||||
else if (slide != null && slide.hasDocument()) {
|
||||
viewHolder.audioView.setVisibility(View.GONE);
|
||||
@@ -122,11 +124,13 @@ class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
|
||||
viewHolder.documentView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
|
||||
viewHolder.documentView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
|
||||
viewHolder.date.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else {
|
||||
viewHolder.documentView.setVisibility(View.GONE);
|
||||
viewHolder.audioView.setVisibility(View.GONE);
|
||||
viewHolder.webxdcView.setVisibility(View.GONE);
|
||||
viewHolder.date.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
viewHolder.itemView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
|
||||
@@ -33,21 +33,21 @@ import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class ProfileDocumentsFragment
|
||||
public class AllMediaDocumentsFragment
|
||||
extends MessageSelectorFragment
|
||||
implements LoaderManager.LoaderCallbacks<BucketedThreadMediaLoader.BucketedThreadMedia>,
|
||||
ProfileDocumentsAdapter.ItemClickListener
|
||||
AllMediaDocumentsAdapter.ItemClickListener
|
||||
{
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
public static final String SHOW_AUDIO_EXTRA = "show_audio";
|
||||
public static final String SHOW_WEBXDC_EXTRA = "show_webxdc";
|
||||
public static final String VIEWTYPE1 = "viewtype1";
|
||||
public static final String VIEWTYPE2 = "viewtype2";
|
||||
|
||||
protected TextView noMedia;
|
||||
protected RecyclerView recyclerView;
|
||||
private StickyHeaderGridLayoutManager gridManager;
|
||||
private final ActionModeCallback actionModeCallback = new ActionModeCallback();
|
||||
private boolean showAudio;
|
||||
private boolean showWebxdc;
|
||||
private int viewtype1;
|
||||
private int viewtype2;
|
||||
|
||||
protected int chatId;
|
||||
|
||||
@@ -57,8 +57,8 @@ public class ProfileDocumentsFragment
|
||||
|
||||
dcContext = DcHelper.getContext(getContext());
|
||||
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
|
||||
showAudio = getArguments().getBoolean(SHOW_AUDIO_EXTRA, false);
|
||||
showWebxdc = getArguments().getBoolean(SHOW_WEBXDC_EXTRA, false);
|
||||
viewtype1 = getArguments().getInt(VIEWTYPE1, 0);
|
||||
viewtype2 = getArguments().getInt(VIEWTYPE2, 0);
|
||||
|
||||
getLoaderManager().initLoader(0, null, this);
|
||||
}
|
||||
@@ -71,7 +71,7 @@ public class ProfileDocumentsFragment
|
||||
this.noMedia = ViewUtil.findById(view, R.id.no_documents);
|
||||
this.gridManager = new StickyHeaderGridLayoutManager(1);
|
||||
|
||||
this.recyclerView.setAdapter(new ProfileDocumentsAdapter(getContext(),
|
||||
this.recyclerView.setAdapter(new AllMediaDocumentsAdapter(getContext(),
|
||||
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
|
||||
this));
|
||||
this.recyclerView.setLayoutManager(gridManager);
|
||||
@@ -105,32 +105,26 @@ public class ProfileDocumentsFragment
|
||||
|
||||
@Override
|
||||
public Loader<BucketedThreadMediaLoader.BucketedThreadMedia> onCreateLoader(int i, Bundle bundle) {
|
||||
if (showAudio) {
|
||||
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0);
|
||||
} else if (showWebxdc) {
|
||||
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_WEBXDC, 0, 0);
|
||||
} else {
|
||||
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_FILE, 0, 0);
|
||||
}
|
||||
return new BucketedThreadMediaLoader(getContext(), chatId, viewtype1, viewtype2, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> loader, BucketedThreadMediaLoader.BucketedThreadMedia bucketedThreadMedia) {
|
||||
((ProfileDocumentsAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
|
||||
((ProfileDocumentsAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
|
||||
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
|
||||
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
|
||||
|
||||
noMedia.setVisibility(recyclerView.getAdapter().getItemCount() > 0 ? View.GONE : View.VISIBLE);
|
||||
if (chatId == DC_CHAT_NO_CHAT) {
|
||||
if (showWebxdc) {
|
||||
if (viewtype1 == DcMsg.DC_MSG_WEBXDC) {
|
||||
noMedia.setText(R.string.all_apps_empty_hint);
|
||||
} else if (!showAudio){
|
||||
} else if (viewtype1 == DcMsg.DC_MSG_FILE){
|
||||
noMedia.setText(R.string.all_files_empty_hint);
|
||||
} else {
|
||||
noMedia.setText(R.string.tab_all_media_empty_hint);
|
||||
}
|
||||
} else if (showAudio) {
|
||||
} else if (viewtype1 == DcMsg.DC_MSG_AUDIO) {
|
||||
noMedia.setText(R.string.tab_audio_empty_hint);
|
||||
} else if (showWebxdc) {
|
||||
} else if (viewtype1 == DcMsg.DC_MSG_WEBXDC) {
|
||||
noMedia.setText(R.string.tab_webxdc_empty_hint);
|
||||
}
|
||||
getActivity().invalidateOptionsMenu();
|
||||
@@ -138,7 +132,7 @@ public class ProfileDocumentsFragment
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> cursorLoader) {
|
||||
((ProfileDocumentsAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
|
||||
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,7 +150,7 @@ public class ProfileDocumentsFragment
|
||||
}
|
||||
|
||||
private void handleMediaMultiSelectClick(@NonNull DcMsg mediaRecord) {
|
||||
ProfileDocumentsAdapter adapter = getListAdapter();
|
||||
AllMediaDocumentsAdapter adapter = getListAdapter();
|
||||
|
||||
adapter.toggleSelection(mediaRecord);
|
||||
if (adapter.getSelectedMediaCount() == 0) {
|
||||
@@ -179,7 +173,7 @@ public class ProfileDocumentsFragment
|
||||
}
|
||||
|
||||
if (dcMsg.getType() == DcMsg.DC_MSG_WEBXDC) {
|
||||
DcHelper.openWebxdc(context, dcMsg);
|
||||
WebxdcActivity.openWebxdcActivity(context, dcMsg);
|
||||
} else {
|
||||
DcHelper.openForViewOrShare(getActivity(), dcMsg.getId(), Intent.ACTION_VIEW);
|
||||
}
|
||||
@@ -188,7 +182,7 @@ public class ProfileDocumentsFragment
|
||||
@Override
|
||||
public void onMediaLongClicked(DcMsg mediaRecord) {
|
||||
if (actionMode == null) {
|
||||
((ProfileDocumentsAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
|
||||
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
|
||||
|
||||
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback);
|
||||
}
|
||||
@@ -221,8 +215,8 @@ public class ProfileDocumentsFragment
|
||||
menu.findItem(R.id.menu_add_to_home_screen).setVisible(webxdcApp);
|
||||
}
|
||||
|
||||
private ProfileDocumentsAdapter getListAdapter() {
|
||||
return (ProfileDocumentsAdapter) recyclerView.getAdapter();
|
||||
private AllMediaDocumentsAdapter getListAdapter() {
|
||||
return (AllMediaDocumentsAdapter) recyclerView.getAdapter();
|
||||
}
|
||||
|
||||
private class ActionModeCallback implements ActionMode.Callback {
|
||||
@@ -21,7 +21,7 @@ import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
class ProfileGalleryAdapter extends StickyHeaderGridAdapter {
|
||||
class AllMediaGalleryAdapter extends StickyHeaderGridAdapter {
|
||||
|
||||
private final Context context;
|
||||
private final GlideRequests glideRequests;
|
||||
@@ -50,10 +50,10 @@ class ProfileGalleryAdapter extends StickyHeaderGridAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
ProfileGalleryAdapter(@NonNull Context context,
|
||||
@NonNull GlideRequests glideRequests,
|
||||
BucketedThreadMedia media,
|
||||
ItemClickListener clickListener)
|
||||
AllMediaGalleryAdapter(@NonNull Context context,
|
||||
@NonNull GlideRequests glideRequests,
|
||||
BucketedThreadMedia media,
|
||||
ItemClickListener clickListener)
|
||||
{
|
||||
this.context = context;
|
||||
this.glideRequests = glideRequests;
|
||||
@@ -35,10 +35,10 @@ import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class ProfileGalleryFragment
|
||||
public class AllMediaGalleryFragment
|
||||
extends MessageSelectorFragment
|
||||
implements LoaderManager.LoaderCallbacks<BucketedThreadMediaLoader.BucketedThreadMedia>,
|
||||
ProfileGalleryAdapter.ItemClickListener
|
||||
AllMediaGalleryAdapter.ItemClickListener
|
||||
{
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
|
||||
@@ -67,7 +67,7 @@ public class ProfileGalleryFragment
|
||||
this.noMedia = ViewUtil.findById(view, R.id.no_images);
|
||||
this.gridManager = new StickyHeaderGridLayoutManager(getCols());
|
||||
|
||||
this.recyclerView.setAdapter(new ProfileGalleryAdapter(getContext(),
|
||||
this.recyclerView.setAdapter(new AllMediaGalleryAdapter(getContext(),
|
||||
GlideApp.with(this),
|
||||
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
|
||||
this));
|
||||
@@ -112,8 +112,8 @@ public class ProfileGalleryFragment
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> loader, BucketedThreadMediaLoader.BucketedThreadMedia bucketedThreadMedia) {
|
||||
((ProfileGalleryAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
|
||||
((ProfileGalleryAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
|
||||
((AllMediaGalleryAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
|
||||
((AllMediaGalleryAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
|
||||
|
||||
noMedia.setVisibility(recyclerView.getAdapter().getItemCount() > 0 ? View.GONE : View.VISIBLE);
|
||||
if (chatId == DC_CHAT_NO_CHAT) {
|
||||
@@ -124,7 +124,7 @@ public class ProfileGalleryFragment
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> cursorLoader) {
|
||||
((ProfileGalleryAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
|
||||
((AllMediaGalleryAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -142,7 +142,7 @@ public class ProfileGalleryFragment
|
||||
}
|
||||
|
||||
private void handleMediaMultiSelectClick(@NonNull DcMsg mediaRecord) {
|
||||
ProfileGalleryAdapter adapter = getListAdapter();
|
||||
AllMediaGalleryAdapter adapter = getListAdapter();
|
||||
|
||||
adapter.toggleSelection(mediaRecord);
|
||||
if (adapter.getSelectedMediaCount() == 0) {
|
||||
@@ -175,7 +175,7 @@ public class ProfileGalleryFragment
|
||||
@Override
|
||||
public void onMediaLongClicked(DcMsg mediaRecord) {
|
||||
if (actionMode == null) {
|
||||
((ProfileGalleryAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
|
||||
((AllMediaGalleryAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
|
||||
recyclerView.getAdapter().notifyDataSetChanged();
|
||||
|
||||
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback);
|
||||
@@ -206,8 +206,8 @@ public class ProfileGalleryFragment
|
||||
menu.findItem(R.id.menu_resend).setVisible(canResend);
|
||||
}
|
||||
|
||||
private ProfileGalleryAdapter getListAdapter() {
|
||||
return (ProfileGalleryAdapter) recyclerView.getAdapter();
|
||||
private AllMediaGalleryAdapter getListAdapter() {
|
||||
return (AllMediaGalleryAdapter) recyclerView.getAdapter();
|
||||
}
|
||||
|
||||
private class ActionModeCallback implements ActionMode.Callback {
|
||||
@@ -110,6 +110,7 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
|
||||
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
|
||||
rpc = new Rpc(dcAccounts.getJsonrpcInstance());
|
||||
rpc.start();
|
||||
AccountManager.getInstance().migrateToDcAccounts(this);
|
||||
int[] allAccounts = dcAccounts.getAll();
|
||||
for (int accountId : allAccounts) {
|
||||
@@ -148,8 +149,6 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
Log.i("DeltaChat", "shutting down event handler");
|
||||
}, "eventThread").start();
|
||||
|
||||
rpc.start();
|
||||
|
||||
// migrating global notifications pref. to per-account config, added 10/July/24
|
||||
final String NOTIFICATION_PREF = "pref_key_enable_notifications";
|
||||
boolean isMuted = !Prefs.getBooleanPreference(this, NOTIFICATION_PREF, true);
|
||||
@@ -220,30 +219,30 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
}
|
||||
}, filter);
|
||||
|
||||
// MAYBE TODO: i think the ApplicationContext is also created
|
||||
// when the app is stated by FetchWorker timeouts.
|
||||
// in this case, the normal threads shall not be started.
|
||||
Constraints constraints = new Constraints.Builder()
|
||||
.setRequiredNetworkType(NetworkType.CONNECTED)
|
||||
.build();
|
||||
PeriodicWorkRequest fetchWorkRequest = new PeriodicWorkRequest.Builder(
|
||||
FetchWorker.class,
|
||||
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, // usually 15 minutes
|
||||
TimeUnit.MILLISECONDS,
|
||||
PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS, // the start may be preferred by up to 5 minutes, so we run every 10-15 minutes
|
||||
TimeUnit.MILLISECONDS)
|
||||
.setConstraints(constraints)
|
||||
.build();
|
||||
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
|
||||
"FetchWorker",
|
||||
ExistingPeriodicWorkPolicy.KEEP,
|
||||
fetchWorkRequest);
|
||||
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
|
||||
|
||||
if (Prefs.isPushEnabled(this)) {
|
||||
FcmReceiveService.register(this);
|
||||
} else {
|
||||
Log.i(TAG, "FCM disabled at build time");
|
||||
// MAYBE TODO: i think the ApplicationContext is also created
|
||||
// when the app is stated by FetchWorker timeouts.
|
||||
// in this case, the normal threads shall not be started.
|
||||
Constraints constraints = new Constraints.Builder()
|
||||
.setRequiredNetworkType(NetworkType.CONNECTED)
|
||||
.build();
|
||||
PeriodicWorkRequest fetchWorkRequest = new PeriodicWorkRequest.Builder(
|
||||
FetchWorker.class,
|
||||
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, // usually 15 minutes
|
||||
TimeUnit.MILLISECONDS,
|
||||
PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS, // the start may be preferred by up to 5 minutes, so we run every 10-15 minutes
|
||||
TimeUnit.MILLISECONDS)
|
||||
.setConstraints(constraints)
|
||||
.build();
|
||||
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
|
||||
"FetchWorker",
|
||||
ExistingPeriodicWorkPolicy.KEEP,
|
||||
fetchWorkRequest);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -75,11 +75,13 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle, boolean ready) {
|
||||
setContentView(R.layout.activity_application_preferences);
|
||||
|
||||
//noinspection ConstantConditions
|
||||
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
if (icicle == null) {
|
||||
initFragment(android.R.id.content, new ApplicationPreferenceFragment());
|
||||
initFragment(R.id.fragment, new ApplicationPreferenceFragment());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,7 +93,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
showBackupProvider();
|
||||
return;
|
||||
}
|
||||
Fragment fragment = getSupportFragmentManager().findFragmentById(android.R.id.content);
|
||||
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment);
|
||||
fragment.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
@@ -271,7 +273,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
|
||||
|
||||
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
|
||||
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
|
||||
fragmentTransaction.replace(android.R.id.content, fragment);
|
||||
fragmentTransaction.replace(R.id.fragment, fragment);
|
||||
fragmentTransaction.addToBackStack(null);
|
||||
fragmentTransaction.commit();
|
||||
}
|
||||
|
||||
@@ -9,9 +9,8 @@ public class AttachContactActivity extends ContactSelectionActivity {
|
||||
public static final String CONTACT_ID_EXTRA = "contact_id_extra";
|
||||
|
||||
@Override
|
||||
public void onContactSelected(int specialId, String addr) {
|
||||
public void onContactSelected(int contactId) {
|
||||
Intent intent = new Intent();
|
||||
int contactId = DcHelper.getContext(this).lookupContactIdByAddr(addr);
|
||||
intent.putExtra(CONTACT_ID_EXTRA, contactId);
|
||||
setResult(RESULT_OK, intent);
|
||||
finish();
|
||||
|
||||
@@ -92,7 +92,7 @@ public abstract class BaseConversationItem extends LinearLayout
|
||||
protected boolean shouldInterceptClicks(DcMsg messageRecord) {
|
||||
return batchSelected.isEmpty()
|
||||
&& (messageRecord.isFailed()
|
||||
|| messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_DISABLED
|
||||
|| messageRecord.getInfoType() == DcMsg.DC_INFO_CHAT_E2EE
|
||||
|| messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_ENABLED
|
||||
|| messageRecord.getInfoType() == DcMsg.DC_INFO_INVALID_UNENCRYPTED_MAIL);
|
||||
}
|
||||
@@ -140,9 +140,7 @@ public abstract class BaseConversationItem extends LinearLayout
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.create();
|
||||
d.show();
|
||||
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_DISABLED) {
|
||||
DcHelper.showVerificationBrokenDialog(context, conversationRecipient.getName());
|
||||
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_ENABLED) {
|
||||
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_CHAT_E2EE || messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_ENABLED) {
|
||||
DcHelper.showProtectionEnabledDialog(context);
|
||||
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_INVALID_UNENCRYPTED_MAIL) {
|
||||
DcHelper.showInvalidUnencryptedDialog(context);
|
||||
|
||||
@@ -333,18 +333,22 @@ public abstract class BaseConversationListFragment extends Fragment implements A
|
||||
intent.putExtra(ShareActivity.EXTRA_CHAT_ID, chat.getId());
|
||||
|
||||
Recipient recipient = new Recipient(activity, chat);
|
||||
Bitmap avatar = DirectShareUtil.getIconForShortcut(activity, recipient);
|
||||
ShortcutInfoCompat shortcutInfoCompat = new ShortcutInfoCompat.Builder(activity, "chat-" + dcContext.getAccountId() + "-" + chat.getId())
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
Bitmap avatar = DirectShareUtil.getIconForShortcut(activity, recipient);
|
||||
ShortcutInfoCompat shortcutInfoCompat = new ShortcutInfoCompat.Builder(activity, "chat-" + dcContext.getAccountId() + "-" + chat.getId())
|
||||
.setShortLabel(chat.getName())
|
||||
.setIcon(IconCompat.createWithAdaptiveBitmap(avatar))
|
||||
.setIntent(intent)
|
||||
.build();
|
||||
if (!ShortcutManagerCompat.requestPinShortcut(activity, shortcutInfoCompat, null)) {
|
||||
Toast.makeText(activity, "ErrAddToHomescreen: requestPinShortcut() failed", Toast.LENGTH_LONG).show();
|
||||
} else if (actionMode != null) {
|
||||
actionMode.finish();
|
||||
actionMode = null;
|
||||
}
|
||||
Util.runOnMain(() -> {
|
||||
if (!ShortcutManagerCompat.requestPinShortcut(activity, shortcutInfoCompat, null)) {
|
||||
Toast.makeText(activity, "ErrAddToHomescreen: requestPinShortcut() failed", Toast.LENGTH_LONG).show();
|
||||
} else if (actionMode != null) {
|
||||
actionMode.finish();
|
||||
actionMode = null;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private void updateActionModeItems(Menu menu) {
|
||||
|
||||
@@ -30,9 +30,10 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle bundle, boolean ready) {
|
||||
setContentView(R.layout.activity_blocked_contacts);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setTitle(R.string.pref_blocked_contacts);
|
||||
initFragment(android.R.id.content, new BlockedAndShareContactsFragment(), getIntent().getExtras());
|
||||
initFragment(R.id.fragment, new BlockedAndShareContactsFragment(), getIntent().getExtras());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,6 +33,8 @@ import java.util.List;
|
||||
*/
|
||||
public class ContactMultiSelectionActivity extends ContactSelectionActivity {
|
||||
|
||||
public static final String CONTACTS_EXTRA = "contacts_extra";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle, boolean ready) {
|
||||
getIntent().putExtra(ContactSelectionListFragment.MULTI_SELECT, true);
|
||||
@@ -68,12 +70,8 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity {
|
||||
|
||||
private void saveSelection() {
|
||||
Intent resultIntent = getIntent();
|
||||
List<String> selectedContacts = contactsFragment.getSelectedContacts();
|
||||
|
||||
if (selectedContacts != null) {
|
||||
resultIntent.putStringArrayListExtra("contacts", new ArrayList<>(selectedContacts));
|
||||
}
|
||||
|
||||
List<Integer> selectedContacts = contactsFragment.getSelectedContacts();
|
||||
resultIntent.putIntegerArrayListExtra(CONTACTS_EXTRA, new ArrayList<>(selectedContacts));
|
||||
setResult(RESULT_OK, resultIntent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,8 +89,8 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onContactSelected(int specialId, String number) {}
|
||||
public void onContactSelected(int contactId) {}
|
||||
|
||||
@Override
|
||||
public void onContactDeselected(int specialId, String number) {}
|
||||
public void onContactDeselected(int contactId) {}
|
||||
}
|
||||
|
||||
@@ -83,13 +83,14 @@ public class ContactSelectionListFragment extends Fragment
|
||||
|
||||
public static final String MULTI_SELECT = "multi_select";
|
||||
public static final String SELECT_VERIFIED_EXTRA = "select_verified";
|
||||
public static final String SELECT_UNENCRYPTED_EXTRA = "select_unencrypted_extra";
|
||||
public static final String ALLOW_CREATION = "allow_creation";
|
||||
public static final String PRESELECTED_CONTACTS = "preselected_contacts";
|
||||
public static final int CONTACT_ADDR_RESULT_CODE = 61123;
|
||||
|
||||
private DcContext dcContext;
|
||||
|
||||
private Set<String> selectedContacts;
|
||||
private Set<Integer> selectedContacts;
|
||||
private OnContactSelectedListener onContactSelectedListener;
|
||||
private String cursorFilter;
|
||||
private RecyclerView recyclerView;
|
||||
@@ -234,8 +235,8 @@ public class ContactSelectionListFragment extends Fragment
|
||||
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
|
||||
}
|
||||
|
||||
public @NonNull List<String> getSelectedContacts() {
|
||||
List<String> selected = new LinkedList<>();
|
||||
public @NonNull List<Integer> getSelectedContacts() {
|
||||
List<Integer> selected = new LinkedList<>();
|
||||
if (selectedContacts != null) {
|
||||
selected.addAll(selectedContacts);
|
||||
}
|
||||
@@ -251,6 +252,10 @@ public class ContactSelectionListFragment extends Fragment
|
||||
return getActivity().getIntent().getBooleanExtra(SELECT_VERIFIED_EXTRA, false);
|
||||
}
|
||||
|
||||
private boolean isUnencrypted() {
|
||||
return getActivity().getIntent().getBooleanExtra(SELECT_UNENCRYPTED_EXTRA, false);
|
||||
}
|
||||
|
||||
private void initializeCursor() {
|
||||
ContactSelectionListAdapter adapter = new ContactSelectionListAdapter(getActivity(),
|
||||
GlideApp.with(this),
|
||||
@@ -258,7 +263,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
isMulti(),
|
||||
true);
|
||||
selectedContacts = adapter.getSelectedContacts();
|
||||
ArrayList<String> preselectedContacts = getActivity().getIntent().getStringArrayListExtra(PRESELECTED_CONTACTS);
|
||||
ArrayList<Integer> preselectedContacts = getActivity().getIntent().getIntegerArrayListExtra(PRESELECTED_CONTACTS);
|
||||
if(preselectedContacts!=null) {
|
||||
selectedContacts.addAll(preselectedContacts);
|
||||
}
|
||||
@@ -273,11 +278,11 @@ public class ContactSelectionListFragment extends Fragment
|
||||
@Override
|
||||
public Loader<DcContactsLoader.Ret> onCreateLoader(int id, Bundle args) {
|
||||
final boolean allowCreation = getActivity().getIntent().getBooleanExtra(ALLOW_CREATION, true);
|
||||
final boolean addCreateContactLink = allowCreation && !isSelectVerfied();
|
||||
final boolean addCreateContactLink = allowCreation && isUnencrypted();
|
||||
final boolean addCreateGroupLinks = allowCreation && !isRelayingMessageContent(getActivity()) && !isMulti();
|
||||
final boolean addScanQRLink = allowCreation && !isMulti();
|
||||
|
||||
final int listflags = DcContext.DC_GCL_ADD_SELF;
|
||||
final int listflags = DcContext.DC_GCL_ADD_SELF | (isUnencrypted()? DcContext.DC_GCL_ADDRESS : 0);
|
||||
return new DcContactsLoader(getActivity(), listflags, cursorFilter, addCreateGroupLinks, addCreateContactLink, addScanQRLink, false);
|
||||
}
|
||||
|
||||
@@ -336,10 +341,9 @@ public class ContactSelectionListFragment extends Fragment
|
||||
}
|
||||
return;
|
||||
}
|
||||
int specialId = contact.getSpecialId();
|
||||
String addr = contact.getNumber();
|
||||
if (!isMulti() || !selectedContacts.contains(addr)) {
|
||||
if (specialId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) {
|
||||
int contactId = contact.getSpecialId();
|
||||
if (!isMulti() || !selectedContacts.contains(contactId)) {
|
||||
if (contactId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) {
|
||||
Intent intent = new Intent(getContext(), NewContactActivity.class);
|
||||
if (dcContext.mayBeValidAddr(cursorFilter)) {
|
||||
intent.putExtra(NewContactActivity.ADDR_EXTRA, cursorFilter);
|
||||
@@ -363,16 +367,16 @@ public class ContactSelectionListFragment extends Fragment
|
||||
return;
|
||||
}
|
||||
|
||||
selectedContacts.add(addr);
|
||||
selectedContacts.add(contactId);
|
||||
contact.setChecked(true);
|
||||
if (onContactSelectedListener != null) {
|
||||
onContactSelectedListener.onContactSelected(specialId, addr);
|
||||
onContactSelectedListener.onContactSelected(contactId);
|
||||
}
|
||||
} else {
|
||||
selectedContacts.remove(addr);
|
||||
selectedContacts.remove(contactId);
|
||||
contact.setChecked(false);
|
||||
if (onContactSelectedListener != null) {
|
||||
onContactSelectedListener.onContactDeselected(specialId, addr);
|
||||
onContactSelectedListener.onContactDeselected(contactId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -398,8 +402,8 @@ public class ContactSelectionListFragment extends Fragment
|
||||
}
|
||||
|
||||
public interface OnContactSelectedListener {
|
||||
void onContactSelected(int specialId, String number);
|
||||
void onContactDeselected(int specialId, String number);
|
||||
void onContactSelected(int contactId);
|
||||
void onContactDeselected(int contactId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -413,7 +417,10 @@ public class ContactSelectionListFragment extends Fragment
|
||||
public void onActivityResult(int reqCode, int resultCode, final Intent data) {
|
||||
super.onActivityResult(reqCode, resultCode, data);
|
||||
if (resultCode == Activity.RESULT_OK && reqCode == CONTACT_ADDR_RESULT_CODE) {
|
||||
selectedContacts.add(data.getStringExtra(NewContactActivity.ADDR_EXTRA));
|
||||
int contactId = data.getIntExtra(NewContactActivity.CONTACT_ID_EXTRA, 0);
|
||||
if (contactId != 0) {
|
||||
selectedContacts.add(contactId);
|
||||
}
|
||||
getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.SearchView;
|
||||
@@ -437,7 +438,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
getMenuInflater().inflate(R.menu.conversation, menu);
|
||||
|
||||
if (dcChat.isSelfTalk() || dcChat.isBroadcast()) {
|
||||
if (dcChat.isSelfTalk() || dcChat.isOutBroadcast()) {
|
||||
menu.findItem(R.id.menu_mute_notifications).setVisible(false);
|
||||
} else if(dcChat.isMuted()) {
|
||||
menu.findItem(R.id.menu_mute_notifications).setTitle(R.string.menu_unmute);
|
||||
@@ -447,12 +448,17 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
menu.findItem(R.id.menu_show_map).setVisible(false);
|
||||
}
|
||||
|
||||
if (!dcChat.canSend() || dcChat.isBroadcast() || dcChat.isMailingList()) {
|
||||
if (!dcChat.isEncrypted() || !dcChat.canSend() || dcChat.isMailingList() ) {
|
||||
menu.findItem(R.id.menu_ephemeral_messages).setVisible(false);
|
||||
}
|
||||
|
||||
if (isMultiUser()) {
|
||||
if (dcChat.canSend() && !dcChat.isBroadcast() && !dcChat.isMailingList()) {
|
||||
if (dcChat.isInBroadcast() && !dcChat.isContactRequest()) {
|
||||
menu.findItem(R.id.menu_leave).setTitle(R.string.menu_leave_channel).setVisible(true);
|
||||
} else if (dcChat.isEncrypted()
|
||||
&& dcChat.canSend()
|
||||
&& !dcChat.isOutBroadcast()
|
||||
&& !dcChat.isMailingList()) {
|
||||
menu.findItem(R.id.menu_leave).setVisible(true);
|
||||
}
|
||||
}
|
||||
@@ -496,6 +502,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
Log.e(TAG, "cannot set up in-chat-search: ", e);
|
||||
}
|
||||
|
||||
if (!dcChat.canSend() || isEditing) {
|
||||
MenuItem attachItem = menu.findItem(R.id.menu_add_attachment);
|
||||
if (attachItem!=null) {
|
||||
attachItem.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
return true;
|
||||
}
|
||||
@@ -504,7 +517,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == R.id.menu_leave) {
|
||||
if (itemId == R.id.menu_add_attachment) {
|
||||
handleAddAttachment();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_leave) {
|
||||
handleLeaveGroup();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_archive_chat) {
|
||||
@@ -522,6 +538,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
} else if (itemId == R.id.menu_show_map) {
|
||||
WebxdcActivity.openMaps(this, chatId);
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_all_media) {
|
||||
handleAllMedia();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_search_up) {
|
||||
handleMenuSearchNext(false);
|
||||
return true;
|
||||
@@ -605,15 +624,26 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
private void handleProfile() {
|
||||
Intent intent = new Intent(this, ProfileActivity.class);
|
||||
intent.putExtra(ProfileActivity.CHAT_ID_EXTRA, chatId);
|
||||
intent.putExtra(ProfileActivity.FROM_CHAT, true);
|
||||
startActivity(intent);
|
||||
overridePendingTransition(0, 0);
|
||||
}
|
||||
|
||||
private void handleAllMedia() {
|
||||
Intent intent = new Intent(this, AllMediaActivity.class);
|
||||
intent.putExtra(AllMediaActivity.CHAT_ID_EXTRA, chatId);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private void handleLeaveGroup() {
|
||||
@StringRes int leaveLabel;
|
||||
if (dcChat.isInBroadcast()) {
|
||||
leaveLabel = R.string.menu_leave_channel;
|
||||
} else {
|
||||
leaveLabel = R.string.menu_leave_group;
|
||||
}
|
||||
|
||||
AlertDialog dialog = new AlertDialog.Builder(this)
|
||||
.setMessage(getString(R.string.ask_leave_group))
|
||||
.setPositiveButton(R.string.menu_leave_group, (d, which) -> {
|
||||
.setPositiveButton(leaveLabel, (d, which) -> {
|
||||
dcContext.removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF);
|
||||
Toast.makeText(this, getString(R.string.done), Toast.LENGTH_SHORT).show();
|
||||
})
|
||||
@@ -676,7 +706,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
if (!dcChat.isMultiUser()) {
|
||||
int[] contactIds = dcContext.getChatContacts(chatId);
|
||||
if (contactIds.length == 1 || contactIds.length == 2) {
|
||||
name = dcContext.getContact(contactIds[0]).getNameNAddr();
|
||||
name = dcContext.getContact(contactIds[0]).getDisplayName();
|
||||
}
|
||||
}
|
||||
new AlertDialog.Builder(this)
|
||||
@@ -1012,9 +1042,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
final SettableFuture<Integer> future = new SettableFuture<>();
|
||||
|
||||
DcMsg msg = null;
|
||||
Optional<QuoteModel> quote = inputPanel.getQuote();
|
||||
Integer recompress = 0;
|
||||
boolean editing = isEditing;
|
||||
|
||||
// for a quick ui feedback, we clear the related controls immediately on sending messages.
|
||||
@@ -1024,122 +1052,114 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
inputPanel.clearQuote();
|
||||
}
|
||||
|
||||
if (editing) {
|
||||
int msgId = quote.get().getQuotedMsg().getId();
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
DcMsg msg = null;
|
||||
int recompress = 0;
|
||||
|
||||
if (editing) {
|
||||
int msgId = quote.get().getQuotedMsg().getId();
|
||||
if (action == ACTION_SEND_OUT) {
|
||||
dcContext.sendEditRequest(msgId, body);
|
||||
} else {
|
||||
dcContext.setDraft(chatId, null);
|
||||
}
|
||||
});
|
||||
return future;
|
||||
}
|
||||
|
||||
if(slideDeck!=null) {
|
||||
|
||||
if (action==ACTION_SEND_OUT) {
|
||||
attachmentManager.clear(glideRequests, false);
|
||||
future.set(chatId);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (slideDeck.getWebxdctDraftId() != 0) {
|
||||
msg = dcContext.getDraft(chatId);
|
||||
} else {
|
||||
List<Attachment> attachments = slideDeck.asAttachments();
|
||||
for (Attachment attachment : attachments) {
|
||||
String contentType = attachment.getContentType();
|
||||
if (MediaUtil.isImageType(contentType) && slideDeck.getDocumentSlide() == null) {
|
||||
msg = new DcMsg(dcContext,
|
||||
MediaUtil.isGif(contentType) ? DcMsg.DC_MSG_GIF : DcMsg.DC_MSG_IMAGE);
|
||||
msg.setDimension(attachment.getWidth(), attachment.getHeight());
|
||||
} else if (MediaUtil.isAudioType(contentType)) {
|
||||
msg = new DcMsg(dcContext,
|
||||
attachment.isVoiceNote() ? DcMsg.DC_MSG_VOICE : DcMsg.DC_MSG_AUDIO);
|
||||
} else if (MediaUtil.isVideoType(contentType) && slideDeck.getDocumentSlide() == null) {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_VIDEO);
|
||||
recompress = DcMsg.DC_MSG_VIDEO;
|
||||
} else {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
|
||||
if(slideDeck!=null) {
|
||||
if (action==ACTION_SEND_OUT) {
|
||||
Util.runOnMain(() -> attachmentManager.clear(glideRequests, false));
|
||||
}
|
||||
|
||||
try {
|
||||
if (slideDeck.getWebxdctDraftId() != 0) {
|
||||
msg = dcContext.getDraft(chatId);
|
||||
} else {
|
||||
List<Attachment> attachments = slideDeck.asAttachments();
|
||||
for (Attachment attachment : attachments) {
|
||||
String contentType = attachment.getContentType();
|
||||
if (MediaUtil.isImageType(contentType) && slideDeck.getDocumentSlide() == null) {
|
||||
msg = new DcMsg(dcContext,
|
||||
MediaUtil.isGif(contentType) ? DcMsg.DC_MSG_GIF : DcMsg.DC_MSG_IMAGE);
|
||||
msg.setDimension(attachment.getWidth(), attachment.getHeight());
|
||||
} else if (MediaUtil.isAudioType(contentType)) {
|
||||
msg = new DcMsg(dcContext,
|
||||
attachment.isVoiceNote() ? DcMsg.DC_MSG_VOICE : DcMsg.DC_MSG_AUDIO);
|
||||
} else if (MediaUtil.isVideoType(contentType) && slideDeck.getDocumentSlide() == null) {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_VIDEO);
|
||||
recompress = DcMsg.DC_MSG_VIDEO;
|
||||
} else {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
|
||||
}
|
||||
String path = attachment.getRealPath(this);
|
||||
msg.setFileAndDeduplicate(path, attachment.getFileName(), null);
|
||||
}
|
||||
String path = attachment.getRealPath(this);
|
||||
msg.setFileAndDeduplicate(path, attachment.getFileName(), null);
|
||||
}
|
||||
if (msg != null) {
|
||||
msg.setText(body);
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
else if (!body.isEmpty()){
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setText(body);
|
||||
}
|
||||
catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
if (quote.isPresent()) {
|
||||
if (msg == null) msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setQuote(quote.get().getQuotedMsg());
|
||||
}
|
||||
}
|
||||
else if (!body.isEmpty()){
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setText(body);
|
||||
}
|
||||
|
||||
if (quote.isPresent()) {
|
||||
if (msg == null) msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setQuote(quote.get().getQuotedMsg());
|
||||
}
|
||||
if (action==ACTION_SEND_OUT) {
|
||||
|
||||
// msg may still be null to clear drafts
|
||||
new AsyncTask<Object, Void, Void>() {
|
||||
@Override
|
||||
protected Void doInBackground(Object... param) {
|
||||
DcMsg msg = (DcMsg)param[0];
|
||||
Integer recompress = (Integer)param[1];
|
||||
if (action==ACTION_SEND_OUT) {
|
||||
// for WEBXDC, drafts are just sent out as is.
|
||||
// for preparations and other cases, cleanup draft soon.
|
||||
if (msg == null || msg.getType() != DcMsg.DC_MSG_WEBXDC) {
|
||||
dcContext.setDraft(dcChat.getId(), null);
|
||||
}
|
||||
|
||||
// for WEBXDC, drafts are just sent out as is.
|
||||
// for preparations and other cases, cleanup draft soon.
|
||||
if (msg == null || msg.getType() != DcMsg.DC_MSG_WEBXDC) {
|
||||
dcContext.setDraft(dcChat.getId(), null);
|
||||
}
|
||||
|
||||
if(msg!=null)
|
||||
{
|
||||
boolean doSend = true;
|
||||
if (recompress==DcMsg.DC_MSG_VIDEO) {
|
||||
Util.runOnMain(() -> {
|
||||
progressDialog = ProgressDialog.show(
|
||||
ConversationActivity.this,
|
||||
"",
|
||||
getString(R.string.one_moment),
|
||||
true,
|
||||
false
|
||||
);
|
||||
});
|
||||
doSend = VideoRecoder.prepareVideo(ConversationActivity.this, dcChat.getId(), msg);
|
||||
Util.runOnMain(() -> {
|
||||
try {
|
||||
progressDialog.dismiss();
|
||||
} catch (final IllegalArgumentException e) {
|
||||
// The activity is finishing/destroyed, do nothing.
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (doSend) {
|
||||
if (dcContext.sendMsg(dcChat.getId(), msg) == 0) {
|
||||
Util.runOnMain(()-> Toast.makeText(ConversationActivity.this, dcContext.getLastError(), Toast.LENGTH_LONG).show());
|
||||
return null;
|
||||
if(msg!=null) {
|
||||
boolean doSend = true;
|
||||
if (recompress==DcMsg.DC_MSG_VIDEO) {
|
||||
Util.runOnMain(() -> {
|
||||
if (isFinishing()) return;
|
||||
progressDialog = ProgressDialog.show(
|
||||
ConversationActivity.this,
|
||||
"",
|
||||
getString(R.string.one_moment),
|
||||
true,
|
||||
false
|
||||
);
|
||||
});
|
||||
doSend = VideoRecoder.prepareVideo(ConversationActivity.this, dcChat.getId(), msg);
|
||||
Util.runOnMain(() -> {
|
||||
try {
|
||||
if (progressDialog != null) progressDialog.dismiss();
|
||||
} catch (final IllegalArgumentException e) {
|
||||
// The activity is finishing/destroyed, do nothing.
|
||||
}
|
||||
}
|
||||
|
||||
Util.runOnMain(()-> sendComplete(dcChat.getId()));
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
dcContext.setDraft(dcChat.getId(), msg);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Void result) {
|
||||
future.set(chatId);
|
||||
if (doSend) {
|
||||
if (dcContext.sendMsg(dcChat.getId(), msg) == 0) {
|
||||
Util.runOnMain(()-> Toast.makeText(ConversationActivity.this, dcContext.getLastError(), Toast.LENGTH_LONG).show());
|
||||
future.set(chatId);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Util.runOnMain(() -> sendComplete(dcChat.getId()));
|
||||
}
|
||||
} else {
|
||||
dcContext.setDraft(dcChat.getId(), msg);
|
||||
}
|
||||
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, msg, recompress);
|
||||
future.set(chatId);
|
||||
});
|
||||
|
||||
return future;
|
||||
}
|
||||
@@ -1359,8 +1379,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
else {
|
||||
processComposeControls(ACTION_SEND_OUT);
|
||||
DcHelper.getNotificationCenter(ConversationActivity.this).maybePlaySendSound(dcChat);
|
||||
processComposeControls(ACTION_SEND_OUT).addListener(new AssertedSuccessListener<Integer>() {
|
||||
@Override
|
||||
public void onSuccess(Integer chatId) {
|
||||
DcHelper.getNotificationCenter(ConversationActivity.this).maybePlaySendSound(dcChat);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1594,7 +1618,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
public void initializeContactRequest() {
|
||||
if (!dcChat.isHalfBlocked()) {
|
||||
if (!dcChat.isContactRequest()) {
|
||||
messageRequestBottomView.setVisibility(View.GONE);
|
||||
return;
|
||||
}
|
||||
@@ -1607,15 +1631,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
});
|
||||
|
||||
|
||||
if (dcChat.isProtectionBroken()) {
|
||||
messageRequestBottomView.setBlockText(R.string.more_info_desktop);
|
||||
String name = dcContext.getContact(recipient.getDcContact().getId()).getDisplayName();
|
||||
messageRequestBottomView.setBlockOnClickListener(v -> DcHelper.showVerificationBrokenDialog(this, name));
|
||||
|
||||
messageRequestBottomView.setQuestion(getString(R.string.chat_protection_broken, name));
|
||||
messageRequestBottomView.setAcceptText(R.string.ok);
|
||||
|
||||
} else if (dcChat.getType() == DcChat.DC_CHAT_TYPE_GROUP) {
|
||||
if (dcChat.getType() == DcChat.DC_CHAT_TYPE_GROUP) {
|
||||
// We don't support blocking groups yet, so offer to delete it instead
|
||||
messageRequestBottomView.setBlockText(R.string.delete);
|
||||
messageRequestBottomView.setBlockOnClickListener(v -> handleDeleteChat());
|
||||
|
||||
@@ -294,7 +294,7 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
|
||||
else if (type==DcMsg.DC_MSG_AUDIO || type==DcMsg.DC_MSG_VOICE) {
|
||||
return dcMsg.isOutgoing()? MESSAGE_TYPE_AUDIO_OUTGOING : MESSAGE_TYPE_AUDIO_INCOMING;
|
||||
}
|
||||
else if (type==DcMsg.DC_MSG_FILE && !dcMsg.isSetupMessage()) {
|
||||
else if (type==DcMsg.DC_MSG_FILE) {
|
||||
return dcMsg.isOutgoing()? MESSAGE_TYPE_DOCUMENT_OUTGOING : MESSAGE_TYPE_DOCUMENT_INCOMING;
|
||||
}
|
||||
else if (type==DcMsg.DC_MSG_IMAGE || type==DcMsg.DC_MSG_GIF || type==DcMsg.DC_MSG_VIDEO) {
|
||||
|
||||
@@ -25,9 +25,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextWatcher;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
@@ -38,12 +36,10 @@ import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
@@ -173,8 +169,8 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
private void setNoMessageText() {
|
||||
DcChat dcChat = getListAdapter().getChat();
|
||||
if(dcChat.isMultiUser()){
|
||||
if (dcChat.isBroadcast()) {
|
||||
noMessageTextView.setText(R.string.chat_new_broadcast_hint);
|
||||
if (dcChat.isInBroadcast() || dcChat.isOutBroadcast()) {
|
||||
noMessageTextView.setText(R.string.chat_new_channel_hint);
|
||||
} else if (dcChat.isUnpromoted()) {
|
||||
noMessageTextView.setText(R.string.chat_new_group_hint);
|
||||
}
|
||||
@@ -321,25 +317,35 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
return;
|
||||
}
|
||||
|
||||
menu.findItem(R.id.menu_toggle_save).setVisible(false);
|
||||
|
||||
if (messageRecords.size() > 1) {
|
||||
menu.findItem(R.id.menu_context_details).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_share).setVisible(false);
|
||||
//menu.findItem(R.id.menu_context_reply).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_reply).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_edit).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_reply_privately).setVisible(false);
|
||||
menu.findItem(R.id.menu_add_to_home_screen).setVisible(false);
|
||||
//menu.findItem(R.id.menu_toggle_save).setVisible(false);
|
||||
} else {
|
||||
DcMsg messageRecord = messageRecords.iterator().next();
|
||||
DcChat chat = getListAdapter().getChat();
|
||||
menu.findItem(R.id.menu_context_details).setVisible(true);
|
||||
menu.findItem(R.id.menu_context_share).setVisible(messageRecord.hasFile());
|
||||
boolean canReply = canReplyToMsg(messageRecord);
|
||||
//menu.findItem(R.id.menu_context_reply).setVisible(chat.canSend() && canReply);
|
||||
boolean canEdit = canEditMsg(messageRecord);
|
||||
menu.findItem(R.id.menu_context_edit).setVisible(chat.canSend() && canEdit);
|
||||
boolean showReplyPrivately = !dcContext.isCommunity() && chat.isMultiUser() && !messageRecord.isOutgoing() && canReply;
|
||||
menu.findItem(R.id.menu_context_reply).setVisible(chat.canSend() && canReply);
|
||||
menu.findItem(R.id.menu_context_edit).setVisible(chat.isEncrypted() && chat.canSend() && canEditMsg(messageRecord));
|
||||
boolean showReplyPrivately = chat.isMultiUser() && !messageRecord.isOutgoing() && canReply;
|
||||
menu.findItem(R.id.menu_context_reply_privately).setVisible(showReplyPrivately);
|
||||
menu.findItem(R.id.menu_add_to_home_screen).setVisible(messageRecord.getType() == DcMsg.DC_MSG_WEBXDC);
|
||||
|
||||
/*
|
||||
boolean saved = messageRecord.getSavedMsgId() != 0;
|
||||
MenuItem toggleSave = menu.findItem(R.id.menu_toggle_save);
|
||||
toggleSave.setVisible(messageRecord.canSave() && !chat.isSelfTalk());
|
||||
toggleSave.setIcon(saved? R.drawable.baseline_bookmark_remove_24 : R.drawable.baseline_bookmark_border_24);
|
||||
toggleSave.setTitle(saved? R.string.unsave : R.string.save);
|
||||
*/
|
||||
}
|
||||
|
||||
// if one of the selected items cannot be saved, disable saving.
|
||||
@@ -511,6 +517,15 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
}
|
||||
}
|
||||
|
||||
private void handleToggleSave(final Set<DcMsg> messageRecords) {
|
||||
DcMsg msg = getSelectedMessageRecord(messageRecords);
|
||||
if (msg.getSavedMsgId() != 0) {
|
||||
dcContext.deleteMsgs(new int[]{msg.getSavedMsgId()});
|
||||
} else {
|
||||
dcContext.saveMsgs(new int[]{msg.getId()});
|
||||
}
|
||||
}
|
||||
|
||||
private void reloadList() {
|
||||
reloadList(false);
|
||||
}
|
||||
@@ -725,80 +740,6 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
Util.runOnAnyBackgroundThread(() -> dcContext.markseenMsgs(ids));
|
||||
}
|
||||
|
||||
|
||||
void querySetupCode(final DcMsg dcMsg, String[] preload)
|
||||
{
|
||||
if( !dcMsg.isSetupMessage()) {
|
||||
return;
|
||||
}
|
||||
|
||||
View gl = View.inflate(getActivity(), R.layout.setup_code_grid, null);
|
||||
final EditText[] editTexts = {
|
||||
gl.findViewById(R.id.setupCode0), gl.findViewById(R.id.setupCode1), gl.findViewById(R.id.setupCode2),
|
||||
gl.findViewById(R.id.setupCode3), gl.findViewById(R.id.setupCode4), gl.findViewById(R.id.setupCode5),
|
||||
gl.findViewById(R.id.setupCode6), gl.findViewById(R.id.setupCode7), gl.findViewById(R.id.setupCode8)
|
||||
};
|
||||
AlertDialog.Builder builder1 = new AlertDialog.Builder(getActivity());
|
||||
builder1.setView(gl);
|
||||
editTexts[0].setText(dcMsg.getSetupCodeBegin());
|
||||
editTexts[0].setSelection(editTexts[0].getText().length());
|
||||
|
||||
for( int i = 0; i < 9; i++ ) {
|
||||
if( preload != null && i < preload.length ) {
|
||||
editTexts[i].setText(preload[i]);
|
||||
editTexts[i].setSelection(editTexts[i].getText().length());
|
||||
}
|
||||
editTexts[i].addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
if( s.length()==4 ) {
|
||||
for ( int i = 0; i < 8; i++ ) {
|
||||
if( editTexts[i].hasFocus() && editTexts[i+1].getText().length()<4 ) {
|
||||
editTexts[i+1].requestFocus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
builder1.setTitle(getActivity().getString(R.string.autocrypt_continue_transfer_title));
|
||||
builder1.setMessage(getActivity().getString(R.string.autocrypt_continue_transfer_please_enter_code));
|
||||
builder1.setNegativeButton(android.R.string.cancel, null);
|
||||
builder1.setCancelable(false); // prevent the dialog from being dismissed accidentally (when the dialog is closed, the setup code is gone forever and the user has to create a new setup message)
|
||||
builder1.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
String setup_code = "";
|
||||
final String[] preload1 = new String[9];
|
||||
for ( int i = 0; i < 9; i++ ) {
|
||||
preload1[i] = editTexts[i].getText().toString();
|
||||
setup_code += preload1[i];
|
||||
}
|
||||
boolean success = dcContext.continueKeyTransfer(dcMsg.getId(), setup_code);
|
||||
|
||||
AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity());
|
||||
builder2.setTitle(getActivity().getString(R.string.autocrypt_continue_transfer_title));
|
||||
builder2.setMessage(getActivity().getString(success? R.string.autocrypt_continue_transfer_succeeded : R.string.autocrypt_bad_setup_code));
|
||||
if( success ) {
|
||||
builder2.setPositiveButton(android.R.string.ok, null);
|
||||
}
|
||||
else {
|
||||
builder2.setNegativeButton(android.R.string.cancel, null);
|
||||
builder2.setPositiveButton(R.string.autocrypt_continue_transfer_retry, (dialog1, which1) -> querySetupCode(dcMsg, preload1));
|
||||
}
|
||||
builder2.show();
|
||||
});
|
||||
builder1.show();
|
||||
}
|
||||
|
||||
private class ConversationFragmentItemClickListener implements ItemClickListener {
|
||||
|
||||
@Override
|
||||
@@ -818,9 +759,6 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
actionMode.setTitleOptionalHint(false); // the title represents important information, also indicating implicitly, more items can be selected
|
||||
}
|
||||
}
|
||||
else if(messageRecord.isSetupMessage()) {
|
||||
querySetupCode(messageRecord,null);
|
||||
}
|
||||
else if (messageRecord.getType()==DcMsg.DC_MSG_VIDEOCHAT_INVITATION) {
|
||||
new VideochatUtil().join(getActivity(), messageRecord.getId());
|
||||
}
|
||||
@@ -828,18 +766,29 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
DozeReminder.dozeReminderTapped(getContext());
|
||||
}
|
||||
else if(messageRecord.getInfoType() == DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE) {
|
||||
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord.getParent(), messageRecord.getWebxdcHref());
|
||||
if (messageRecord.getParent() != null) {
|
||||
// if the parent webxdc message still exists
|
||||
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord.getParent(), messageRecord.getWebxdcHref());
|
||||
}
|
||||
}
|
||||
else if (!TextUtils.isEmpty(messageRecord.getPOILocation()) && messageRecord.getType() == DcMsg.DC_MSG_TEXT && !messageRecord.hasHtml()) {
|
||||
WebxdcActivity.openMaps(getContext(), getListAdapter().getChat().getId(), "index.html#"+messageRecord.getPOILocation());
|
||||
}
|
||||
else {
|
||||
String self_mail = dcContext.getConfig("configured_mail_user");
|
||||
if (self_mail != null && !self_mail.isEmpty()
|
||||
&& 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(), RegistrationActivity.class));
|
||||
int infoContactId = messageRecord.getInfoContactId();
|
||||
if (infoContactId != 0 && infoContactId != DC_CONTACT_ID_SELF) {
|
||||
Intent intent = new Intent(getContext(), ProfileActivity.class);
|
||||
intent.putExtra(ProfileActivity.CONTACT_ID_EXTRA, infoContactId);
|
||||
startActivity(intent);
|
||||
}
|
||||
else {
|
||||
String self_mail = dcContext.getConfig("configured_mail_user");
|
||||
if (self_mail != null && !self_mail.isEmpty()
|
||||
&& 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(), RegistrationActivity.class));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -851,9 +800,6 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
list.getAdapter().notifyDataSetChanged();
|
||||
|
||||
actionMode = ((AppCompatActivity)getActivity()).startSupportActionMode(actionModeCallback);
|
||||
|
||||
if (dcContext.isCommunity()) return;
|
||||
|
||||
addReactionView.show(messageRecord, view, () -> {
|
||||
if (actionMode != null) {
|
||||
actionMode.finish();
|
||||
@@ -901,7 +847,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
public void onShowFullClicked(DcMsg messageRecord) {
|
||||
Intent intent = new Intent(getActivity(), FullMsgActivity.class);
|
||||
intent.putExtra(FullMsgActivity.MSG_ID_EXTRA, messageRecord.getId());
|
||||
intent.putExtra(FullMsgActivity.BLOCK_LOADING_REMOTE, getListAdapter().getChat().isHalfBlocked());
|
||||
intent.putExtra(FullMsgActivity.BLOCK_LOADING_REMOTE, getListAdapter().getChat().isContactRequest());
|
||||
startActivity(intent);
|
||||
getActivity().overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
|
||||
}
|
||||
@@ -995,10 +941,10 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
} else if (itemId == R.id.menu_context_save_attachment) {
|
||||
handleSaveAttachment(getListAdapter().getSelectedItems());
|
||||
return true;
|
||||
// } else if (itemId == R.id.menu_context_reply) {
|
||||
// handleReplyMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
|
||||
// actionMode.finish();
|
||||
// return true;
|
||||
} else if (itemId == R.id.menu_context_reply) {
|
||||
handleReplyMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
|
||||
actionMode.finish();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_context_edit) {
|
||||
handleEditMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
|
||||
actionMode.finish();
|
||||
@@ -1009,9 +955,12 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
} else if (itemId == R.id.menu_resend) {
|
||||
handleResendMessage(getListAdapter().getSelectedItems());
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_toggle_save) {
|
||||
handleToggleSave(getListAdapter().getSelectedItems());
|
||||
actionMode.finish();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
{
|
||||
bind(messageRecord, dcChat, batchSelected, pulseHighlight, recipients);
|
||||
this.glideRequests = glideRequests;
|
||||
this.showSender = dcContext.isCommunity() || ((dcChat.isMultiUser() || dcChat.isSelfTalk()) && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
|
||||
this.showSender = ((dcChat.isMultiUser() || dcChat.isSelfTalk()) && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
|
||||
|
||||
if (showSender) {
|
||||
this.dcContact = dcContext.getContact(messageRecord.getFromId());
|
||||
@@ -270,11 +270,10 @@ public class ConversationItem extends BaseConversationItem
|
||||
R.attr.conversation_item_incoming_bubble_color,
|
||||
R.attr.conversation_item_outgoing_bubble_color,
|
||||
};
|
||||
final TypedArray attrs = context.obtainStyledAttributes(attributes);
|
||||
|
||||
incomingBubbleColor = attrs.getColor(0, Color.WHITE);
|
||||
outgoingBubbleColor = attrs.getColor(1, Color.WHITE);
|
||||
attrs.recycle();
|
||||
try (TypedArray attrs = context.obtainStyledAttributes(attributes)) {
|
||||
incomingBubbleColor = attrs.getColor(0, Color.WHITE);
|
||||
outgoingBubbleColor = attrs.getColor(1, Color.WHITE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -391,7 +390,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
}
|
||||
|
||||
private boolean hasDocument(DcMsg dcMsg) {
|
||||
return dcMsg.getType()==DcMsg.DC_MSG_FILE && !dcMsg.isSetupMessage();
|
||||
return dcMsg.getType()==DcMsg.DC_MSG_FILE;
|
||||
}
|
||||
|
||||
private void setBodyText(DcMsg messageRecord) {
|
||||
@@ -400,11 +399,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
|
||||
String text = messageRecord.getText();
|
||||
|
||||
if (messageRecord.isSetupMessage()) {
|
||||
bodyText.setText(context.getString(R.string.autocrypt_asm_click_body));
|
||||
bodyText.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else if (text.isEmpty()) {
|
||||
if (text.isEmpty()) {
|
||||
bodyText.setVisibility(View.GONE);
|
||||
}
|
||||
else {
|
||||
@@ -442,10 +437,10 @@ public class ConversationItem extends BaseConversationItem
|
||||
showFullButton.setVisibility(View.GONE);
|
||||
msgActionButton.setVisibility(View.VISIBLE);
|
||||
msgActionButton.setEnabled(true);
|
||||
msgActionButton.setText(webxdcViewStub.get().isCommunity()? R.string.join: R.string.start_app);
|
||||
msgActionButton.setText(R.string.start_app);
|
||||
msgActionButton.setOnClickListener(view -> {
|
||||
if (batchSelected.isEmpty()) {
|
||||
DcHelper.openWebxdc(getContext(), messageRecord);
|
||||
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord);
|
||||
} else {
|
||||
passthroughClickListener.onClick(view);
|
||||
}
|
||||
@@ -679,9 +674,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
if (!showSender || dcContact ==null) {
|
||||
contactPhoto.setVisibility(View.GONE);
|
||||
} else {
|
||||
int color = messageRecord.getSenderColor();
|
||||
Recipient recipient = new Recipient(context, dcContact, messageRecord.getSenderName(dcContact), color);
|
||||
contactPhoto.setAvatar(glideRequests, recipient, true);
|
||||
contactPhoto.setAvatar(glideRequests, new Recipient(context, dcContact), true);
|
||||
contactPhoto.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
@@ -706,7 +699,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
Recipient author = null;
|
||||
SlideDeck slideDeck = new SlideDeck();
|
||||
if (msg != null) {
|
||||
author = new Recipient(context, dcContext.getContact(msg.getFromId()), msg.getSenderColor());
|
||||
author = new Recipient(context, dcContext.getContact(msg.getFromId()));
|
||||
if (msg.getType() != DcMsg.DC_MSG_TEXT) {
|
||||
Slide slide = MediaUtil.getSlideForMsg(context, msg);
|
||||
if (slide != null) {
|
||||
@@ -814,8 +807,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
}
|
||||
else if (showSender && dcContact !=null) {
|
||||
this.groupSender.setText(messageRecord.getSenderName(dcContact));
|
||||
int color = messageRecord.getSenderColor();
|
||||
this.groupSender.setTextColor(Util.rgbToArgbColor(color!=0? color : dcContact.getColor()));
|
||||
this.groupSender.setTextColor(Util.rgbToArgbColor(dcContact.getColor()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -898,7 +890,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
if (shouldInterceptClicks(messageRecord) || !batchSelected.isEmpty()) {
|
||||
performClick();
|
||||
} else if (slide.isWebxdcDocument()) {
|
||||
msgActionButton.performClick();
|
||||
WebxdcActivity.openWebxdcActivity(context, messageRecord);
|
||||
} else if (slide.isVcard()) {
|
||||
try {
|
||||
String path = slide.asAttachment().getRealPath(context);
|
||||
@@ -908,7 +900,7 @@ public class ConversationItem extends BaseConversationItem
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
try {
|
||||
List<Integer> contactIds = rpc.importVcard(dcContext.getAccountId(), path);
|
||||
if (contactIds.size() > 0) {
|
||||
if (!contactIds.isEmpty()) {
|
||||
int chatId = dcContext.createChatByContactId(contactIds.get(0));
|
||||
if (chatId != 0) {
|
||||
Intent intent = new Intent(context, ConversationActivity.class);
|
||||
|
||||
@@ -112,7 +112,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_1_50_0_android";
|
||||
final String deviceMsgLabel = "update_2_0_0_android-h";
|
||||
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
|
||||
DcMsg msg = null;
|
||||
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
|
||||
@@ -123,7 +123,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
// Util.copy(inputStream, new FileOutputStream(outputFile));
|
||||
// msg.setFile(outputFile, "image/jpeg");
|
||||
|
||||
msg.setText(getString(R.string.update_1_50_android, "https://lemmy.ml/c/ArcaneChat"));
|
||||
msg.setText(getString(R.string.update_2_0, "https://arcanechat.me/#contribute"));
|
||||
}
|
||||
dcContext.addDeviceMsg(deviceMsgLabel, msg);
|
||||
|
||||
@@ -136,19 +136,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, deviceMsgLabel);
|
||||
}
|
||||
|
||||
// add info about moved "switch profile" option; added 2024-08, can be removed after ~3 months
|
||||
if (!Prefs.getBooleanPreference(this, "info_about_switch_profile_added", false)) {
|
||||
final DcAccounts dcAccounts = DcHelper.getAccounts(this);
|
||||
if (dcAccounts.getAll().length >= 2) {
|
||||
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
msg.setText(getString(R.string.update_switch_profile_placement));
|
||||
dcContext.addDeviceMsg("info_about_switch_profile", msg);
|
||||
}
|
||||
Prefs.setBooleanPreference(this, "info_about_switch_profile_added", true);
|
||||
}
|
||||
// /add info
|
||||
|
||||
|
||||
// remove gmail oauth2
|
||||
final int serverFlags = dcContext.getConfigInt(CONFIG_SERVER_FLAGS);
|
||||
if ((serverFlags & DcContext.DC_LP_AUTH_OAUTH2)!=0) {
|
||||
@@ -197,6 +184,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
refresh();
|
||||
|
||||
if (BuildConfig.DEBUG) checkNdkArchitecture();
|
||||
|
||||
DcHelper.maybeShowMigrationError(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -301,6 +290,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
} else {
|
||||
title.setText(DcHelper.getContext(this).getName());
|
||||
// refreshTitle is called by ConversationListFragment when connectivity changes so update connectivity dot here
|
||||
selfAvatar.setConnectivity(DcHelper.getContext(this).getConnectivity());
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
|
||||
}
|
||||
@@ -454,7 +444,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_all_media) {
|
||||
startActivity(new Intent(this, ProfileActivity.class));
|
||||
startActivity(new Intent(this, AllMediaActivity.class));
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_public_bots) {
|
||||
handleShowBot("botsindex@arcanechat.me", "https://i.delta.chat/#67889B0362BEDBFEE05ACD92C1D737FA632A9582&a=botsindex%40arcanechat.me&n=Public%20Bots&i=336MTEz38EH-RJxM9OKWygYK&s=TpVVGK6C4KrJmRG0bwHLalXt");
|
||||
|
||||
@@ -21,6 +21,7 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
{
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle, boolean ready) {
|
||||
setContentView(R.layout.activity_conversation_list_archive);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
if (isRelayingMessageContent(this)) {
|
||||
getSupportActionBar().setTitle(isSharing(this) ? R.string.chat_share_with_title : R.string.forward_to);
|
||||
@@ -31,7 +32,7 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putBoolean(ConversationListFragment.ARCHIVE, true);
|
||||
initFragment(android.R.id.content, new ConversationListFragment(), bundle);
|
||||
initFragment(R.id.fragment, new ConversationListFragment(), bundle);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -80,6 +80,7 @@ public class ConversationListFragment extends BaseConversationListFragment
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(requireActivity());
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_MSGS_NOTICED, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CHAT_DELETED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_MSGS_CHANGED, this);
|
||||
@@ -321,7 +322,10 @@ public class ConversationListFragment extends BaseConversationListFragment
|
||||
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
if (event.getAccountId() != DcHelper.getContext(requireActivity()).getAccountId()) {
|
||||
final int accId = event.getAccountId();
|
||||
if (event.getId() == DcContext.DC_EVENT_CHAT_DELETED) {
|
||||
DcHelper.getNotificationCenter(requireActivity()).removeNotifications(accId, event.getData1Int());
|
||||
} else if (accId != DcHelper.getContext(requireActivity()).getAccountId()) {
|
||||
Activity activity = getActivity();
|
||||
if (activity instanceof ConversationListActivity) {
|
||||
((ConversationListActivity) activity).refreshUnreadIndicator();
|
||||
|
||||
@@ -35,7 +35,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.amulyakhare.textdrawable.TextDrawable;
|
||||
import com.annimon.stream.Stream;
|
||||
import com.b44t.messenger.DcChat;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcContext;
|
||||
@@ -55,7 +54,6 @@ import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class ConversationListItem extends RelativeLayout
|
||||
@@ -64,11 +62,9 @@ public class ConversationListItem extends RelativeLayout
|
||||
private final static Typeface BOLD_TYPEFACE = Typeface.create("sans-serif-medium", Typeface.NORMAL);
|
||||
private final static Typeface LIGHT_TYPEFACE = Typeface.create("sans-serif", Typeface.NORMAL);
|
||||
|
||||
private DcLot dcSummary;
|
||||
private Set<Long> selectedThreads;
|
||||
private long chatId;
|
||||
private int msgId;
|
||||
private GlideRequests glideRequests;
|
||||
private TextView subjectView;
|
||||
private FromTextView fromView;
|
||||
private TextView dateView;
|
||||
@@ -122,12 +118,10 @@ public class ConversationListItem extends RelativeLayout
|
||||
boolean batchMode,
|
||||
@Nullable String highlightSubstring)
|
||||
{
|
||||
this.dcSummary = dcSummary;
|
||||
this.selectedThreads = selectedThreads;
|
||||
Recipient recipient = thread.getRecipient();
|
||||
this.chatId = thread.getThreadId();
|
||||
this.msgId = msgId;
|
||||
this.glideRequests = glideRequests;
|
||||
|
||||
int state = dcSummary.getState();
|
||||
int unreadCount = thread.getUnreadCount();
|
||||
@@ -138,6 +132,7 @@ public class ConversationListItem extends RelativeLayout
|
||||
this.fromView.setText(recipient, state!=DcMsg.DC_STATE_IN_FRESH);
|
||||
}
|
||||
|
||||
subjectView.setVisibility(chatId == DcChat.DC_CHAT_ID_ARCHIVED_LINK? GONE : VISIBLE);
|
||||
this.subjectView.setText(thread.getDisplayBody());
|
||||
this.subjectView.setTypeface(state==DcMsg.DC_STATE_IN_FRESH ? BOLD_TYPEFACE : LIGHT_TYPEFACE);
|
||||
this.subjectView.setTextColor(state==DcMsg.DC_STATE_IN_FRESH ? ThemeUtil.getThemedColor(getContext(), R.attr.conversation_list_item_unread_color)
|
||||
@@ -163,9 +158,10 @@ public class ConversationListItem extends RelativeLayout
|
||||
this.avatar.setAvatar(glideRequests, recipient, false);
|
||||
|
||||
DcContact contact = recipient.getDcContact();
|
||||
avatar.setSeenRecently(contact!=null? contact.wasSeenRecently() : false);
|
||||
avatar.setSeenRecently(contact != null && contact.wasSeenRecently());
|
||||
|
||||
boolean isProtected = thread.isProtected() || DcHelper.getContext(getContext()).getChat((int)chatId).isDeviceTalk();
|
||||
DcChat dcChat = DcHelper.getContext(getContext()).getChat((int)chatId);
|
||||
boolean isProtected = dcChat.isDeviceTalk() || dcChat.isSelfTalk();
|
||||
|
||||
fromView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
thread.isMuted()? R.drawable.ic_volume_off_grey600_18dp : 0,
|
||||
@@ -180,11 +176,10 @@ public class ConversationListItem extends RelativeLayout
|
||||
{
|
||||
this.selectedThreads = Collections.emptySet();
|
||||
Recipient recipient = new Recipient(getContext(), contact);
|
||||
this.glideRequests = glideRequests;
|
||||
|
||||
fromView.setText(getHighlightedSpan(contact.getDisplayName(), highlightSubstring));
|
||||
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, contact.isVerified()? R.drawable.ic_verified : 0, 0);
|
||||
subjectView.setText(getHighlightedSpan(contact.getAddr(), highlightSubstring));
|
||||
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
subjectView.setVisibility(GONE);
|
||||
dateView.setText("");
|
||||
dateView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
archivedBadgeView.setVisibility(GONE);
|
||||
@@ -205,10 +200,10 @@ public class ConversationListItem extends RelativeLayout
|
||||
DcContact sender = dcContext.getContact(messageResult.getFromId());
|
||||
this.selectedThreads = Collections.emptySet();
|
||||
Recipient recipient = new Recipient(getContext(), sender);
|
||||
this.glideRequests = glideRequests;
|
||||
|
||||
fromView.setText(recipient, true);
|
||||
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||
subjectView.setVisibility(VISIBLE);
|
||||
subjectView.setText(getHighlightedSpan(messageResult.getSummarytext(512), highlightSubstring));
|
||||
|
||||
long timestamp = messageResult.getTimestamp();
|
||||
@@ -312,9 +307,9 @@ public class ConversationListItem extends RelativeLayout
|
||||
if (thread!=null && thread.getVisibility()==DcChat.DC_CHAT_VISIBILITY_PINNED) {
|
||||
bg = R.attr.pinned_list_item_background;
|
||||
}
|
||||
TypedArray ta = getContext().obtainStyledAttributes(new int[] { bg });
|
||||
ViewUtil.setBackground(this, ta.getDrawable(0));
|
||||
ta.recycle();
|
||||
try (TypedArray ta = getContext().obtainStyledAttributes(new int[]{bg})) {
|
||||
ViewUtil.setBackground(this, ta.getDrawable(0));
|
||||
}
|
||||
}
|
||||
|
||||
private Spanned getHighlightedSpan(@Nullable String value,
|
||||
@@ -332,12 +327,12 @@ public class ConversationListItem extends RelativeLayout
|
||||
|
||||
String normalizedValue = value.toLowerCase(Util.getLocale());
|
||||
String normalizedTest = highlight.toLowerCase(Util.getLocale());
|
||||
List<String> testTokens = Stream.of(normalizedTest.split(" ")).filter(s -> s.trim().length() > 0).toList();
|
||||
|
||||
Spannable spanned = new SpannableString(value);
|
||||
int searchStartIndex = 0;
|
||||
|
||||
for (String token : testTokens) {
|
||||
for (String token : normalizedTest.split(" ")) {
|
||||
if (token.trim().isEmpty()) continue;
|
||||
if (searchStartIndex >= spanned.length()) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -71,17 +71,6 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
title.setText(dcChat.getName());
|
||||
String subtitleStr = null;
|
||||
|
||||
// set icons etc.
|
||||
int imgLeft = 0;
|
||||
int imgRight = 0;
|
||||
|
||||
if (dcChat.isMuted()) {
|
||||
imgLeft = R.drawable.ic_volume_off_white_18dp;
|
||||
}
|
||||
if (dcChat.isProtected() || dcChat.isDeviceTalk()) {
|
||||
imgRight = R.drawable.ic_verified;
|
||||
}
|
||||
|
||||
boolean isOnline = false;
|
||||
int[] chatContacts = dcContext.getChatContacts(chatId);
|
||||
if (dcChat.isMailingList()) {
|
||||
@@ -93,16 +82,15 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
subtitleStr = context.getString(R.string.super_group);
|
||||
}
|
||||
}
|
||||
} else if (dcChat.isBroadcast()) {
|
||||
} else if (dcChat.isInBroadcast()) {
|
||||
subtitleStr = context.getString(R.string.channel);
|
||||
} else if (dcChat.isOutBroadcast()) {
|
||||
if (!profileView) {
|
||||
subtitleStr = context.getResources().getQuantityString(R.plurals.n_recipients, chatContacts.length, chatContacts.length);
|
||||
}
|
||||
} else if( dcChat.isMultiUser() ) {
|
||||
if (!profileView) {
|
||||
if (dcContext.isCommunity() && chatContacts.length == 1)
|
||||
subtitleStr = context.getString(R.string.super_group);
|
||||
else
|
||||
subtitleStr = context.getResources().getQuantityString(R.plurals.n_members, chatContacts.length, chatContacts.length);
|
||||
subtitleStr = context.getResources().getQuantityString(R.plurals.n_members, chatContacts.length, chatContacts.length);
|
||||
}
|
||||
} else if( chatContacts.length>=1 ) {
|
||||
if( dcChat.isSelfTalk() ) {
|
||||
@@ -114,7 +102,7 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
else {
|
||||
DcContact dcContact = dcContext.getContact(chatContacts[0]);
|
||||
isOnline = dcContact.wasSeenRecently();
|
||||
if (profileView) {
|
||||
if (profileView || !dcChat.isEncrypted()) {
|
||||
subtitleStr = dcContact.getAddr();
|
||||
} else if (dcContact.isBot()) {
|
||||
subtitleStr = context.getString(R.string.bot);
|
||||
@@ -122,9 +110,7 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
subtitleStr = context.getString(R.string.online);
|
||||
} else {
|
||||
long timestamp = dcContact.getLastSeen();
|
||||
if (timestamp == 0) {
|
||||
subtitleStr = dcContact.getAddr();
|
||||
} else {
|
||||
if (timestamp >= 0) {
|
||||
subtitleStr = context.getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(context, timestamp));
|
||||
}
|
||||
}
|
||||
@@ -133,6 +119,8 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
|
||||
avatar.setAvatar(glideRequests, new Recipient(getContext(), dcChat), false);
|
||||
avatar.setSeenRecently(isOnline);
|
||||
int imgLeft = dcChat.isMuted()? R.drawable.ic_volume_off_white_18dp : 0;
|
||||
int imgRight = dcChat.isSelfTalk() || dcChat.isDeviceTalk()? R.drawable.ic_verified : 0;
|
||||
title.setCompoundDrawablesWithIntrinsicBounds(imgLeft, 0, imgRight, 0);
|
||||
if (!TextUtils.isEmpty(subtitleStr)) {
|
||||
subtitle.setText(subtitleStr);
|
||||
@@ -151,13 +139,7 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
avatar.setAvatar(glideRequests, new Recipient(getContext(), contact), false);
|
||||
avatar.setSeenRecently(contact.wasSeenRecently());
|
||||
|
||||
int imgRight = 0;
|
||||
if (contact.isVerified()) {
|
||||
imgRight = R.drawable.ic_verified;
|
||||
}
|
||||
|
||||
title.setText(contact.getDisplayName());
|
||||
title.setCompoundDrawablesWithIntrinsicBounds(0, 0, imgRight, 0);
|
||||
subtitle.setText(contact.getAddr());
|
||||
subtitle.setVisibility(View.VISIBLE);
|
||||
}
|
||||
@@ -175,8 +157,4 @@ public class ConversationTitleView extends RelativeLayout {
|
||||
public void setOnBackClickedListener(@Nullable OnClickListener listener) {
|
||||
this.back.setOnClickListener(listener);
|
||||
}
|
||||
|
||||
public void registerForContextMenu(Activity activity) {
|
||||
activity.registerForContextMenu(content);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ public class ConversationUpdateItem extends BaseConversationItem
|
||||
{
|
||||
private DeliveryStatusView deliveryStatusView;
|
||||
private AppCompatImageView appIcon;
|
||||
private AppCompatImageView verifiedIcon;
|
||||
private int textColor;
|
||||
|
||||
public ConversationUpdateItem(Context context) {
|
||||
@@ -46,7 +45,6 @@ public class ConversationUpdateItem extends BaseConversationItem
|
||||
bodyText = findViewById(R.id.conversation_update_body);
|
||||
deliveryStatusView = new DeliveryStatusView(findViewById(R.id.delivery_indicator));
|
||||
appIcon = findViewById(R.id.app_icon);
|
||||
verifiedIcon = findViewById(R.id.verified_icon);
|
||||
|
||||
|
||||
bodyText.setOnLongClickListener(passthroughClickListener);
|
||||
@@ -113,16 +111,6 @@ public class ConversationUpdateItem extends BaseConversationItem
|
||||
appIcon.setVisibility(GONE);
|
||||
}
|
||||
|
||||
if (infoType == DcMsg.DC_INFO_PROTECTION_ENABLED) {
|
||||
verifiedIcon.setVisibility(VISIBLE);
|
||||
verifiedIcon.setImageResource(R.drawable.ic_verified);
|
||||
} else if (infoType == DcMsg.DC_INFO_PROTECTION_DISABLED) {
|
||||
verifiedIcon.setVisibility(VISIBLE);
|
||||
verifiedIcon.setImageResource(R.drawable.ic_verified_broken);
|
||||
} else {
|
||||
verifiedIcon.setVisibility(GONE);
|
||||
}
|
||||
|
||||
bodyText.setText(messageRecord.getDisplayBody());
|
||||
bodyText.setVisibility(VISIBLE);
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ import org.thoughtcrime.securesms.mms.AttachmentManager;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||
import org.thoughtcrime.securesms.profiles.AvatarHelper;
|
||||
import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints;
|
||||
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
@@ -60,7 +59,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
private InputAwareLayout container;
|
||||
private ImageView avatar;
|
||||
private EditText name;
|
||||
private EditText overridenName;
|
||||
private EditText statusView;
|
||||
|
||||
private boolean fromWelcome;
|
||||
@@ -148,14 +146,13 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
}
|
||||
|
||||
private void setAvatarView(Uri output) {
|
||||
final ProfileMediaConstraints constraints = new ProfileMediaConstraints();
|
||||
GlideApp.with(this)
|
||||
.asBitmap()
|
||||
.load(output)
|
||||
.skipMemoryCache(true)
|
||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
.centerCrop()
|
||||
.override(constraints.getImageMaxWidth(this), constraints.getImageMaxHeight(this))
|
||||
.override(AvatarHelper.AVATAR_SIZE, AvatarHelper.AVATAR_SIZE)
|
||||
.into(new SimpleTarget<Bitmap>() {
|
||||
@Override
|
||||
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
|
||||
@@ -184,27 +181,14 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
TextView loginSuccessText = ViewUtil.findById(this, R.id.login_success_text);
|
||||
this.avatar = ViewUtil.findById(this, R.id.avatar);
|
||||
this.name = ViewUtil.findById(this, R.id.name_text);
|
||||
this.overridenName = ViewUtil.findById(this, R.id.overriden_name);
|
||||
this.container = ViewUtil.findById(this, R.id.container);
|
||||
this.statusView = ViewUtil.findById(this, R.id.status_text);
|
||||
|
||||
if (fromWelcome) {
|
||||
if (DcHelper.getContext(this).isCommunity()) {
|
||||
ViewUtil.findById(this, R.id.community_user_container).setVisibility(View.VISIBLE);
|
||||
loginSuccessText.setText(R.string.community_set_name_explain);
|
||||
ViewUtil.findById(this, R.id.avatar_and_name).setVisibility(View.GONE);
|
||||
} else {
|
||||
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
|
||||
}
|
||||
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
|
||||
ViewUtil.findById(this, R.id.status_text_layout).setVisibility(View.GONE);
|
||||
ViewUtil.findById(this, R.id.information_label).setVisibility(View.GONE);
|
||||
} else {
|
||||
if (DcHelper.getContext(this).isCommunity()) {
|
||||
ViewUtil.findById(this, R.id.community_user_container).setVisibility(View.VISIBLE);
|
||||
ViewUtil.findById(this, R.id.information_label).setVisibility(View.GONE);
|
||||
((TextInputLayout)ViewUtil.findById(this, R.id.name)).setHint(R.string.community);
|
||||
((TextInputLayout)ViewUtil.findById(this, R.id.status_text_layout)).setHint(R.string.description);
|
||||
}
|
||||
loginSuccessText.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
@@ -215,10 +199,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
name.setText(profileName);
|
||||
name.setSelection(profileName.length(), profileName.length());
|
||||
}
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
if (dcContext.isCommunity()) {
|
||||
overridenName.setText(dcContext.getCommunityUser());
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeProfileAvatar() {
|
||||
@@ -245,22 +225,16 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
}
|
||||
|
||||
private void updateProfile() {
|
||||
boolean isCommunity = DcHelper.getContext(this).isCommunity();
|
||||
if (TextUtils.isEmpty(this.name.getText()) && !(isCommunity && fromWelcome)) {
|
||||
if (TextUtils.isEmpty(this.name.getText())) {
|
||||
Toast.makeText(this, R.string.please_enter_name, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
final String name = this.name.getText().toString();
|
||||
final String ovName = this.overridenName.getText().toString().trim();
|
||||
|
||||
new AsyncTask<Void, Void, Boolean>() {
|
||||
@Override
|
||||
protected Boolean doInBackground(Void... params) {
|
||||
Context context = CreateProfileActivity.this;
|
||||
if (isCommunity) {
|
||||
DcHelper.getContext(context).setCommunityUser(ovName);
|
||||
}
|
||||
DcHelper.set(context, DcHelper.CONFIG_DISPLAY_NAME, name);
|
||||
setStatusText();
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@ public class EphemeralMessagesDialog {
|
||||
case 5: burnAfter = TimeUnit.DAYS.toSeconds(1); break;
|
||||
case 6: burnAfter = TimeUnit.DAYS.toSeconds(7); break;
|
||||
case 7: burnAfter = TimeUnit.DAYS.toSeconds(35); break;
|
||||
case 8: burnAfter = TimeUnit.DAYS.toSeconds(365); break;
|
||||
default: burnAfter = 0; break;
|
||||
}
|
||||
listener.onTimeSelected(burnAfter);
|
||||
@@ -103,7 +104,10 @@ public class EphemeralMessagesDialog {
|
||||
if (timespan < TimeUnit.DAYS.toSeconds(35)) {
|
||||
return 6; // 1 week
|
||||
}
|
||||
return 7; // 5 weeks
|
||||
if (timespan < TimeUnit.DAYS.toSeconds(365)) {
|
||||
return 7; // 5 weeks
|
||||
}
|
||||
return 8; // 1 year
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import androidx.loader.app.LoaderManager;
|
||||
import com.b44t.messenger.DcChat;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.rpc.RpcException;
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||
import com.bumptech.glide.request.target.CustomTarget;
|
||||
import com.bumptech.glide.request.transition.Transition;
|
||||
@@ -48,17 +49,18 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
{
|
||||
|
||||
public static final String EDIT_GROUP_CHAT_ID = "edit_group_chat_id";
|
||||
public static final String CREATE_BROADCAST = "group_create_broadcast";
|
||||
public static final String CREATE_BROADCAST = "create_broadcast";
|
||||
public static final String UNENCRYPTED = "unencrypted";
|
||||
public static final String CLONE_CHAT_EXTRA = "clone_chat";
|
||||
|
||||
private static final int PICK_CONTACT = 1;
|
||||
public static final int AVATAR_SIZE = 210;
|
||||
private static final int REQUEST_CODE_AVATAR = 2759;
|
||||
|
||||
private DcContext dcContext;
|
||||
|
||||
private boolean verified;
|
||||
private boolean broadcast;
|
||||
private boolean unencrypted;
|
||||
private boolean broadcast;
|
||||
private EditText groupName;
|
||||
private ListView lv;
|
||||
private ImageView avatar;
|
||||
@@ -75,6 +77,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
setContentView(R.layout.group_create_activity);
|
||||
verified = false;
|
||||
broadcast = getIntent().getBooleanExtra(CREATE_BROADCAST, false);
|
||||
unencrypted = getIntent().getBooleanExtra(UNENCRYPTED, false);
|
||||
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
|
||||
|
||||
@@ -88,12 +91,15 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
isEdit = true;
|
||||
DcChat dcChat = dcContext.getChat(groupChatId);
|
||||
verified = dcChat.isProtected();
|
||||
broadcast = dcChat.isBroadcast();
|
||||
broadcast = dcChat.isOutBroadcast();
|
||||
unencrypted = !dcChat.isEncrypted();
|
||||
}
|
||||
|
||||
int chatId = getIntent().getIntExtra(CLONE_CHAT_EXTRA, 0);
|
||||
if (chatId != 0) {
|
||||
broadcast = dcContext.getChat(chatId).isBroadcast();
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
broadcast = dcChat.isOutBroadcast();
|
||||
unencrypted = !dcChat.isEncrypted();
|
||||
}
|
||||
|
||||
initializeResources();
|
||||
@@ -120,7 +126,10 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
title = getString(R.string.global_menu_edit_desktop);
|
||||
}
|
||||
else if(broadcast) {
|
||||
title = getString(R.string.new_broadcast_list);
|
||||
title = getString(R.string.new_channel);
|
||||
}
|
||||
else if(unencrypted) {
|
||||
title = getString(R.string.new_email);
|
||||
}
|
||||
else {
|
||||
title = getString(R.string.menu_new_group);
|
||||
@@ -136,7 +145,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
initializeAvatarView();
|
||||
|
||||
SelectedContactsAdapter adapter = new SelectedContactsAdapter(this, GlideApp.with(this), broadcast);
|
||||
SelectedContactsAdapter adapter = new SelectedContactsAdapter(this, GlideApp.with(this), broadcast, unencrypted);
|
||||
adapter.setItemClickListener(this);
|
||||
lv.setAdapter(adapter);
|
||||
|
||||
@@ -160,9 +169,12 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
if (broadcast) {
|
||||
groupName.setHint(R.string.channel_name);
|
||||
chatHints.setVisibility(View.VISIBLE);
|
||||
} else if (unencrypted) {
|
||||
avatar.setVisibility(View.GONE);
|
||||
groupName.setHint(R.string.broadcast_list_name);
|
||||
chatHints.setVisibility(isEdit()? View.GONE : View.VISIBLE);
|
||||
groupName.setHint(R.string.subject);
|
||||
chatHints.setVisibility(View.GONE);
|
||||
} else {
|
||||
chatHints.setVisibility(View.GONE);
|
||||
}
|
||||
@@ -219,7 +231,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
if (groupChatId != 0) {
|
||||
updateGroup(groupName);
|
||||
} else {
|
||||
verified = !broadcast && allMembersVerified();
|
||||
verified = !unencrypted && !broadcast && allMembersVerified();
|
||||
createGroup(groupName);
|
||||
}
|
||||
|
||||
@@ -244,10 +256,8 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
if (contactId == DcContact.DC_CONTACT_ID_ADD_MEMBER) {
|
||||
Intent intent = new Intent(this, ContactMultiSelectionActivity.class);
|
||||
intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, verified);
|
||||
ArrayList<String> preselectedContacts = new ArrayList<>();
|
||||
for (int id : getAdapter().getContacts()) {
|
||||
preselectedContacts.add(dcContext.getContact(id).getAddr());
|
||||
}
|
||||
intent.putExtra(ContactSelectionListFragment.SELECT_UNENCRYPTED_EXTRA, unencrypted);
|
||||
ArrayList<Integer> preselectedContacts = new ArrayList<>(getAdapter().getContacts());
|
||||
intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts);
|
||||
startActivityForResult(intent, PICK_CONTACT);
|
||||
}
|
||||
@@ -260,8 +270,19 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
private void createGroup(String groupName) {
|
||||
if (broadcast) {
|
||||
groupChatId = dcContext.createBroadcastList();
|
||||
dcContext.setChatName(groupChatId, groupName);
|
||||
try {
|
||||
groupChatId = DcHelper.getRpc(this).createBroadcast(dcContext.getAccountId(), groupName);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
} else if (unencrypted) {
|
||||
try {
|
||||
groupChatId = DcHelper.getRpc(this).createGroupChatUnencrypted(dcContext.getAccountId(), groupName);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
groupChatId = dcContext.createGroupChat(verified, groupName);
|
||||
}
|
||||
@@ -333,9 +354,9 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
case PICK_CONTACT:
|
||||
ArrayList<Integer> contactIds = new ArrayList<>();
|
||||
for (String addr : Objects.requireNonNull(data.getStringArrayListExtra("contacts"))) {
|
||||
if(addr != null) {
|
||||
contactIds.add(dcContext.createContact(null, addr));
|
||||
for (Integer contactId : Objects.requireNonNull(data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA))) {
|
||||
if(contactId != null) {
|
||||
contactIds.add(contactId);
|
||||
}
|
||||
}
|
||||
getAdapter().changeData(contactIds);
|
||||
@@ -354,7 +375,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
.skipMemoryCache(true)
|
||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
.centerCrop()
|
||||
.override(AVATAR_SIZE, AVATAR_SIZE)
|
||||
.override(AvatarHelper.AVATAR_SIZE, AvatarHelper.AVATAR_SIZE)
|
||||
.into(new CustomTarget<Bitmap>() {
|
||||
@Override
|
||||
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
|
||||
|
||||
@@ -34,6 +34,8 @@ import androidx.loader.app.LoaderManager;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.DcLot;
|
||||
import com.b44t.messenger.rpc.Rpc;
|
||||
import com.b44t.messenger.rpc.RpcException;
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||
import com.bumptech.glide.request.target.CustomTarget;
|
||||
import com.bumptech.glide.request.transition.Transition;
|
||||
@@ -49,7 +51,6 @@ import org.thoughtcrime.securesms.mms.AttachmentManager;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||
import org.thoughtcrime.securesms.profiles.AvatarHelper;
|
||||
import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints;
|
||||
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
|
||||
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
|
||||
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
|
||||
@@ -88,7 +89,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
|
||||
private AttachmentManager attachmentManager;
|
||||
private Bitmap avatarBmp;
|
||||
private ProgressDialog progressDialog;
|
||||
private @Nullable ProgressDialog progressDialog;
|
||||
private DcContext dcContext;
|
||||
|
||||
@Override
|
||||
@@ -284,14 +285,13 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
}
|
||||
|
||||
private void setAvatarView(Uri output) {
|
||||
final ProfileMediaConstraints constraints = new ProfileMediaConstraints();
|
||||
GlideApp.with(this)
|
||||
.asBitmap()
|
||||
.load(output)
|
||||
.skipMemoryCache(true)
|
||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
.centerCrop()
|
||||
.override(constraints.getImageMaxWidth(this), constraints.getImageMaxHeight(this))
|
||||
.override(AvatarHelper.AVATAR_SIZE, AvatarHelper.AVATAR_SIZE)
|
||||
.into(new CustomTarget<Bitmap>() {
|
||||
@Override
|
||||
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
|
||||
@@ -397,30 +397,34 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
|
||||
if (eventId == DcContext.DC_EVENT_CONFIGURE_PROGRESS) {
|
||||
long progress = event.getData1Int();
|
||||
if (progress==0/*error/aborted*/) {
|
||||
progressError(event.getData2Str());
|
||||
} else if (progress<1000/*progress in permille*/) {
|
||||
progressUpdate((int)progress);
|
||||
} else if (progress==1000/*done*/) {
|
||||
DcHelper.getAccounts(this).startIo();
|
||||
progressSuccess();
|
||||
}
|
||||
progressUpdate((int)progress);
|
||||
}
|
||||
}
|
||||
|
||||
private void progressUpdate(int progress) {
|
||||
int percent = progress / 10;
|
||||
progressDialog.setMessage(getResources().getString(R.string.one_moment)+String.format(" %d%%", percent));
|
||||
if (progressDialog != null) {
|
||||
progressDialog.setMessage(getResources().getString(R.string.one_moment)+String.format(" %d%%", percent));
|
||||
}
|
||||
}
|
||||
|
||||
private void progressError(String data2) {
|
||||
progressDialog.dismiss();
|
||||
if (progressDialog != null) {
|
||||
try {
|
||||
progressDialog.dismiss();
|
||||
} catch (IllegalArgumentException e) {
|
||||
// see https://stackoverflow.com/a/5102572/4557005
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
WelcomeActivity.maybeShowConfigurationError(this, data2);
|
||||
}
|
||||
|
||||
private void progressSuccess() {
|
||||
DcHelper.getEventCenter(this).endCaptureNextError();
|
||||
progressDialog.dismiss();
|
||||
if (progressDialog != null) {
|
||||
progressDialog.dismiss();
|
||||
}
|
||||
|
||||
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
|
||||
@@ -488,14 +492,13 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
DcHelper.getEventCenter(this).captureNextError();
|
||||
|
||||
new Thread(() -> {
|
||||
if (!dcContext.setConfigFromQr(qrCode)) {
|
||||
Util.runOnMain(() -> {
|
||||
progressError(dcContext.getLastError());
|
||||
});
|
||||
return;
|
||||
}
|
||||
DcHelper.getAccounts(this).stopIo();
|
||||
dcContext.configure();
|
||||
Rpc rpc = DcHelper.getRpc(this);
|
||||
try {
|
||||
rpc.addTransportFromQr(dcContext.getAccountId(), qrCode);
|
||||
progressSuccess();
|
||||
} catch (RpcException e) {
|
||||
Util.runOnMain(() -> progressError(e.getMessage()));
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
|
||||
@@ -262,16 +262,16 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
||||
finish();
|
||||
}
|
||||
else if(conversationRecipient.getAddress().isDcChat()) {
|
||||
Intent intent = new Intent(this, ProfileActivity.class);
|
||||
intent.putExtra(ProfileActivity.CHAT_ID_EXTRA, conversationRecipient.getAddress().getDcChatId());
|
||||
intent.putExtra(ProfileActivity.FORCE_TAB_EXTRA, ProfileActivity.TAB_GALLERY);
|
||||
Intent intent = new Intent(this, AllMediaActivity.class);
|
||||
intent.putExtra(AllMediaActivity.CHAT_ID_EXTRA, conversationRecipient.getAddress().getDcChatId());
|
||||
intent.putExtra(AllMediaActivity.FORCE_GALLERY, true);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
else if(conversationRecipient.getAddress().isDcContact()) {
|
||||
Intent intent = new Intent(this, ProfileActivity.class);
|
||||
intent.putExtra(ProfileActivity.CONTACT_ID_EXTRA, conversationRecipient.getAddress().getDcContactId());
|
||||
intent.putExtra(ProfileActivity.FORCE_TAB_EXTRA, ProfileActivity.TAB_GALLERY);
|
||||
Intent intent = new Intent(this, AllMediaActivity.class);
|
||||
intent.putExtra(AllMediaActivity.CONTACT_ID_EXTRA, conversationRecipient.getAddress().getDcContactId());
|
||||
intent.putExtra(AllMediaActivity.FORCE_GALLERY, true);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
@@ -344,7 +344,9 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
||||
DcMsg dcMsg = dcContext.getMsg(mediaItem.msgId);
|
||||
DcChat dcChat = dcContext.getChat(dcMsg.getChatId());
|
||||
|
||||
String text = getResources().getQuantityString(R.plurals.ask_delete_messages, 1, 1);
|
||||
String text = getResources().getQuantityString(
|
||||
dcChat.isDeviceTalk() ? R.plurals.ask_delete_messages_simple : 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};
|
||||
|
||||
@@ -357,7 +359,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
|
||||
finish();
|
||||
});
|
||||
|
||||
if(dcChat.canSend() && !dcChat.isSelfTalk() && dcMsg.isOutgoing()) {
|
||||
if(dcChat.isEncrypted() && dcChat.canSend() && !dcChat.isSelfTalk() && dcMsg.isOutgoing()) {
|
||||
builder.setNegativeButton(R.string.delete_for_everyone, (d, which) -> {
|
||||
Util.runOnAnyBackgroundThread(() -> dcContext.sendDeleteRequest(messageIds));
|
||||
finish();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
@@ -63,10 +64,10 @@ public abstract class MessageSelectorFragment
|
||||
protected void handleDeleteMessages(int chatId, final int[] messageIds) {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
boolean canDeleteForAll = true;
|
||||
if (dcChat.canSend() && !dcChat.isSelfTalk()) {
|
||||
if (dcChat.isEncrypted() && dcChat.canSend() && !dcChat.isSelfTalk()) {
|
||||
for(int msgId : messageIds) {
|
||||
DcMsg msg = dcContext.getMsg(msgId);
|
||||
if (!msg.isOutgoing()) {
|
||||
if (!msg.isOutgoing() || msg.isInfo()) {
|
||||
canDeleteForAll = false;
|
||||
break;
|
||||
}
|
||||
@@ -75,7 +76,9 @@ public abstract class MessageSelectorFragment
|
||||
canDeleteForAll = false;
|
||||
}
|
||||
|
||||
String text = requireActivity().getResources().getQuantityString(R.plurals.ask_delete_messages, messageIds.length, messageIds.length);
|
||||
String text = getActivity().getResources().getQuantityString(
|
||||
dcChat.isDeviceTalk() ? R.plurals.ask_delete_messages_simple : 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())
|
||||
@@ -83,13 +86,13 @@ public abstract class MessageSelectorFragment
|
||||
.setCancelable(true)
|
||||
.setNeutralButton(android.R.string.cancel, null)
|
||||
.setPositiveButton(positiveBtnLabel, (d, which) -> {
|
||||
dcContext.deleteMsgs(messageIds);
|
||||
Util.runOnAnyBackgroundThread(() -> dcContext.deleteMsgs(messageIds));
|
||||
if (actionMode != null) actionMode.finish();
|
||||
});
|
||||
|
||||
if(canDeleteForAll) {
|
||||
builder.setNegativeButton(R.string.delete_for_everyone, (d, which) -> {
|
||||
dcContext.sendDeleteRequest(messageIds);
|
||||
Util.runOnAnyBackgroundThread(() -> dcContext.sendDeleteRequest(messageIds));
|
||||
if (actionMode != null) actionMode.finish();
|
||||
});
|
||||
AlertDialog dialog = builder.show();
|
||||
@@ -143,15 +146,22 @@ public abstract class MessageSelectorFragment
|
||||
|
||||
protected void handleResendMessage(final Set<DcMsg> dcMsgsSet) {
|
||||
int[] ids = DcMsg.msgSetToIds(dcMsgsSet);
|
||||
if (dcContext.resendMsgs(ids)) {
|
||||
actionMode.finish();
|
||||
Toast.makeText(getContext(), R.string.sending, Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
new AlertDialog.Builder(getContext())
|
||||
.setMessage(dcContext.getLastError())
|
||||
.setCancelable(false)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show();
|
||||
}
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
boolean success = dcContext.resendMsgs(ids);
|
||||
Util.runOnMain(() -> {
|
||||
Activity activity = getActivity();
|
||||
if (activity == null || activity.isFinishing()) return;
|
||||
if (success) {
|
||||
actionMode.finish();
|
||||
Toast.makeText(getContext(), R.string.sending, Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
new AlertDialog.Builder(activity)
|
||||
.setMessage(dcContext.getLastError())
|
||||
.setCancelable(false)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ public class MuteDialog {
|
||||
// See https://c.delta.chat/classdc__context__t.html#a6460395925d49d2053bc95224bf5ce37.
|
||||
switch (which) {
|
||||
case 0: muteUntil = TimeUnit.HOURS.toSeconds(1); break;
|
||||
case 1: muteUntil = TimeUnit.HOURS.toSeconds(2); break;
|
||||
case 1: muteUntil = TimeUnit.HOURS.toSeconds(8); break;
|
||||
case 2: muteUntil = TimeUnit.DAYS.toSeconds(1); break;
|
||||
case 3: muteUntil = TimeUnit.DAYS.toSeconds(7); break;
|
||||
case 4: muteUntil = -1; break; // mute forever
|
||||
|
||||
@@ -72,7 +72,17 @@ public class NewConversationActivity extends ContactSelectionActivity {
|
||||
if (!textToShare.isEmpty()) {
|
||||
getIntent().putExtra(TEXT_EXTRA, textToShare);
|
||||
}
|
||||
onContactSelected(DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT, recipientsArray[0]);
|
||||
final String addr = recipientsArray[0];
|
||||
final DcContext dcContext = DcHelper.getContext(this);
|
||||
int contactId = dcContext.lookupContactIdByAddr(addr);
|
||||
if (contactId == 0 && dcContext.mayBeValidAddr(addr)) {
|
||||
contactId = dcContext.createContact(null, recipientsArray[0]);
|
||||
}
|
||||
if (contactId == 0) {
|
||||
Toast.makeText(this, R.string.bad_email_address, Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
onContactSelected(contactId);
|
||||
}
|
||||
} else {
|
||||
Intent shareIntent = new Intent(this, ShareActivity.class);
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, textToShare);
|
||||
@@ -94,37 +104,32 @@ public class NewConversationActivity extends ContactSelectionActivity {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onContactSelected(int specialId, String addr) {
|
||||
final DcContext dcContext = DcHelper.getContext(this);
|
||||
if(specialId == DcContact.DC_CONTACT_ID_NEW_GROUP) {
|
||||
public void onContactSelected(int contactId) {
|
||||
if(contactId == DcContact.DC_CONTACT_ID_NEW_GROUP) {
|
||||
startActivity(new Intent(this, GroupCreateActivity.class));
|
||||
} else if(specialId == DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST) {
|
||||
} else if(contactId == DcContact.DC_CONTACT_ID_NEW_UNENCRYPTED_GROUP) {
|
||||
Intent intent = new Intent(this, GroupCreateActivity.class);
|
||||
intent.putExtra(GroupCreateActivity.UNENCRYPTED, true);
|
||||
startActivity(intent);
|
||||
} else if(contactId == DcContact.DC_CONTACT_ID_NEW_BROADCAST) {
|
||||
Intent intent = new Intent(this, GroupCreateActivity.class);
|
||||
intent.putExtra(GroupCreateActivity.CREATE_BROADCAST, true);
|
||||
startActivity(intent);
|
||||
} else if (specialId == DcContact.DC_CONTACT_ID_QR_INVITE) {
|
||||
} else if (contactId == DcContact.DC_CONTACT_ID_QR_INVITE) {
|
||||
new IntentIntegrator(this).setCaptureActivity(QrActivity.class).initiateScan();
|
||||
}
|
||||
else {
|
||||
int contactId = dcContext.lookupContactIdByAddr(addr);
|
||||
if (contactId!=0 && dcContext.getChatIdByContactId(contactId)!=0) {
|
||||
final DcContext dcContext = DcHelper.getContext(this);
|
||||
if (dcContext.getChatIdByContactId(contactId)!=0) {
|
||||
openConversation(dcContext.getChatIdByContactId(contactId));
|
||||
} else {
|
||||
String nameNAddr = contactId == 0 ? addr : dcContext.getContact(contactId).getNameNAddr();
|
||||
String name = dcContext.getContact(contactId).getDisplayName();
|
||||
new AlertDialog.Builder(this)
|
||||
.setMessage(getString(R.string.ask_start_chat_with, nameNAddr))
|
||||
.setMessage(getString(R.string.ask_start_chat_with, name))
|
||||
.setCancelable(true)
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
|
||||
int contactId1 = dcContext.lookupContactIdByAddr(addr);
|
||||
if (contactId1 == 0) {
|
||||
contactId1 = dcContext.createContact(null, addr);
|
||||
if (contactId1 == 0) {
|
||||
Toast.makeText(NewConversationActivity.this, R.string.bad_email_address, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
openConversation(dcContext.createChatByContactId(contactId1));
|
||||
openConversation(dcContext.createChatByContactId(contactId));
|
||||
}).show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,29 +11,23 @@ import android.view.ContextMenu;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.view.ActionMode;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.b44t.messenger.rpc.Rpc;
|
||||
import com.b44t.messenger.rpc.RpcException;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.RelayUtil;
|
||||
@@ -41,7 +35,6 @@ import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
implements DcEventCenter.DcEventDelegate
|
||||
@@ -49,39 +42,27 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
public static final String CONTACT_ID_EXTRA = "contact_id";
|
||||
public static final String FORCE_TAB_EXTRA = "force_tab";
|
||||
public static final String FROM_CHAT = "from_chat";
|
||||
|
||||
public static final int TAB_SETTINGS = 10;
|
||||
public static final int TAB_GALLERY = 20;
|
||||
public static final int TAB_AUDIO = 25;
|
||||
public static final int TAB_DOCS = 30;
|
||||
public static final int TAB_WEBXDC = 35;
|
||||
public static final int TAB_LINKS = 40;
|
||||
public static final int TAB_MAP = 50;
|
||||
|
||||
private static final int REQUEST_CODE_PICK_RINGTONE = 1;
|
||||
|
||||
private DcContext dcContext;
|
||||
private Rpc rpc;
|
||||
private int chatId;
|
||||
private boolean chatIsMultiUser;
|
||||
private boolean chatIsDeviceTalk;
|
||||
private boolean chatIsMailingList;
|
||||
private boolean chatIsBroadcast;
|
||||
private boolean chatIsOutBroadcast;
|
||||
private boolean chatIsInBroadcast;
|
||||
private int contactId;
|
||||
private boolean fromChat;
|
||||
|
||||
private final ArrayList<Integer> tabs = new ArrayList<>();
|
||||
private Toolbar toolbar;
|
||||
private ConversationTitleView titleView;
|
||||
private TabLayout tabLayout;
|
||||
private ViewPager viewPager;
|
||||
private boolean contactIsBot;
|
||||
private Toolbar toolbar;
|
||||
|
||||
@Override
|
||||
protected void onPreCreate() {
|
||||
dynamicTheme = new DynamicNoActionBarTheme();
|
||||
super.onPreCreate();
|
||||
dcContext = DcHelper.getContext(this);
|
||||
rpc = DcHelper.getRpc(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -92,37 +73,28 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
setSupportActionBar(this.toolbar);
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (isGlobalProfile()) {
|
||||
if (supportActionBar != null) {
|
||||
String title = getString(R.string.profile);
|
||||
if (chatIsMailingList) {
|
||||
title = getString(R.string.mailing_list);
|
||||
} else if (chatIsOutBroadcast || chatIsInBroadcast) {
|
||||
title = getString(R.string.channel);
|
||||
} else if (chatIsMultiUser) {
|
||||
title = getString(R.string.tab_group);
|
||||
} else if (contactIsBot) {
|
||||
title = getString(R.string.bot);
|
||||
} else if (!chatIsDeviceTalk && !isSelfProfile()) {
|
||||
title = getString(R.string.tab_contact);
|
||||
}
|
||||
|
||||
supportActionBar.setDisplayHomeAsUpEnabled(true);
|
||||
supportActionBar.setHomeActionContentDescription(getString(R.string.back));
|
||||
} else {
|
||||
supportActionBar.setDisplayHomeAsUpEnabled(false);
|
||||
supportActionBar.setCustomView(R.layout.conversation_title_view);
|
||||
supportActionBar.setDisplayShowCustomEnabled(true);
|
||||
supportActionBar.setDisplayShowTitleEnabled(false);
|
||||
Toolbar parent = (Toolbar) supportActionBar.getCustomView().getParent();
|
||||
parent.setPadding(0,0,0,0);
|
||||
parent.setContentInsetsAbsolute(0,0);
|
||||
|
||||
titleView = (ConversationTitleView) supportActionBar.getCustomView();
|
||||
titleView.setOnBackClickedListener(view -> onBackPressed());
|
||||
titleView.setOnClickListener(view -> onEnlargeAvatar());
|
||||
if (isContactProfile() && !isSelfProfile() && !chatIsDeviceTalk) {
|
||||
titleView.registerForContextMenu(this);
|
||||
}
|
||||
supportActionBar.setTitle(title);
|
||||
}
|
||||
|
||||
updateToolbar();
|
||||
|
||||
this.tabLayout.setupWithViewPager(viewPager);
|
||||
this.viewPager.setAdapter(new ProfilePagerAdapter(getSupportFragmentManager()));
|
||||
int forceTab = getIntent().getIntExtra(FORCE_TAB_EXTRA, -1);
|
||||
if (forceTab != -1) {
|
||||
int forceIndex = tabs.indexOf(forceTab);
|
||||
if (forceIndex != -1) {
|
||||
this.viewPager.setCurrentItem(forceIndex);
|
||||
}
|
||||
}
|
||||
Bundle args = new Bundle();
|
||||
args.putInt(ProfileFragment.CHAT_ID_EXTRA, (chatId == 0) ? -1 : chatId);
|
||||
args.putInt(ProfileFragment.CONTACT_ID_EXTRA, (contactId == 0) ? -1 : contactId);
|
||||
initFragment(R.id.fragment_container, new ProfileFragment(), args);
|
||||
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
@@ -131,22 +103,25 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
if (!isSelfProfile() && !isGlobalProfile()) {
|
||||
if (!isSelfProfile()) {
|
||||
getMenuInflater().inflate(R.menu.profile_common, menu);
|
||||
boolean canReceive = true;
|
||||
|
||||
if (chatId != 0) {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
menu.findItem(R.id.menu_clone).setVisible(chatIsMultiUser && !chatIsMailingList);
|
||||
if (chatIsDeviceTalk) {
|
||||
menu.findItem(R.id.edit_name).setVisible(false);
|
||||
menu.findItem(R.id.show_encr_info).setVisible(false);
|
||||
menu.findItem(R.id.share).setVisible(false);
|
||||
} else if (chatIsMultiUser) {
|
||||
if (chatIsBroadcast) {
|
||||
// menu.findItem(R.id.edit_name).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
|
||||
if (chatIsOutBroadcast) {
|
||||
canReceive = false;
|
||||
} else {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
if (!chatIsMailingList && !dcChat.canSend()) {
|
||||
if (!dcChat.isEncrypted()
|
||||
|| !dcChat.canSend()
|
||||
|| chatIsMailingList) {
|
||||
menu.findItem(R.id.edit_name).setVisible(false);
|
||||
}
|
||||
}
|
||||
@@ -199,21 +174,6 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
getMenuInflater().inflate(R.menu.profile_title_context, menu);
|
||||
}
|
||||
|
||||
boolean backPressed = false;
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
backPressed = true;
|
||||
super.onBackPressed();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
if (backPressed && fromChat) {
|
||||
overridePendingTransition(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
DcHelper.getEventCenter(this).removeObservers(this);
|
||||
@@ -222,65 +182,38 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
updateToolbar();
|
||||
}
|
||||
|
||||
private void initializeResources() {
|
||||
chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, 0);
|
||||
contactId = getIntent().getIntExtra(CONTACT_ID_EXTRA, 0);
|
||||
contactIsBot = false;
|
||||
chatIsMultiUser = false;
|
||||
chatIsDeviceTalk = false;
|
||||
chatIsMailingList= false;
|
||||
chatIsBroadcast = false;
|
||||
fromChat = getIntent().getBooleanExtra(FROM_CHAT, false);
|
||||
chatIsInBroadcast = false;
|
||||
chatIsOutBroadcast = false;
|
||||
|
||||
if (contactId!=0) {
|
||||
DcContact dcContact = dcContext.getContact(contactId);
|
||||
chatId = dcContext.getChatIdByContactId(contactId);
|
||||
contactIsBot = dcContact.isBot();
|
||||
}
|
||||
else if(chatId!=0) {
|
||||
|
||||
if(chatId!=0) {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
chatIsMultiUser = dcChat.isMultiUser();
|
||||
chatIsDeviceTalk = dcChat.isDeviceTalk();
|
||||
chatIsMailingList = dcChat.isMailingList();
|
||||
chatIsBroadcast = dcChat.isBroadcast();
|
||||
chatIsInBroadcast = dcChat.isInBroadcast();
|
||||
chatIsOutBroadcast = dcChat.isOutBroadcast();
|
||||
if(!chatIsMultiUser) {
|
||||
final int[] members = dcContext.getChatContacts(chatId);
|
||||
contactId = members.length>=1? members[0] : 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(!isGlobalProfile() && !isSelfProfile() && !chatIsMailingList) {
|
||||
tabs.add(TAB_SETTINGS);
|
||||
}
|
||||
tabs.add(TAB_GALLERY);
|
||||
tabs.add(TAB_AUDIO);
|
||||
tabs.add(TAB_DOCS);
|
||||
tabs.add(TAB_WEBXDC);
|
||||
//tabs.add(TAB_LINKS);
|
||||
//if(Prefs.isLocationStreamingEnabled(this)) {
|
||||
// tabs.add(TAB_MAP);
|
||||
//}
|
||||
|
||||
this.viewPager = ViewUtil.findById(this, R.id.pager);
|
||||
this.toolbar = ViewUtil.findById(this, R.id.toolbar);
|
||||
this.tabLayout = ViewUtil.findById(this, R.id.tab_layout);
|
||||
}
|
||||
|
||||
private void updateToolbar() {
|
||||
if (isGlobalProfile()){
|
||||
getSupportActionBar().setTitle(R.string.menu_all_media);
|
||||
}
|
||||
else if (chatId > 0) {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
titleView.setTitle(GlideApp.with(this), dcChat, true);
|
||||
}
|
||||
else if (isContactProfile()){
|
||||
titleView.setTitle(GlideApp.with(this), dcContext.getContact(contactId));
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isGlobalProfile() {
|
||||
return contactId==0 && chatId==0;
|
||||
}
|
||||
|
||||
private boolean isContactProfile() {
|
||||
@@ -292,133 +225,15 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
return isContactProfile() && contactId==DcContact.DC_CONTACT_ID_SELF;
|
||||
}
|
||||
|
||||
private class ProfilePagerAdapter extends FragmentStatePagerAdapter {
|
||||
private Object currentFragment = null;
|
||||
|
||||
ProfilePagerAdapter(FragmentManager fragmentManager) {
|
||||
super(fragmentManager);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPrimaryItem(ViewGroup container, int position, Object object) {
|
||||
super.setPrimaryItem(container, position, object);
|
||||
if (currentFragment != null && currentFragment != object) {
|
||||
ActionMode action = null;
|
||||
if (currentFragment instanceof MessageSelectorFragment) {
|
||||
action = ((MessageSelectorFragment) currentFragment).getActionMode();
|
||||
} else if (currentFragment instanceof ProfileSettingsFragment) {
|
||||
action = ((ProfileSettingsFragment) currentFragment).getActionMode();
|
||||
}
|
||||
if (action != null) {
|
||||
action.finish();
|
||||
}
|
||||
}
|
||||
currentFragment = object;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
int tabId = tabs.get(position);
|
||||
Fragment fragment;
|
||||
Bundle args = new Bundle();
|
||||
|
||||
switch(tabId) {
|
||||
case TAB_SETTINGS:
|
||||
fragment = new ProfileSettingsFragment();
|
||||
args.putInt(ProfileSettingsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId);
|
||||
args.putInt(ProfileSettingsFragment.CONTACT_ID_EXTRA, (contactId==0&&!isGlobalProfile())? -1 : contactId);
|
||||
break;
|
||||
|
||||
case TAB_GALLERY:
|
||||
fragment = new ProfileGalleryFragment();
|
||||
args.putInt(ProfileGalleryFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId);
|
||||
break;
|
||||
|
||||
case TAB_AUDIO:
|
||||
fragment = new ProfileDocumentsFragment();
|
||||
args.putInt(ProfileDocumentsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId);
|
||||
args.putBoolean(ProfileDocumentsFragment.SHOW_AUDIO_EXTRA, true);
|
||||
break;
|
||||
|
||||
case TAB_WEBXDC:
|
||||
fragment = new ProfileDocumentsFragment();
|
||||
args.putInt(ProfileDocumentsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId);
|
||||
args.putBoolean(ProfileDocumentsFragment.SHOW_WEBXDC_EXTRA, true);
|
||||
break;
|
||||
|
||||
default:
|
||||
fragment = new ProfileDocumentsFragment();
|
||||
args.putInt(ProfileGalleryFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalProfile())? -1 : chatId);
|
||||
break;
|
||||
}
|
||||
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return tabs.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
int tabId = tabs.get(position);
|
||||
switch(tabId) {
|
||||
case TAB_SETTINGS:
|
||||
if (chatIsDeviceTalk) {
|
||||
return getString(R.string.profile);
|
||||
} else if(isContactProfile()) {
|
||||
if (dcContext.getContact(contactId).isBot()) {
|
||||
return getString(R.string.bot);
|
||||
} else {
|
||||
return getString(R.string.tab_contact);
|
||||
}
|
||||
}
|
||||
else if (chatIsBroadcast) {
|
||||
return getString(R.string.broadcast_list);
|
||||
}
|
||||
else if (chatIsMailingList) {
|
||||
return getString(R.string.mailing_list);
|
||||
} else {
|
||||
return getString(R.string.tab_group);
|
||||
}
|
||||
|
||||
case TAB_GALLERY:
|
||||
return getString(R.string.tab_gallery);
|
||||
|
||||
case TAB_AUDIO:
|
||||
return getString(R.string.audio);
|
||||
|
||||
case TAB_DOCS:
|
||||
return getString(R.string.files);
|
||||
|
||||
case TAB_WEBXDC:
|
||||
return getString(R.string.webxdc_apps);
|
||||
|
||||
case TAB_LINKS:
|
||||
return getString(R.string.tab_links);
|
||||
|
||||
case TAB_MAP:
|
||||
return getString(R.string.tab_map);
|
||||
|
||||
default:
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// handle events
|
||||
// =========================================================================
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
backPressed = true;
|
||||
finish();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_mute_notifications) {
|
||||
@@ -443,7 +258,7 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onContextItemSelected(MenuItem item) {
|
||||
public boolean onContextItemSelected(@NonNull MenuItem item) {
|
||||
super.onContextItemSelected(item);
|
||||
if (item.getItemId() == R.id.copy_addr_to_clipboard) {
|
||||
onCopyAddrToClipboard();
|
||||
@@ -456,7 +271,7 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
setMuted(0);
|
||||
}
|
||||
else {
|
||||
MuteDialog.show(this, duration -> setMuted(duration));
|
||||
MuteDialog.show(this, this::setMuted);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -496,14 +311,16 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
.show();
|
||||
}
|
||||
|
||||
private void onEnlargeAvatar() {
|
||||
public void onEnlargeAvatar() {
|
||||
String profileImagePath;
|
||||
String title;
|
||||
Uri profileImageUri;
|
||||
boolean enlargeAvatar = true;
|
||||
if(chatId!=0) {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
profileImagePath = dcChat.getProfileImage();
|
||||
title = dcChat.getName();
|
||||
enlargeAvatar = dcChat.isEncrypted() && !dcChat.isSelfTalk() && !dcChat.isDeviceTalk();
|
||||
} else {
|
||||
DcContact dcContact = dcContext.getContact(contactId);
|
||||
profileImagePath = dcContact.getProfileImage();
|
||||
@@ -512,16 +329,19 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
File file = new File(profileImagePath);
|
||||
|
||||
if (file.exists()) {
|
||||
if (enlargeAvatar && file.exists()) {
|
||||
profileImageUri = Uri.fromFile(file);
|
||||
String type = "image/" + profileImagePath.substring(profileImagePath.lastIndexOf(".") + 1);
|
||||
|
||||
Intent intent = new Intent(this, MediaPreviewActivity.class);
|
||||
intent.setDataAndType(profileImageUri, type);
|
||||
intent.putExtra(MediaPreviewActivity.ACTIVITY_TITLE_EXTRA, title);
|
||||
intent.putExtra(MediaPreviewActivity.EDIT_AVATAR_CHAT_ID, chatIsMultiUser ? chatId : 0); // shows edit-button, might be 0 for a contact-profile
|
||||
intent.putExtra( // show edit-button, if the user is allowed to edit the name/avatar
|
||||
MediaPreviewActivity.EDIT_AVATAR_CHAT_ID,
|
||||
(chatIsMultiUser && !chatIsInBroadcast && !chatIsMailingList) ? chatId : 0
|
||||
);
|
||||
startActivity(intent);
|
||||
} else {
|
||||
} else if (chatIsMultiUser){
|
||||
onEditName();
|
||||
}
|
||||
}
|
||||
@@ -536,6 +356,7 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
}
|
||||
else {
|
||||
int accountId = dcContext.getAccountId();
|
||||
DcContact dcContact = dcContext.getContact(contactId);
|
||||
|
||||
String authName = dcContact.getAuthName();
|
||||
@@ -555,7 +376,11 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
.setView(gl)
|
||||
.setPositiveButton(android.R.string.ok, (dialog, whichButton) -> {
|
||||
String newName = inputField.getText().toString();
|
||||
dcContext.createContact(newName, dcContact.getAddr());
|
||||
try {
|
||||
rpc.changeContactName(accountId, contactId, newName);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setCancelable(false)
|
||||
@@ -565,7 +390,12 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
private void onShare() {
|
||||
Intent composeIntent = new Intent();
|
||||
RelayUtil.setSharedContactId(composeIntent, contactId);
|
||||
DcContact dcContact = dcContext.getContact(contactId);
|
||||
if (dcContact.isKeyContact()) {
|
||||
RelayUtil.setSharedContactId(composeIntent, contactId);
|
||||
} else {
|
||||
RelayUtil.setSharedText(composeIntent, dcContact.getAddr());
|
||||
}
|
||||
ConversationListRelayingActivity.start(this, composeIntent);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,382 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
import com.b44t.messenger.DcChatlist;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcLot;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.contacts.ContactSelectionListItem;
|
||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||
import org.thoughtcrime.securesms.util.DateUtils;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class ProfileAdapter extends RecyclerView.Adapter
|
||||
{
|
||||
public static final int ITEM_AVATAR = 10;
|
||||
public static final int ITEM_DIVIDER = 20;
|
||||
public static final int ITEM_SIGNATURE = 25;
|
||||
public static final int ITEM_ALL_MEDIA_BUTTON = 30;
|
||||
public static final int ITEM_SEND_MESSAGE_BUTTON = 35;
|
||||
public static final int ITEM_LAST_SEEN = 40;
|
||||
public static final int ITEM_INTRODUCED_BY = 45;
|
||||
public static final int ITEM_ADDRESS = 50;
|
||||
public static final int ITEM_HEADER = 53;
|
||||
public static final int ITEM_MEMBERS = 55;
|
||||
public static final int ITEM_SHARED_CHATS = 60;
|
||||
|
||||
private final @NonNull Context context;
|
||||
private final @NonNull Fragment fragment;
|
||||
private final @NonNull DcContext dcContext;
|
||||
private @Nullable DcChat dcChat;
|
||||
private @Nullable DcContact dcContact;
|
||||
|
||||
private final @NonNull ArrayList<ItemData> itemData = new ArrayList<>();
|
||||
private DcChatlist itemDataSharedChats;
|
||||
private String itemDataStatusText;
|
||||
private boolean isOutBroadcast;
|
||||
private int memberCount;
|
||||
private final Set<Integer> selectedMembers;
|
||||
|
||||
private final LayoutInflater layoutInflater;
|
||||
private final ItemClickListener clickListener;
|
||||
private final GlideRequests glideRequests;
|
||||
|
||||
static class ItemData {
|
||||
final int viewType;
|
||||
final int contactId;
|
||||
final int chatlistIndex;
|
||||
final String label;
|
||||
final int icon;
|
||||
|
||||
ItemData(int viewType, String label, int icon) {
|
||||
this(viewType, 0, 0, label, icon);
|
||||
}
|
||||
|
||||
ItemData(int viewType, int contactId, int chatlistIndex) {
|
||||
this(viewType, contactId, chatlistIndex, null, 0);
|
||||
}
|
||||
|
||||
private ItemData(int viewType, int contactId, int chatlistIndex, @Nullable String label, int icon) {
|
||||
this.viewType = viewType;
|
||||
this.contactId = contactId;
|
||||
this.chatlistIndex = chatlistIndex;
|
||||
this.label = label;
|
||||
this.icon = icon;
|
||||
}
|
||||
};
|
||||
|
||||
public ProfileAdapter(@NonNull Fragment fragment,
|
||||
@NonNull GlideRequests glideRequests,
|
||||
@Nullable ItemClickListener clickListener)
|
||||
{
|
||||
super();
|
||||
this.fragment = fragment;
|
||||
this.context = fragment.requireContext();
|
||||
this.glideRequests = glideRequests;
|
||||
this.clickListener = clickListener;
|
||||
this.dcContext = DcHelper.getContext(context);
|
||||
this.layoutInflater = LayoutInflater.from(context);
|
||||
this.selectedMembers= new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return itemData.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int i) {
|
||||
return itemData.get(i).viewType;
|
||||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
public ViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ProfileAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
if (viewType == ITEM_HEADER) {
|
||||
final View item = LayoutInflater.from(context).inflate(R.layout.contact_selection_list_divider, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_DIVIDER) {
|
||||
final View item = LayoutInflater.from(context).inflate(R.layout.profile_divider, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_MEMBERS) {
|
||||
final ContactSelectionListItem item = (ContactSelectionListItem)layoutInflater.inflate(R.layout.contact_selection_list_item, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_SHARED_CHATS) {
|
||||
final ConversationListItem item = (ConversationListItem)layoutInflater.inflate(R.layout.conversation_list_item_view, parent, false);
|
||||
item.hideItemDivider();
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_SIGNATURE) {
|
||||
final ProfileStatusItem item = (ProfileStatusItem)layoutInflater.inflate(R.layout.profile_status_item, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_AVATAR) {
|
||||
final ProfileAvatarItem item = (ProfileAvatarItem)layoutInflater.inflate(R.layout.profile_avatar_item, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_ALL_MEDIA_BUTTON || viewType == ITEM_SEND_MESSAGE_BUTTON) {
|
||||
final ProfileTextItem item = (ProfileTextItem)layoutInflater.inflate(R.layout.profile_text_item_button, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_LAST_SEEN || viewType == ITEM_INTRODUCED_BY || viewType == ITEM_ADDRESS) {
|
||||
final ProfileTextItem item = (ProfileTextItem)layoutInflater.inflate(R.layout.profile_text_item_small, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else {
|
||||
final ProfileTextItem item = (ProfileTextItem)layoutInflater.inflate(R.layout.profile_text_item, parent, false);
|
||||
return new ViewHolder(item);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
|
||||
ViewHolder holder = (ViewHolder) viewHolder;
|
||||
ItemData data = itemData.get(i);
|
||||
if (holder.itemView instanceof ContactSelectionListItem) {
|
||||
ContactSelectionListItem contactItem = (ContactSelectionListItem) holder.itemView;
|
||||
|
||||
int contactId = data.contactId;
|
||||
DcContact dcContact = null;
|
||||
String label = null;
|
||||
String name;
|
||||
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);
|
||||
}
|
||||
}
|
||||
else if (contactId == DcContact.DC_CONTACT_ID_QR_INVITE) {
|
||||
name = context.getString(R.string.qrshow_title);
|
||||
}
|
||||
else {
|
||||
dcContact = dcContext.getContact(contactId);
|
||||
name = dcContact.getDisplayName();
|
||||
addr = dcContact.getAddr();
|
||||
}
|
||||
|
||||
contactItem.unbind(glideRequests);
|
||||
contactItem.set(glideRequests, contactId, dcContact, name, addr, label, false, true);
|
||||
contactItem.setSelected(selectedMembers.contains(contactId));
|
||||
contactItem.setOnClickListener(view -> clickListener.onMemberClicked(contactId));
|
||||
contactItem.setOnLongClickListener(view -> {clickListener.onMemberLongClicked(contactId); return true;});
|
||||
}
|
||||
else if (holder.itemView instanceof ConversationListItem) {
|
||||
ConversationListItem conversationListItem = (ConversationListItem) holder.itemView;
|
||||
int chatlistIndex = data.chatlistIndex;
|
||||
|
||||
int chatId = itemDataSharedChats.getChatId(chatlistIndex);
|
||||
DcChat chat = dcContext.getChat(chatId);
|
||||
DcLot summary = itemDataSharedChats.getSummary(chatlistIndex, chat);
|
||||
|
||||
conversationListItem.bind(DcHelper.getThreadRecord(context, summary, chat),
|
||||
itemDataSharedChats.getMsgId(chatlistIndex), summary, glideRequests,
|
||||
Collections.emptySet(), false);
|
||||
conversationListItem.setOnClickListener(view -> clickListener.onSharedChatClicked(chatId));
|
||||
}
|
||||
else if(holder.itemView instanceof ProfileStatusItem) {
|
||||
ProfileStatusItem item = (ProfileStatusItem) holder.itemView;
|
||||
item.setOnLongClickListener(view -> {clickListener.onStatusLongClicked(); return true;});
|
||||
item.set(data.label);
|
||||
}
|
||||
else if(holder.itemView instanceof ProfileAvatarItem) {
|
||||
ProfileAvatarItem item = (ProfileAvatarItem) holder.itemView;
|
||||
item.setAvatarClickListener(view -> clickListener.onAvatarClicked());
|
||||
item.set(glideRequests, dcChat, dcContact, memberCount);
|
||||
}
|
||||
else if(holder.itemView instanceof ProfileTextItem) {
|
||||
ProfileTextItem item = (ProfileTextItem) holder.itemView;
|
||||
item.setOnClickListener(view -> clickListener.onSettingsClicked(data.viewType));
|
||||
boolean tintIcon = data.viewType != ITEM_INTRODUCED_BY;
|
||||
item.set(data.label, data.icon, tintIcon);
|
||||
if (data.viewType == ITEM_LAST_SEEN || data.viewType == ITEM_ADDRESS) {
|
||||
int padding = (int)((float)context.getResources().getDimensionPixelSize(R.dimen.contact_list_normal_padding) * 1.2);
|
||||
item.setPadding(item.getPaddingLeft(), item.getPaddingTop(), item.getPaddingRight(), padding);
|
||||
if (data.viewType == ITEM_ADDRESS) {
|
||||
fragment.registerForContextMenu(item);
|
||||
}
|
||||
} else if (data.viewType == ITEM_INTRODUCED_BY) {
|
||||
int padding = context.getResources().getDimensionPixelSize(R.dimen.contact_list_normal_padding);
|
||||
item.setPadding(item.getPaddingLeft(), padding, item.getPaddingRight(), item.getPaddingBottom());
|
||||
} else if (data.viewType == ITEM_ALL_MEDIA_BUTTON && dcChat != null) {
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
String c = getAllMediaCountString(dcChat.getId());
|
||||
Util.runOnMain(() -> {
|
||||
item.setValue(c);
|
||||
});
|
||||
});
|
||||
}
|
||||
} else if (data.viewType == ITEM_HEADER) {
|
||||
TextView textView = holder.itemView.findViewById(R.id.label);
|
||||
textView.setText(data.label);
|
||||
}
|
||||
}
|
||||
|
||||
public interface ItemClickListener {
|
||||
void onSettingsClicked(int settingsId);
|
||||
void onStatusLongClicked();
|
||||
void onSharedChatClicked(int chatId);
|
||||
void onMemberClicked(int contactId);
|
||||
void onMemberLongClicked(int contactId);
|
||||
void onAvatarClicked();
|
||||
}
|
||||
|
||||
public void toggleMemberSelection(int contactId) {
|
||||
if (!selectedMembers.remove(contactId)) {
|
||||
selectedMembers.add(contactId);
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public Collection<Integer> getSelectedMembers() {
|
||||
return new HashSet<>(selectedMembers);
|
||||
}
|
||||
|
||||
public int getSelectedMembersCount() {
|
||||
return selectedMembers.size();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getStatusText() {
|
||||
return itemDataStatusText;
|
||||
}
|
||||
|
||||
public void clearSelection() {
|
||||
selectedMembers.clear();
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void changeData(@Nullable int[] memberList, @Nullable DcContact dcContact, @Nullable DcChatlist sharedChats, @Nullable DcChat dcChat) {
|
||||
this.dcChat = dcChat;
|
||||
this.dcContact = dcContact;
|
||||
itemData.clear();
|
||||
itemDataSharedChats = sharedChats;
|
||||
itemDataStatusText = "";
|
||||
isOutBroadcast = dcChat != null && dcChat.isOutBroadcast();
|
||||
boolean isMailingList = dcChat != null && dcChat.isMailingList();
|
||||
boolean isSelfTalk = dcChat != null && dcChat.isSelfTalk();
|
||||
boolean isDeviceTalk = dcChat != null && dcChat.isDeviceTalk();
|
||||
memberCount = memberList!=null ? memberList.length : 0;
|
||||
|
||||
itemData.add(new ItemData(ITEM_AVATAR, null, 0));
|
||||
|
||||
if (isSelfTalk || dcContact != null && !dcContact.getStatus().isEmpty()) {
|
||||
itemDataStatusText = isSelfTalk ? context.getString(R.string.saved_messages_explain) : dcContact.getStatus();
|
||||
itemData.add(new ItemData(ITEM_SIGNATURE, itemDataStatusText, 0));
|
||||
} else {
|
||||
itemData.add(new ItemData(ITEM_DIVIDER, null, 0));
|
||||
}
|
||||
|
||||
itemData.add(new ItemData(ITEM_ALL_MEDIA_BUTTON, context.getString(R.string.apps_and_media), R.drawable.ic_apps_24));
|
||||
|
||||
if (dcContact != null && !isDeviceTalk && !isSelfTalk) {
|
||||
itemData.add(new ItemData(ITEM_SEND_MESSAGE_BUTTON, context.getString(R.string.send_message), R.drawable.ic_send_sms_white_24dp));
|
||||
}
|
||||
|
||||
/*
|
||||
if (dcContact != null && !isDeviceTalk && !isSelfTalk) {
|
||||
long lastSeenTimestamp = dcContact.getLastSeen();
|
||||
String lastSeenTxt;
|
||||
if (lastSeenTimestamp == 0) {
|
||||
lastSeenTxt = context.getString(R.string.last_seen_unknown);
|
||||
}
|
||||
else {
|
||||
lastSeenTxt = context.getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(context, lastSeenTimestamp));
|
||||
}
|
||||
itemData.add(new ItemData(ITEM_LAST_SEEN, lastSeenTxt, 0));
|
||||
}
|
||||
*/
|
||||
|
||||
if (memberList!=null && !isMailingList) {
|
||||
itemData.add(new ItemData(ITEM_DIVIDER, null, 0));
|
||||
if (dcChat != null) {
|
||||
if (dcChat.canSend() && dcChat.isEncrypted()) {
|
||||
itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0));
|
||||
if (!isOutBroadcast) {
|
||||
itemData.add(new ItemData(ITEM_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int value : memberList) {
|
||||
itemData.add(new ItemData(ITEM_MEMBERS, value, 0));
|
||||
}
|
||||
}
|
||||
|
||||
if (!isDeviceTalk && sharedChats != null && sharedChats.getCnt() > 0) {
|
||||
itemData.add(new ItemData(ITEM_HEADER, context.getString(R.string.profile_shared_chats), 0));
|
||||
for (int i = 0; i < sharedChats.getCnt(); i++) {
|
||||
itemData.add(new ItemData(ITEM_SHARED_CHATS, 0, i));
|
||||
}
|
||||
}
|
||||
|
||||
if (dcContact != null && !isDeviceTalk && !isSelfTalk) {
|
||||
itemData.add(new ItemData(ITEM_DIVIDER, null, 0));
|
||||
int verifierId = dcContact.getVerifierId();
|
||||
if (verifierId != 0) {
|
||||
String introducedBy;
|
||||
if (verifierId == DcContact.DC_CONTACT_ID_SELF) {
|
||||
introducedBy = context.getString(R.string.verified_by_you);
|
||||
} else {
|
||||
introducedBy = context.getString(R.string.verified_by, dcContext.getContact(verifierId).getDisplayName());
|
||||
}
|
||||
itemData.add(new ItemData(ITEM_INTRODUCED_BY, introducedBy, dcContact.isVerified()? R.drawable.ic_verified : 0));
|
||||
} else if (dcContact.isVerified()) {
|
||||
String introducedBy = context.getString(R.string.verified_by_unknown);
|
||||
itemData.add(new ItemData(ITEM_INTRODUCED_BY, introducedBy, R.drawable.ic_verified));
|
||||
}
|
||||
|
||||
if (dcContact != null) {
|
||||
itemData.add(new ItemData(ITEM_ADDRESS, dcContact.getAddr(), 0));
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public int ALL_MEDIA_COUNT_MAX = 500;
|
||||
public int getAllMediaCount(int chatId) {
|
||||
int c = dcContext.getChatMedia(chatId, DcMsg.DC_MSG_IMAGE, DcMsg.DC_MSG_GIF, DcMsg.DC_MSG_VIDEO).length;
|
||||
if (c < ALL_MEDIA_COUNT_MAX) {
|
||||
c += dcContext.getChatMedia(chatId, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0).length;
|
||||
}
|
||||
if (c < ALL_MEDIA_COUNT_MAX) {
|
||||
c += dcContext.getChatMedia(chatId, DcMsg.DC_MSG_FILE, DcMsg.DC_MSG_WEBXDC, 0).length;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
public String getAllMediaCountString(int chatId) {
|
||||
final int c = getAllMediaCount(chatId);
|
||||
if (c == 0) {
|
||||
return context.getString(R.string.none);
|
||||
} else if (c >= ALL_MEDIA_COUNT_MAX) {
|
||||
return ALL_MEDIA_COUNT_MAX + "+";
|
||||
} else {
|
||||
return c + "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
import com.b44t.messenger.DcContact;
|
||||
|
||||
import org.thoughtcrime.securesms.components.AvatarView;
|
||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientModifiedListener;
|
||||
import org.thoughtcrime.securesms.util.DateUtils;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
public class ProfileAvatarItem extends LinearLayout implements RecipientModifiedListener {
|
||||
|
||||
private AvatarView avatarView;
|
||||
private TextView nameView;
|
||||
private TextView subtitleView;
|
||||
|
||||
private Recipient recipient;
|
||||
private GlideRequests glideRequests;
|
||||
|
||||
public ProfileAvatarItem(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public ProfileAvatarItem(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
avatarView = findViewById(R.id.avatar);
|
||||
nameView = findViewById(R.id.name);
|
||||
subtitleView = findViewById(R.id.subtitle);
|
||||
|
||||
ViewUtil.setTextViewGravityStart(nameView, getContext());
|
||||
}
|
||||
|
||||
public void set(@NonNull GlideRequests glideRequests, @Nullable DcChat dcChat, @Nullable DcContact dcContact, int memberCount) {
|
||||
this.glideRequests = glideRequests;
|
||||
|
||||
String name = "";
|
||||
String subtitle = null;
|
||||
if (dcChat != null) {
|
||||
recipient = new Recipient(getContext(), dcChat);
|
||||
name = dcChat.getName();
|
||||
|
||||
if (dcChat.isMailingList()) {
|
||||
subtitle = dcChat.getMailinglistAddr();
|
||||
} else if (dcChat.isOutBroadcast()) {
|
||||
subtitle = getContext().getResources().getQuantityString(R.plurals.n_recipients, memberCount, memberCount);
|
||||
} else if (dcChat.getType() == DcChat.DC_CHAT_TYPE_GROUP) {
|
||||
subtitle = getContext().getResources().getQuantityString(R.plurals.n_members, memberCount, memberCount);
|
||||
} else if (dcContact != null && !dcChat.isSelfTalk() && !dcChat.isDeviceTalk()) {
|
||||
long timestamp = dcContact.getLastSeen();
|
||||
if (timestamp == 0) {
|
||||
subtitle = getContext().getString(R.string.last_seen_unknown);
|
||||
} else {
|
||||
subtitle = getContext().getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(getContext(), timestamp));
|
||||
}
|
||||
}
|
||||
} else if (dcContact != null) {
|
||||
recipient = new Recipient(getContext(), dcContact);
|
||||
name = dcContact.getDisplayName();
|
||||
|
||||
long timestamp = dcContact.getLastSeen();
|
||||
if (timestamp == 0) {
|
||||
subtitle = getContext().getString(R.string.last_seen_unknown);
|
||||
} else {
|
||||
subtitle = getContext().getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(getContext(), timestamp));
|
||||
}
|
||||
}
|
||||
|
||||
recipient.addListener(this);
|
||||
avatarView.setAvatar(glideRequests, recipient, false);
|
||||
avatarView.setSeenRecently(dcContact != null && dcContact.wasSeenRecently());
|
||||
|
||||
nameView.setText(name);
|
||||
|
||||
if (subtitle != null) {
|
||||
subtitleView.setVisibility(View.VISIBLE);
|
||||
subtitleView.setText(subtitle);
|
||||
} else {
|
||||
subtitleView.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
public void setAvatarClickListener(OnClickListener listener) {
|
||||
avatarView.setAvatarClickListener(listener);
|
||||
}
|
||||
|
||||
public void unbind(GlideRequests glideRequests) {
|
||||
if (recipient != null) {
|
||||
recipient.removeListener(this);
|
||||
recipient = null;
|
||||
}
|
||||
|
||||
avatarView.clear(glideRequests);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onModified(final Recipient recipient) {
|
||||
if (this.recipient == recipient) {
|
||||
Util.runOnMain(() -> {
|
||||
avatarView.setAvatar(glideRequests, recipient, false);
|
||||
DcContact contact = recipient.getDcContact();
|
||||
avatarView.setSeenRecently(contact != null && contact.wasSeenRecently());
|
||||
nameView.setText(recipient.toShortString());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,6 @@ import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||
import org.thoughtcrime.securesms.qr.QrShowActivity;
|
||||
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
@@ -39,17 +38,15 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public class ProfileSettingsFragment extends Fragment
|
||||
implements ProfileSettingsAdapter.ItemClickListener, DcEventCenter.DcEventDelegate {
|
||||
public class ProfileFragment extends Fragment
|
||||
implements ProfileAdapter.ItemClickListener, DcEventCenter.DcEventDelegate {
|
||||
|
||||
public static final String CHAT_ID_EXTRA = "chat_id";
|
||||
public static final String CONTACT_ID_EXTRA = "contact_id";
|
||||
|
||||
private static final int REQUEST_CODE_PICK_CONTACT = 2;
|
||||
|
||||
private RecyclerView list;
|
||||
private StickyHeaderDecoration listDecoration;
|
||||
private ProfileSettingsAdapter adapter;
|
||||
private ProfileAdapter adapter;
|
||||
private ActionMode actionMode;
|
||||
private final ActionModeCallback actionModeCallback = new ActionModeCallback();
|
||||
|
||||
@@ -58,33 +55,27 @@ public class ProfileSettingsFragment extends Fragment
|
||||
protected int chatId;
|
||||
private int contactId;
|
||||
|
||||
protected ActionMode getActionMode() {
|
||||
return actionMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
|
||||
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
|
||||
chatId = getArguments() != null ? getArguments().getInt(CHAT_ID_EXTRA, -1) : -1;
|
||||
contactId = getArguments().getInt(CONTACT_ID_EXTRA, -1);
|
||||
dcContext = DcHelper.getContext(getContext());
|
||||
dcContext = DcHelper.getContext(requireContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.profile_settings_fragment, container, false);
|
||||
adapter = new ProfileSettingsAdapter(getContext(), GlideApp.with(this), this);
|
||||
View view = inflater.inflate(R.layout.profile_fragment, container, false);
|
||||
adapter = new ProfileAdapter(this, GlideApp.with(this), this);
|
||||
|
||||
list = ViewUtil.findById(view, R.id.recycler_view);
|
||||
RecyclerView list = ViewUtil.findById(view, R.id.recycler_view);
|
||||
list.setAdapter(adapter);
|
||||
list.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
|
||||
listDecoration = new StickyHeaderDecoration(adapter, false, true);
|
||||
list.addItemDecoration(listDecoration);
|
||||
|
||||
update();
|
||||
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(getContext());
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(requireContext());
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_MSGS_CHANGED, this);
|
||||
@@ -94,16 +85,10 @@ public class ProfileSettingsFragment extends Fragment
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
DcHelper.getEventCenter(getContext()).removeObservers(this);
|
||||
DcHelper.getEventCenter(requireContext()).removeObservers(this);
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
listDecoration.onConfigurationChanged(newConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
update();
|
||||
@@ -122,12 +107,11 @@ public class ProfileSettingsFragment extends Fragment
|
||||
if(dcChat!=null && dcChat.isMultiUser()) {
|
||||
memberList = dcContext.getChatContacts(chatId);
|
||||
}
|
||||
else if(contactId>0) {
|
||||
else if(contactId>0 && contactId!=DcContact.DC_CONTACT_ID_SELF) {
|
||||
sharedChats = dcContext.getChatlist(0, null, contactId);
|
||||
}
|
||||
|
||||
adapter.changeData(memberList, dcContact, sharedChats, dcChat);
|
||||
listDecoration.invalidateLayouts();
|
||||
}
|
||||
|
||||
|
||||
@@ -137,10 +121,17 @@ public class ProfileSettingsFragment extends Fragment
|
||||
@Override
|
||||
public void onSettingsClicked(int settingsId) {
|
||||
switch(settingsId) {
|
||||
case ProfileSettingsAdapter.INFO_SEND_MESSAGE_BUTTON:
|
||||
case ProfileAdapter.ITEM_ALL_MEDIA_BUTTON:
|
||||
if (chatId > 0) {
|
||||
Intent intent = new Intent(getActivity(), AllMediaActivity.class);
|
||||
intent.putExtra(AllMediaActivity.CHAT_ID_EXTRA, chatId);
|
||||
startActivity(intent);
|
||||
}
|
||||
break;
|
||||
case ProfileAdapter.ITEM_SEND_MESSAGE_BUTTON:
|
||||
onSendMessage();
|
||||
break;
|
||||
case ProfileSettingsAdapter.INFO_VERIFIED:
|
||||
case ProfileAdapter.ITEM_INTRODUCED_BY:
|
||||
onVerifiedByClicked();
|
||||
break;
|
||||
}
|
||||
@@ -148,7 +139,7 @@ public class ProfileSettingsFragment extends Fragment
|
||||
|
||||
@Override
|
||||
public void onStatusLongClicked() {
|
||||
Context context = getContext();
|
||||
Context context = requireContext();
|
||||
new AlertDialog.Builder(context)
|
||||
.setTitle(R.string.pref_default_status_label)
|
||||
.setItems(new CharSequence[]{
|
||||
@@ -167,9 +158,9 @@ public class ProfileSettingsFragment extends Fragment
|
||||
if (contactId>DcContact.DC_CONTACT_ID_LAST_SPECIAL || contactId==DcContact.DC_CONTACT_ID_SELF) {
|
||||
if (actionMode==null) {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
if (dcChat.canSend()) {
|
||||
if (dcChat.canSend() && dcChat.isEncrypted()) {
|
||||
adapter.toggleMemberSelection(contactId);
|
||||
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback);
|
||||
actionMode = ((AppCompatActivity) requireActivity()).startSupportActionMode(actionModeCallback);
|
||||
}
|
||||
} else {
|
||||
onMemberClicked(contactId);
|
||||
@@ -203,14 +194,19 @@ public class ProfileSettingsFragment extends Fragment
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAvatarClicked() {
|
||||
ProfileActivity activity = (ProfileActivity)getActivity();
|
||||
activity.onEnlargeAvatar();
|
||||
}
|
||||
|
||||
public void onAddMember() {
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
Intent intent = new Intent(getContext(), ContactMultiSelectionActivity.class);
|
||||
intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, dcChat.isProtected());
|
||||
ArrayList<String> preselectedContacts = new ArrayList<>();
|
||||
int[] memberIds = dcContext.getChatContacts(chatId);
|
||||
for (int memberId : memberIds) {
|
||||
preselectedContacts.add(dcContext.getContact(memberId).getAddr());
|
||||
ArrayList<Integer> preselectedContacts = new ArrayList<>();
|
||||
for (int memberId : dcContext.getChatContacts(chatId)) {
|
||||
preselectedContacts.add(memberId);
|
||||
}
|
||||
intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts);
|
||||
startActivityForResult(intent, REQUEST_CODE_PICK_CONTACT);
|
||||
@@ -226,8 +222,8 @@ public class ProfileSettingsFragment extends Fragment
|
||||
public void onSharedChatClicked(int chatId) {
|
||||
Intent intent = new Intent(getContext(), ConversationActivity.class);
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId);
|
||||
getContext().startActivity(intent);
|
||||
getActivity().finish();
|
||||
requireContext().startActivity(intent);
|
||||
requireActivity().finish();
|
||||
}
|
||||
|
||||
private void onVerifiedByClicked() {
|
||||
@@ -246,8 +242,8 @@ public class ProfileSettingsFragment extends Fragment
|
||||
if (chatId != 0) {
|
||||
Intent intent = new Intent(getActivity(), ConversationActivity.class);
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId);
|
||||
getActivity().startActivity(intent);
|
||||
getActivity().finish();
|
||||
requireActivity().startActivity(intent);
|
||||
requireActivity().finish();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,7 +263,7 @@ public class ProfileSettingsFragment extends Fragment
|
||||
menu.findItem(R.id.menu_select_all).setVisible(false);
|
||||
mode.setTitle("1");
|
||||
|
||||
Window window = getActivity().getWindow();
|
||||
Window window = requireActivity().getWindow();
|
||||
originalStatusBarColor = window.getStatusBarColor();
|
||||
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
|
||||
return true;
|
||||
@@ -290,7 +286,7 @@ public class ProfileSettingsFragment extends Fragment
|
||||
readableToDelList.append(dcContext.getContact(toDelId).getDisplayName());
|
||||
}
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
AlertDialog dialog = new AlertDialog.Builder(getContext())
|
||||
AlertDialog dialog = new AlertDialog.Builder(requireContext())
|
||||
.setPositiveButton(R.string.remove_desktop, (d, which) -> {
|
||||
for (Integer toDelId : toDelIds) {
|
||||
dcContext.removeContactFromChat(chatId, toDelId);
|
||||
@@ -298,7 +294,7 @@ public class ProfileSettingsFragment extends Fragment
|
||||
mode.finish();
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.setMessage(getString(dcChat.isBroadcast() ? R.string.ask_remove_from_broadcast : R.string.ask_remove_members, readableToDelList))
|
||||
.setMessage(getString(dcChat.isOutBroadcast() ? R.string.ask_remove_from_channel : R.string.ask_remove_members, readableToDelList))
|
||||
.show();
|
||||
Util.redPositiveButton(dialog);
|
||||
return true;
|
||||
@@ -310,7 +306,7 @@ public class ProfileSettingsFragment extends Fragment
|
||||
public void onDestroyActionMode(ActionMode mode) {
|
||||
actionMode = null;
|
||||
adapter.clearSelection();
|
||||
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
|
||||
requireActivity().getWindow().setStatusBarColor(originalStatusBarColor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,13 +314,15 @@ public class ProfileSettingsFragment extends Fragment
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) {
|
||||
List<String> selected = data.getStringArrayListExtra("contacts");
|
||||
for (String addr : selected) {
|
||||
if (addr!=null) {
|
||||
int toAddId = dcContext.createContact(null, addr);
|
||||
dcContext.addContactToChat(chatId, toAddId);
|
||||
List<Integer> selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA);
|
||||
if(selected == null) return;
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
for (Integer contactId : selected) {
|
||||
if (contactId!=null) {
|
||||
dcContext.addContactToChat(chatId, contactId);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,354 +0,0 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
import com.b44t.messenger.DcChatlist;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcLot;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.contacts.ContactSelectionListItem;
|
||||
import org.thoughtcrime.securesms.mms.GlideRequests;
|
||||
import org.thoughtcrime.securesms.util.DateUtils;
|
||||
import org.thoughtcrime.securesms.util.ResUtil;
|
||||
import org.thoughtcrime.securesms.util.StickyHeaderDecoration.StickyHeaderAdapter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class ProfileSettingsAdapter extends RecyclerView.Adapter
|
||||
implements StickyHeaderAdapter<ProfileSettingsAdapter.HeaderViewHolder>
|
||||
{
|
||||
public static final int INFO_VERIFIED = 118;
|
||||
public static final int INFO_LAST_SEEN = 119;
|
||||
public static final int INFO_SEND_MESSAGE_BUTTON = 120;
|
||||
|
||||
private final @NonNull Context context;
|
||||
private final @NonNull DcContext dcContext;
|
||||
|
||||
private final @NonNull ArrayList<ItemData> itemData = new ArrayList<>();
|
||||
private int itemDataMemberCount;
|
||||
private DcChatlist itemDataSharedChats;
|
||||
private DcContact itemDataContact;
|
||||
private String itemDataStatusText;
|
||||
private boolean isMailingList;
|
||||
private boolean isBroadcast;
|
||||
private final Set<Integer> selectedMembers;
|
||||
|
||||
private final LayoutInflater layoutInflater;
|
||||
private final ItemClickListener clickListener;
|
||||
private final GlideRequests glideRequests;
|
||||
|
||||
static class ItemData {
|
||||
static final int CATEGORY_INFO = 1;
|
||||
static final int CATEGORY_SIGNATURE = 2;
|
||||
static final int CATEGORY_MEMBERS = 3;
|
||||
static final int CATEGORY_SHARED_CHATS = 4;
|
||||
final int type;
|
||||
final int contactId;
|
||||
final int chatlistIndex;
|
||||
final int settingsId;
|
||||
final String label;
|
||||
final int labelColor;
|
||||
final int iconLeft;
|
||||
|
||||
ItemData(int type, int settingsId, String label, int labelColor, int iconLeft) {
|
||||
this(type, 0, 0, settingsId, label, labelColor, iconLeft);
|
||||
}
|
||||
|
||||
ItemData(int type, int contactId, int chatlistIndex) {
|
||||
this(type, contactId, chatlistIndex, 0, null, 0, 0);
|
||||
}
|
||||
|
||||
ItemData(int type, int contactId, int chatlistIndex, int settingsId, @Nullable String label, int labelColor, int iconLeft) {
|
||||
this.type = type;
|
||||
this.contactId = contactId;
|
||||
this.chatlistIndex = chatlistIndex;
|
||||
this.settingsId = settingsId;
|
||||
this.label = label;
|
||||
this.labelColor = labelColor;
|
||||
this.iconLeft = iconLeft;
|
||||
}
|
||||
};
|
||||
|
||||
public ProfileSettingsAdapter(@NonNull Context context,
|
||||
@NonNull GlideRequests glideRequests,
|
||||
@Nullable ItemClickListener clickListener)
|
||||
{
|
||||
super();
|
||||
this.context = context;
|
||||
this.glideRequests = glideRequests;
|
||||
this.clickListener = clickListener;
|
||||
this.dcContext = DcHelper.getContext(context);
|
||||
this.layoutInflater = LayoutInflater.from(context);
|
||||
this.selectedMembers= new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return itemData.size();
|
||||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
public ViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
|
||||
static class HeaderViewHolder extends RecyclerView.ViewHolder {
|
||||
final TextView textView;
|
||||
HeaderViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
textView = itemView.findViewById(R.id.label);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProfileSettingsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
if (viewType == ItemData.CATEGORY_MEMBERS) {
|
||||
final ContactSelectionListItem item = (ContactSelectionListItem)layoutInflater.inflate(R.layout.contact_selection_list_item, parent, false);
|
||||
item.setNoHeaderPadding();
|
||||
return new ViewHolder(item);
|
||||
}
|
||||
else if (viewType == ItemData.CATEGORY_SHARED_CHATS) {
|
||||
final ConversationListItem item = (ConversationListItem)layoutInflater.inflate(R.layout.conversation_list_item_view, parent, false);
|
||||
item.hideItemDivider();
|
||||
return new ViewHolder(item);
|
||||
}
|
||||
else if (viewType == ItemData.CATEGORY_SIGNATURE) {
|
||||
final ProfileStatusItem item = (ProfileStatusItem)layoutInflater.inflate(R.layout.profile_status_item, parent, false);
|
||||
return new ViewHolder(item);
|
||||
}
|
||||
else {
|
||||
final ProfileSettingsItem item = (ProfileSettingsItem)layoutInflater.inflate(R.layout.profile_settings_item, parent, false);
|
||||
return new ViewHolder(item);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
|
||||
ViewHolder holder = (ViewHolder) viewHolder;
|
||||
if (holder.itemView instanceof ContactSelectionListItem) {
|
||||
ContactSelectionListItem contactItem = (ContactSelectionListItem) holder.itemView;
|
||||
|
||||
int contactId = itemData.get(i).contactId;
|
||||
DcContact dcContact = null;
|
||||
String label = null;
|
||||
String name;
|
||||
String addr = null;
|
||||
|
||||
if (contactId == DcContact.DC_CONTACT_ID_ADD_MEMBER) {
|
||||
if (isBroadcast) {
|
||||
name = context.getString(R.string.add_recipients);
|
||||
} else {
|
||||
name = context.getString(R.string.group_add_members);
|
||||
}
|
||||
}
|
||||
else if (contactId == DcContact.DC_CONTACT_ID_QR_INVITE) {
|
||||
name = context.getString(R.string.qrshow_title);
|
||||
}
|
||||
else {
|
||||
dcContact = dcContext.getContact(contactId);
|
||||
name = dcContact.getDisplayName();
|
||||
addr = dcContact.getAddr();
|
||||
}
|
||||
|
||||
contactItem.unbind(glideRequests);
|
||||
contactItem.set(glideRequests, contactId, dcContact, name, addr, label, false, true);
|
||||
contactItem.setSelected(selectedMembers.contains(contactId));
|
||||
contactItem.setOnClickListener(view -> clickListener.onMemberClicked(contactId));
|
||||
contactItem.setOnLongClickListener(view -> {clickListener.onMemberLongClicked(contactId); return true;});
|
||||
}
|
||||
else if (holder.itemView instanceof ConversationListItem) {
|
||||
ConversationListItem conversationListItem = (ConversationListItem) holder.itemView;
|
||||
int chatlistIndex = itemData.get(i).chatlistIndex;
|
||||
|
||||
int chatId = itemDataSharedChats.getChatId(chatlistIndex);
|
||||
DcChat chat = dcContext.getChat(chatId);
|
||||
DcLot summary = itemDataSharedChats.getSummary(chatlistIndex, chat);
|
||||
|
||||
conversationListItem.bind(DcHelper.getThreadRecord(context, summary, chat),
|
||||
itemDataSharedChats.getMsgId(chatlistIndex), summary, glideRequests,
|
||||
Collections.emptySet(), false);
|
||||
conversationListItem.setOnClickListener(view -> clickListener.onSharedChatClicked(chatId));
|
||||
}
|
||||
else if(holder.itemView instanceof ProfileStatusItem) {
|
||||
ProfileStatusItem item = (ProfileStatusItem) holder.itemView;
|
||||
item.setOnLongClickListener(view -> {clickListener.onStatusLongClicked(); return true;});
|
||||
item.set(itemData.get(i).label);
|
||||
}
|
||||
else if(holder.itemView instanceof ProfileSettingsItem) {
|
||||
int settingsId = itemData.get(i).settingsId;
|
||||
ProfileSettingsItem profileSettingsItem = (ProfileSettingsItem) holder.itemView;
|
||||
profileSettingsItem.setOnClickListener(view -> clickListener.onSettingsClicked(settingsId));
|
||||
profileSettingsItem.set(itemData.get(i).label, itemData.get(i).labelColor, itemData.get(i).iconLeft);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int i) {
|
||||
return itemData.get(i).type;
|
||||
}
|
||||
|
||||
public interface ItemClickListener {
|
||||
void onSettingsClicked(int settingsId);
|
||||
void onStatusLongClicked();
|
||||
void onSharedChatClicked(int chatId);
|
||||
void onMemberClicked(int contactId);
|
||||
void onMemberLongClicked(int contactId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getHeaderId(int position) {
|
||||
return getItemViewType(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
|
||||
return new HeaderViewHolder(LayoutInflater.from(context).inflate(R.layout.contact_selection_list_divider, parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindHeaderViewHolder(HeaderViewHolder viewHolder, int position) {
|
||||
String txt = "";
|
||||
switch(getItemViewType(position)) {
|
||||
case ItemData.CATEGORY_MEMBERS:
|
||||
if (isMailingList) {
|
||||
txt = context.getString(R.string.contacts_headline);
|
||||
} else if (isBroadcast) {
|
||||
txt = context.getResources().getQuantityString(R.plurals.n_recipients, (int) itemDataMemberCount, (int) itemDataMemberCount);
|
||||
} else {
|
||||
txt = context.getResources().getQuantityString(R.plurals.n_members, (int) itemDataMemberCount, (int) itemDataMemberCount);
|
||||
}
|
||||
break;
|
||||
case ItemData.CATEGORY_SHARED_CHATS:
|
||||
txt = context.getString(R.string.profile_shared_chats);
|
||||
break;
|
||||
case ItemData.CATEGORY_INFO:
|
||||
txt = context.getString(R.string.info);
|
||||
break;
|
||||
case ItemData.CATEGORY_SIGNATURE:
|
||||
txt = context.getString(R.string.pref_default_status_label);
|
||||
break;
|
||||
default:
|
||||
txt = context.getString(R.string.menu_settings);
|
||||
break;
|
||||
}
|
||||
viewHolder.textView.setText(txt);
|
||||
}
|
||||
|
||||
public void toggleMemberSelection(int contactId) {
|
||||
if (!selectedMembers.remove(contactId)) {
|
||||
selectedMembers.add(contactId);
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public Collection<Integer> getSelectedMembers() {
|
||||
return new HashSet<>(selectedMembers);
|
||||
}
|
||||
|
||||
public int getSelectedMembersCount() {
|
||||
return selectedMembers.size();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getStatusText() {
|
||||
return itemDataStatusText;
|
||||
}
|
||||
|
||||
public void clearSelection() {
|
||||
selectedMembers.clear();
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void changeData(@Nullable int[] memberList, @Nullable DcContact dcContact, @Nullable DcChatlist sharedChats, @Nullable DcChat dcChat) {
|
||||
itemData.clear();
|
||||
itemDataMemberCount = 0;
|
||||
itemDataSharedChats = null;
|
||||
itemDataContact = null;
|
||||
itemDataStatusText = "";
|
||||
isMailingList = false;
|
||||
isBroadcast = false;
|
||||
|
||||
if (memberList!=null) {
|
||||
itemDataMemberCount = memberList.length;
|
||||
if (dcChat.isBroadcast()) {
|
||||
isBroadcast = true;
|
||||
}
|
||||
|
||||
if (dcChat.isMailingList()) {
|
||||
isMailingList = true;
|
||||
} else if (dcChat.canSend()) {
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_MEMBERS, DcContact.DC_CONTACT_ID_ADD_MEMBER, 0));
|
||||
if (!isBroadcast) {
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_MEMBERS, DcContact.DC_CONTACT_ID_QR_INVITE, 0));
|
||||
}
|
||||
}
|
||||
|
||||
for (int value : memberList) {
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_MEMBERS, value, 0));
|
||||
}
|
||||
}
|
||||
else if (sharedChats!=null && dcContact!=null) {
|
||||
boolean chatIsDeviceTalk = dcChat != null && dcChat.isDeviceTalk();
|
||||
|
||||
itemDataContact = dcContact;
|
||||
if (!chatIsDeviceTalk) {
|
||||
int verifierId = dcContact.getVerifierId();
|
||||
if (verifierId != 0) {
|
||||
String verifiedInfo;
|
||||
if (verifierId == DcContact.DC_CONTACT_ID_SELF) {
|
||||
verifiedInfo = context.getString(R.string.verified_by_you);
|
||||
} else {
|
||||
verifiedInfo = context.getString(R.string.verified_by, dcContext.getContact(verifierId).getDisplayName());
|
||||
}
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_VERIFIED, verifiedInfo, 0, R.drawable.ic_verified));
|
||||
}
|
||||
|
||||
long lastSeenTimestamp = (itemDataContact!=null? itemDataContact.getLastSeen() : 0);
|
||||
String lastSeenTxt;
|
||||
if (lastSeenTimestamp == 0) {
|
||||
lastSeenTxt = context.getString(R.string.last_seen_unknown);
|
||||
}
|
||||
else {
|
||||
lastSeenTxt = context.getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(context, lastSeenTimestamp));
|
||||
}
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_LAST_SEEN, lastSeenTxt, 0, 0));
|
||||
|
||||
|
||||
int color = ResUtil.getColor(context, R.attr.colorAccent);
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_SEND_MESSAGE_BUTTON, context.getString(R.string.send_message), color, 0));
|
||||
}
|
||||
|
||||
itemDataStatusText = dcContact.getStatus();
|
||||
if (!itemDataStatusText.isEmpty()) {
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_SIGNATURE, 0, itemDataStatusText, 0, 0));
|
||||
}
|
||||
|
||||
itemDataSharedChats = sharedChats;
|
||||
if (!chatIsDeviceTalk) {
|
||||
int sharedChatsCnt = sharedChats.getCnt();
|
||||
for (int i = 0; i < sharedChatsCnt; i++) {
|
||||
itemData.add(new ItemData(ItemData.CATEGORY_SHARED_CHATS, 0, i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import org.thoughtcrime.securesms.util.ResUtil;
|
||||
|
||||
public class ProfileSettingsItem extends LinearLayout {
|
||||
|
||||
private TextView labelView;
|
||||
|
||||
public ProfileSettingsItem(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public ProfileSettingsItem(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
labelView = findViewById(R.id.label);
|
||||
}
|
||||
|
||||
public void set(String label, int labelColor, int iconLeft) {
|
||||
labelView.setText(label==null? "" : label);
|
||||
labelView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, 0,0,0);
|
||||
|
||||
if (labelColor != 0) {
|
||||
labelView.setTextColor(labelColor);
|
||||
} else {
|
||||
labelView.setTextColor(ResUtil.getColor(getContext(), R.attr.emoji_text_color));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.graphics.drawable.DrawableCompat;
|
||||
|
||||
import org.thoughtcrime.securesms.util.ResUtil;
|
||||
|
||||
public class ProfileTextItem extends LinearLayout {
|
||||
|
||||
private TextView labelView;
|
||||
private @Nullable TextView valueView;
|
||||
|
||||
public ProfileTextItem(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public ProfileTextItem(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
labelView = findViewById(R.id.label);
|
||||
valueView = findViewById(R.id.value);
|
||||
}
|
||||
|
||||
public void set(String label, int icon, boolean tint) {
|
||||
labelView.setText(label);
|
||||
|
||||
if (icon != 0) {
|
||||
Drawable orgDrawable = ContextCompat.getDrawable(getContext(), icon);
|
||||
if (orgDrawable != null) {
|
||||
Drawable drawable = orgDrawable.mutate(); // avoid global state modification and showing eg. app-icon tinted also elsewhere
|
||||
drawable = DrawableCompat.wrap(drawable);
|
||||
if (tint) {
|
||||
int color = ResUtil.getColor(getContext(), R.attr.colorAccent);
|
||||
DrawableCompat.setTint(drawable, color);
|
||||
}
|
||||
labelView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
if (valueView != null) {
|
||||
valueView.setText(value);
|
||||
valueView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -46,6 +46,9 @@ import androidx.constraintlayout.widget.Group;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.DcProvider;
|
||||
import com.b44t.messenger.rpc.EnteredLoginParam;
|
||||
import com.b44t.messenger.rpc.Rpc;
|
||||
import com.b44t.messenger.rpc.RpcException;
|
||||
import com.b44t.messenger.util.concurrent.ListenableFuture;
|
||||
import com.b44t.messenger.util.concurrent.SettableFuture;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
@@ -61,7 +64,6 @@ import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.views.ProgressDialog;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class RegistrationActivity extends BaseActionBarActivity implements DcEventCenter.DcEventDelegate {
|
||||
@@ -280,19 +282,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
int id = item.getItemId();
|
||||
|
||||
if (id == R.id.do_register) {
|
||||
String oldAddr = DcHelper.getSelfAddr(this);
|
||||
String newAddr = emailInput.getText().toString();
|
||||
if (!TextUtils.isEmpty(oldAddr)
|
||||
&& !TextUtils.equals(oldAddr.toLowerCase(Locale.ROOT), newAddr.toLowerCase(Locale.ROOT))) {
|
||||
// Tell the user about AEAP if they are about to change their address
|
||||
new AlertDialog.Builder(this)
|
||||
.setMessage(getString(R.string.aeap_explanation, oldAddr, newAddr))
|
||||
.setNegativeButton(R.string.cancel, (d, w) -> {})
|
||||
.setPositiveButton(R.string.perm_continue, (d, w) -> do_register())
|
||||
.show();
|
||||
} else {
|
||||
do_register();
|
||||
}
|
||||
do_register();
|
||||
return true;
|
||||
} else if (id == android.R.id.home) {
|
||||
// handle close button click here
|
||||
@@ -594,40 +584,50 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
}
|
||||
|
||||
private void setupConfig() {
|
||||
setConfig(R.id.email_text, CONFIG_ADDRESS, true);
|
||||
setConfig(R.id.password_text, CONFIG_MAIL_PASSWORD, false);
|
||||
setConfig(R.id.imap_server_text, CONFIG_MAIL_SERVER, true);
|
||||
setConfig(R.id.imap_port_text, CONFIG_MAIL_PORT, true);
|
||||
setConfig(R.id.imap_login_text, CONFIG_MAIL_USER, false);
|
||||
setConfig(R.id.smtp_server_text, CONFIG_SEND_SERVER, true);
|
||||
setConfig(R.id.smtp_port_text, CONFIG_SEND_PORT, true);
|
||||
setConfig(R.id.smtp_login_text, CONFIG_SEND_USER, false);
|
||||
setConfig(R.id.smtp_password_text, CONFIG_SEND_PASSWORD, false);
|
||||
|
||||
DcHelper.getContext(this).setConfigInt(CONFIG_MAIL_SECURITY, imapSecurity.getSelectedItemPosition());
|
||||
DcHelper.getContext(this).setConfigInt(CONFIG_SEND_SECURITY, smtpSecurity.getSelectedItemPosition());
|
||||
|
||||
int server_flags = 0;
|
||||
if(authMethod.getSelectedItemPosition()==1) server_flags |= DcContext.DC_LP_AUTH_OAUTH2;
|
||||
DcHelper.getContext(this).setConfigInt(CONFIG_SERVER_FLAGS, server_flags);
|
||||
|
||||
DcHelper.getContext(this).setConfigInt("smtp_certificate_checks", certCheck.getSelectedItemPosition());
|
||||
DcHelper.getContext(this).setConfigInt("imap_certificate_checks", certCheck.getSelectedItemPosition());
|
||||
|
||||
// calling configure() results in
|
||||
// receiving multiple DC_EVENT_CONFIGURE_PROGRESS events
|
||||
DcHelper.getAccounts(this).stopIo();
|
||||
DcHelper.getEventCenter(this).captureNextError();
|
||||
DcHelper.getContext(this).configure();
|
||||
|
||||
EnteredLoginParam param = new EnteredLoginParam(
|
||||
getParam(R.id.email_text, true),
|
||||
getParam(R.id.password_text, false),
|
||||
getParam(R.id.imap_server_text, true),
|
||||
Util.objectToInt(getParam(R.id.imap_port_text, true)),
|
||||
EnteredLoginParam.socketSecurityFromInt(imapSecurity.getSelectedItemPosition()),
|
||||
getParam(R.id.imap_login_text, false),
|
||||
getParam(R.id.smtp_server_text, true),
|
||||
Util.objectToInt(getParam(R.id.smtp_port_text, true)),
|
||||
EnteredLoginParam.socketSecurityFromInt(smtpSecurity.getSelectedItemPosition()),
|
||||
getParam(R.id.smtp_login_text, false),
|
||||
getParam(R.id.smtp_password_text, false),
|
||||
EnteredLoginParam.certificateChecksFromInt(certCheck.getSelectedItemPosition()),
|
||||
authMethod.getSelectedItemPosition() == 1
|
||||
);
|
||||
|
||||
new Thread(() -> {
|
||||
Rpc rpc = DcHelper.getRpc(this);
|
||||
try {
|
||||
rpc.addOrUpdateTransport(DcHelper.getContext(this).getAccountId(), param);
|
||||
DcHelper.getEventCenter(this).endCaptureNextError();
|
||||
progressDialog.dismiss();
|
||||
Intent conversationList = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
startActivity(conversationList);
|
||||
finish();
|
||||
} catch (RpcException e) {
|
||||
Util.runOnMain(() -> {
|
||||
DcHelper.getEventCenter(this).endCaptureNextError();
|
||||
progressDialog.dismiss();
|
||||
WelcomeActivity.maybeShowConfigurationError(this, e.getMessage());
|
||||
});
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
private void setConfig(@IdRes int viewId, String configTarget, boolean doTrim) {
|
||||
private String getParam(@IdRes int viewId, boolean doTrim) {
|
||||
TextInputEditText view = findViewById(viewId);
|
||||
String value = view.getText().toString();
|
||||
if(doTrim) {
|
||||
value = value.trim();
|
||||
}
|
||||
DcHelper.getContext(this).setConfig(configTarget, value.isEmpty()? null : value);
|
||||
return value.isEmpty()? null : value;
|
||||
}
|
||||
|
||||
private void stopLoginProcess() {
|
||||
@@ -637,25 +637,9 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
if (event.getId()==DcContext.DC_EVENT_CONFIGURE_PROGRESS) {
|
||||
long progress = event.getData1Int();
|
||||
if (progress==0/*error/aborted*/) {
|
||||
DcHelper.getAccounts(this).startIo(); // start-io is also needed on errors to make previous config work in case of changes
|
||||
DcHelper.getEventCenter(this).endCaptureNextError();
|
||||
progressDialog.dismiss();
|
||||
WelcomeActivity.maybeShowConfigurationError(this, event.getData2Str());
|
||||
}
|
||||
else if (progress<1000/*progress in permille*/) {
|
||||
int percent = (int)progress / 10;
|
||||
progressDialog.setMessage(getResources().getString(R.string.one_moment)+String.format(" %d%%", percent));
|
||||
}
|
||||
else if (progress==1000/*done*/) {
|
||||
DcHelper.getAccounts(this).startIo();
|
||||
DcHelper.getEventCenter(this).endCaptureNextError();
|
||||
progressDialog.dismiss();
|
||||
Intent conversationList = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
startActivity(conversationList);
|
||||
finish();
|
||||
}
|
||||
long progress = event.getData1Int(); // progress in permille
|
||||
int percent = (int)progress / 10;
|
||||
progressDialog.setMessage(getResources().getString(R.string.one_moment)+String.format(" %d%%", percent));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,6 +297,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
|
||||
text = cs.toString();
|
||||
}
|
||||
}
|
||||
|
||||
if (text != null) {
|
||||
setSharedText(intent, text.toString());
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.speech.tts.TextToSpeech;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Base64;
|
||||
import android.util.Log;
|
||||
@@ -59,6 +60,7 @@ import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcEventDelegate {
|
||||
@@ -82,6 +84,8 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
private boolean internetAccess = false;
|
||||
private boolean hideActionBar = false;
|
||||
|
||||
private TextToSpeech tts;
|
||||
|
||||
public static void openMaps(Context context, int chatId) {
|
||||
openMaps(context, chatId, "");
|
||||
}
|
||||
@@ -116,7 +120,7 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
openWebxdcActivity(context, instance, "");
|
||||
}
|
||||
|
||||
public static void openWebxdcActivity(Context context, DcMsg instance, String href) {
|
||||
public static void openWebxdcActivity(Context context, @NonNull DcMsg instance, String href) {
|
||||
openWebxdcActivity(context, instance.getId(), false, href);
|
||||
}
|
||||
|
||||
@@ -159,6 +163,7 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
protected void onCreate(Bundle state, boolean ready) {
|
||||
super.onCreate(state, ready);
|
||||
rpc = DcHelper.getRpc(this);
|
||||
initTTS();
|
||||
|
||||
Bundle b = getIntent().getExtras();
|
||||
hideActionBar = b.getBoolean(EXTRA_HIDE_ACTION_BAR, false);
|
||||
@@ -274,6 +279,7 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
lastOpenTime = System.currentTimeMillis();
|
||||
DcHelper.getEventCenter(this.getApplicationContext()).removeObservers(this);
|
||||
leaveRealtimeChannel();
|
||||
tts.shutdown();
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@@ -311,6 +317,14 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
setScreenMode(newConfig);
|
||||
}
|
||||
|
||||
private void initTTS() {
|
||||
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
|
||||
@Override
|
||||
public void onInit(int status) {
|
||||
Log.i(TAG, "TTS Init Status: " + status);
|
||||
}
|
||||
});
|
||||
}
|
||||
private void setScreenMode(Configuration config) {
|
||||
// enter/exit fullscreen mode depending on orientation (landscape/portrait),
|
||||
// on tablets there is enough height so fullscreen mode is never enabled there
|
||||
@@ -519,11 +533,6 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
return BuildConfig.VERSION_NAME;
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
public boolean isCommunity() {
|
||||
return dcContext.isCommunity();
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
public int sendUpdateMaxSize() {
|
||||
return WebxdcActivity.this.sendUpdateMaxSize;
|
||||
@@ -536,24 +545,13 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
|
||||
@JavascriptInterface
|
||||
public String selfAddr() {
|
||||
if (dcContext.isCommunity() && !TextUtils.isEmpty(dcContext.getCommunityUser())) {
|
||||
int flags = Base64.NO_WRAP | Base64.NO_PADDING | Base64.URL_SAFE;
|
||||
return Base64.encodeToString(dcContext.getCommunityUser().getBytes(), flags);
|
||||
}
|
||||
return WebxdcActivity.this.selfAddr;
|
||||
}
|
||||
|
||||
/** @noinspection unused*/
|
||||
@JavascriptInterface
|
||||
public String selfName() {
|
||||
if (dcContext.isCommunity() && !TextUtils.isEmpty(dcContext.getCommunityUser())) {
|
||||
return dcContext.getCommunityUser();
|
||||
}
|
||||
String name = WebxdcActivity.this.dcContext.getConfig("displayname");
|
||||
if (TextUtils.isEmpty(name)) {
|
||||
name = selfAddr();
|
||||
}
|
||||
return name;
|
||||
return WebxdcActivity.this.dcContext.getName();
|
||||
}
|
||||
|
||||
/** @noinspection unused*/
|
||||
@@ -651,5 +649,12 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
public void ttsSpeak(String text, String lang) {
|
||||
if (lang != null && !lang.isEmpty()) tts.setLanguage(Locale.forLanguageTag(lang));
|
||||
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,6 @@ import java.io.OutputStream;
|
||||
|
||||
public class WelcomeActivity extends BaseActionBarActivity implements DcEventCenter.DcEventDelegate {
|
||||
public static final String BACKUP_QR_EXTRA = "backup_qr_extra";
|
||||
public static final String COMMUNITY_EXTRA = "community_extra";
|
||||
public static final int PICK_BACKUP = 20574;
|
||||
private final static String TAG = WelcomeActivity.class.getSimpleName();
|
||||
public static final String TMP_BACKUP_FILE = "tmp-backup-file";
|
||||
@@ -59,7 +58,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
private boolean imexUserAborted;
|
||||
DcContext dcContext;
|
||||
private NotificationController notificationController;
|
||||
private Uri communityUri;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
@@ -82,6 +80,8 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
intent.setAction(DC_REQUEST_ACCOUNT_DATA);
|
||||
sendBroadcast(intent);
|
||||
}
|
||||
|
||||
DcHelper.maybeShowMigrationError(this);
|
||||
}
|
||||
|
||||
protected void initializeActionBar() {
|
||||
@@ -120,10 +120,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
communityUri = getIntent().getParcelableExtra(COMMUNITY_EXTRA);
|
||||
if (communityUri != null) {
|
||||
startImport(null, communityUri);
|
||||
}
|
||||
String backupQr = getIntent().getStringExtra(BACKUP_QR_EXTRA);
|
||||
if (backupQr != null) {
|
||||
getIntent().removeExtra(BACKUP_QR_EXTRA);
|
||||
@@ -263,15 +259,9 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
private void progressSuccess() {
|
||||
DcHelper.getEventCenter(this).endCaptureNextError();
|
||||
progressDialog.dismiss();
|
||||
if (dcContext.isCommunity()) {
|
||||
Intent intent = new Intent(getApplicationContext(), CreateProfileActivity.class);
|
||||
intent.putExtra(CreateProfileActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
} else {
|
||||
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
}
|
||||
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
|
||||
@@ -318,10 +308,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
notificationController.setProgress(1000, progress, String.format(" %d%%", (int) progress / 10));
|
||||
}
|
||||
else if (progress==1000/*done*/) {
|
||||
if (communityUri != null) dcContext.setCommunityMode(true);
|
||||
if (dcContext.isCommunity()) {
|
||||
dcContext.setCommunityUser(null);
|
||||
}
|
||||
DcHelper.getAccounts(this).startIo();
|
||||
progressSuccess();
|
||||
notificationController.close();
|
||||
|
||||
@@ -41,6 +41,8 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class AccountSelectionListFragment extends DialogFragment implements DcEventCenter.DcEventDelegate
|
||||
{
|
||||
private static final String TAG = AccountSelectionListFragment.class.getSimpleName();
|
||||
@@ -134,9 +136,35 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
onToggleMute(accountId);
|
||||
} else if (itemId == R.id.menu_set_tag) {
|
||||
onSetTag(accountId);
|
||||
} else if (itemId == R.id.menu_move_to_top) {
|
||||
onMoveToTop(accountId);
|
||||
}
|
||||
}
|
||||
|
||||
private void onMoveToTop(int accountId) {
|
||||
Activity activity = getActivity();
|
||||
if (activity == null) return;
|
||||
|
||||
int[] accountIds = DcHelper.getAccounts(activity).getAll();
|
||||
Integer[] ids = new Integer[accountIds.length];
|
||||
ids[0] = accountId;
|
||||
int j = 1;
|
||||
for (int accId : accountIds) {
|
||||
if (accId != accountId) {
|
||||
ids[j++] = accId;
|
||||
}
|
||||
}
|
||||
|
||||
Rpc rpc = DcHelper.getRpc(activity);
|
||||
try {
|
||||
rpc.setAccountsOrder(Arrays.asList(ids));
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "Error calling rpc.setAccountsOrder()", e);
|
||||
}
|
||||
|
||||
refreshData();
|
||||
}
|
||||
|
||||
private void onSetTag(int accountId) {
|
||||
Activity activity = getActivity();
|
||||
if (activity == null) return;
|
||||
|
||||
@@ -87,12 +87,8 @@ public class AccountSelectionListItem extends LinearLayout {
|
||||
}
|
||||
|
||||
addrOrTag = dcContext.getConfig(CONFIG_PRIVATE_TAG);
|
||||
if ("".equals(addrOrTag)) {
|
||||
if (dcContext.isCommunity()) {
|
||||
addrOrTag = getContext().getString(R.string.community);
|
||||
} else if (!dcContext.isChatmail()) {
|
||||
addrOrTag = self.getAddr();
|
||||
}
|
||||
if ("".equals(addrOrTag) && !dcContext.isChatmail()) {
|
||||
addrOrTag = self.getAddr();
|
||||
}
|
||||
|
||||
unreadCount = dcContext.getFreshMsgs().length;
|
||||
|
||||
@@ -94,11 +94,6 @@ public class AttachmentTypeSelector extends PopupWindow {
|
||||
ViewUtil.findById(layout, R.id.location_button_label).setVisibility(View.GONE);
|
||||
//}
|
||||
|
||||
if (!DcHelper.isWebrtcConfigOk(DcHelper.getContext(context))) {
|
||||
this.videoChatButton.setVisibility(View.GONE);
|
||||
ViewUtil.findById(layout, R.id.invite_video_chat_label).setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
setLocationButtonImage(context);
|
||||
|
||||
setContentView(layout);
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
package org.thoughtcrime.securesms.components;
|
||||
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.appcompat.widget.AppCompatEditText;
|
||||
import androidx.core.view.ContentInfoCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.inputmethod.EditorInfoCompat;
|
||||
import androidx.core.view.inputmethod.InputConnectionCompat;
|
||||
import androidx.core.view.inputmethod.InputContentInfoCompat;
|
||||
@@ -50,6 +53,28 @@ public class ComposeText extends AppCompatEditText {
|
||||
initialize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTextContextMenuItem(int id) {
|
||||
if (id == android.R.id.paste) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
id = android.R.id.pasteAsPlainText;
|
||||
} else if (ViewCompat.getOnReceiveContentMimeTypes(this) != null) {
|
||||
// older device, manually paste as plain text
|
||||
ClipboardManager cm = (ClipboardManager) getContext().getSystemService(
|
||||
Context.CLIPBOARD_SERVICE);
|
||||
ClipData clip = (cm == null) ? null : cm.getPrimaryClip();
|
||||
if (clip != null && clip.getItemCount() > 0) {
|
||||
ContentInfoCompat payload = new ContentInfoCompat.Builder(clip, ContentInfoCompat.SOURCE_CLIPBOARD)
|
||||
.setFlags(ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT)
|
||||
.build();
|
||||
ViewCompat.performReceiveContent(this, payload);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return super.onTextContextMenuItem(id);
|
||||
}
|
||||
|
||||
public String getTextTrimmed(){
|
||||
return getText().toString().trim();
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
private TextView dateView;
|
||||
private TextView editedView;
|
||||
private ImageView bookmarkIndicatorView;
|
||||
private ImageView secureIndicatorView;
|
||||
private ImageView emailIndicatorView;
|
||||
private ImageView locationIndicatorView;
|
||||
private DeliveryStatusView deliveryStatusView;
|
||||
private Integer textColor = null;
|
||||
@@ -48,7 +48,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
dateView = findViewById(R.id.footer_date);
|
||||
editedView = findViewById(R.id.footer_edited);
|
||||
bookmarkIndicatorView = findViewById(R.id.footer_bookmark_indicator);
|
||||
secureIndicatorView = findViewById(R.id.footer_secure_indicator);
|
||||
emailIndicatorView = findViewById(R.id.footer_email_indicator);
|
||||
locationIndicatorView = findViewById(R.id.footer_location_indicator);
|
||||
deliveryStatusView = new DeliveryStatusView(findViewById(R.id.delivery_indicator));
|
||||
|
||||
@@ -65,7 +65,14 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
boolean bookmark = messageRecord.getOriginalMsgId() != 0 || messageRecord.getSavedMsgId() != 0;
|
||||
bookmarkIndicatorView.setVisibility(bookmark ? View.VISIBLE : View.GONE);
|
||||
editedView.setVisibility(messageRecord.isEdited() ? View.VISIBLE : View.GONE);
|
||||
secureIndicatorView.setVisibility(messageRecord.isSecure() ? View.VISIBLE : View.GONE);
|
||||
|
||||
int downloadState = messageRecord.getDownloadState();
|
||||
if (messageRecord.isSecure() || downloadState == DcMsg.DC_DOWNLOAD_AVAILABLE || downloadState == DcMsg.DC_DOWNLOAD_FAILURE || downloadState == DcMsg.DC_DOWNLOAD_IN_PROGRESS) {
|
||||
emailIndicatorView.setVisibility(View.GONE);
|
||||
} else {
|
||||
emailIndicatorView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
locationIndicatorView.setVisibility(messageRecord.hasLocation() ? View.VISIBLE : View.GONE);
|
||||
presentDeliveryStatus(messageRecord);
|
||||
}
|
||||
@@ -74,7 +81,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
dateView.setTextColor(color);
|
||||
editedView.setTextColor(color);
|
||||
bookmarkIndicatorView.setColorFilter(color);
|
||||
secureIndicatorView.setColorFilter(color);
|
||||
emailIndicatorView.setColorFilter(color);
|
||||
locationIndicatorView.setColorFilter(color);
|
||||
deliveryStatusView.setTint(color);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ import android.widget.TextView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.annimon.stream.Stream;
|
||||
import com.b44t.messenger.DcContact;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
import com.b44t.messenger.rpc.RpcException;
|
||||
@@ -180,9 +179,8 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
authorView.setTextColor(getResources().getColor(R.color.core_dark_05));
|
||||
quoteBarView.setBackgroundColor(getResources().getColor(R.color.core_dark_05));
|
||||
} else {
|
||||
int color = author.getColor()==0? contact.getColor() : author.getColor();
|
||||
authorView.setTextColor(Util.rgbToArgbColor(color));
|
||||
quoteBarView.setBackgroundColor(Util.rgbToArgbColor(color));
|
||||
authorView.setTextColor(Util.rgbToArgbColor(contact.getColor()));
|
||||
quoteBarView.setBackgroundColor(Util.rgbToArgbColor(contact.getColor()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -198,18 +196,17 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
}
|
||||
|
||||
private void setQuoteAttachment(@NonNull GlideRequests glideRequests, @NonNull SlideDeck slideDeck) {
|
||||
List<Slide> thumbnailSlides = Stream.of(slideDeck.getSlides()).filter(s -> s.hasImage() || s.hasVideo() || s.hasSticker() || s.isWebxdcDocument() || s.isVcard()).limit(1).toList();
|
||||
List<Slide> audioSlides = Stream.of(slideDeck.getSlides()).filter(s -> s.hasAudio()).limit(1).toList();
|
||||
List<Slide> documentSlides = Stream.of(attachments.getSlides()).filter(Slide::hasDocument).limit(1).toList();
|
||||
List<Slide> slides = slideDeck.getSlides();
|
||||
Slide slide = slides.isEmpty()? null : slides.get(0);
|
||||
|
||||
attachmentVideoOverlayView.setVisibility(GONE);
|
||||
|
||||
if (!thumbnailSlides.isEmpty() && thumbnailSlides.get(0).getUri() != null) {
|
||||
if (slide != null && slide.hasQuoteThumbnail()) {
|
||||
thumbnailView.setVisibility(VISIBLE);
|
||||
attachmentContainerView.setVisibility(GONE);
|
||||
dismissView.setBackgroundResource(R.drawable.dismiss_background);
|
||||
|
||||
if (thumbnailSlides.get(0).isWebxdcDocument()) {
|
||||
if (slide.isWebxdcDocument()) {
|
||||
try {
|
||||
JSONObject info = quotedMsg.getWebxdcInfo();
|
||||
byte[] blob = quotedMsg.getWebxdcBlob(info.getString("icon"));
|
||||
@@ -222,7 +219,7 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
Log.e(TAG, "failed to get webxdc icon", e);
|
||||
thumbnailView.setVisibility(GONE);
|
||||
}
|
||||
} else if (thumbnailSlides.get(0).isVcard()) {
|
||||
} else if (slide.isVcard()) {
|
||||
try {
|
||||
VcardContact vcardContact = DcHelper.getRpc(getContext()).parseVcard(quotedMsg.getFile()).get(0);
|
||||
Recipient recipient = new Recipient(getContext(), vcardContact);
|
||||
@@ -237,22 +234,24 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
thumbnailView.setVisibility(GONE);
|
||||
}
|
||||
} else {
|
||||
Uri thumbnailUri = thumbnailSlides.get(0).getUri();
|
||||
if (thumbnailSlides.get(0).hasVideo()) {
|
||||
Uri thumbnailUri = slide.getUri();
|
||||
if (slide.hasVideo()) {
|
||||
attachmentVideoOverlayView.setVisibility(VISIBLE);
|
||||
MediaUtil.createVideoThumbnailIfNeeded(getContext(), thumbnailSlides.get(0).getUri(), thumbnailSlides.get(0).getThumbnailUri(), null);
|
||||
thumbnailUri = thumbnailSlides.get(0).getThumbnailUri();
|
||||
MediaUtil.createVideoThumbnailIfNeeded(getContext(), slide.getUri(), slide.getThumbnailUri(), null);
|
||||
thumbnailUri = slide.getThumbnailUri();
|
||||
}
|
||||
if (thumbnailUri != null) {
|
||||
glideRequests.load(new DecryptableUri(thumbnailUri))
|
||||
.centerCrop()
|
||||
.override(getContext().getResources().getDimensionPixelSize(R.dimen.quote_thumb_size))
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.into(thumbnailView);
|
||||
}
|
||||
glideRequests.load(new DecryptableUri(thumbnailUri))
|
||||
.centerCrop()
|
||||
.override(getContext().getResources().getDimensionPixelSize(R.dimen.quote_thumb_size))
|
||||
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
||||
.into(thumbnailView);
|
||||
}
|
||||
} else if(!audioSlides.isEmpty()) {
|
||||
} else if(slide != null && slide.hasAudio()) {
|
||||
thumbnailView.setVisibility(GONE);
|
||||
attachmentContainerView.setVisibility(GONE);
|
||||
} else if (!documentSlides.isEmpty()) {
|
||||
} else if (slide != null && slide.hasDocument()) {
|
||||
thumbnailView.setVisibility(GONE);
|
||||
attachmentContainerView.setVisibility(VISIBLE);
|
||||
} else {
|
||||
|
||||
@@ -32,7 +32,6 @@ public class WebxdcView extends FrameLayout {
|
||||
private final @NonNull TextView appSubtitle;
|
||||
|
||||
private @Nullable SlideClickListener viewListener;
|
||||
private boolean isCommunity;
|
||||
|
||||
public WebxdcView(@NonNull Context context) {
|
||||
this(context, null);
|
||||
@@ -67,7 +66,6 @@ public class WebxdcView extends FrameLayout {
|
||||
public void setWebxdc(final @NonNull DcMsg dcMsg, String defaultSummary)
|
||||
{
|
||||
JSONObject info = dcMsg.getWebxdcInfo();
|
||||
isCommunity = JsonUtils.optBoolean(info, "community");
|
||||
setOnClickListener(new OpenClickedListener(getContext(), dcMsg));
|
||||
|
||||
// icon
|
||||
@@ -86,17 +84,18 @@ public class WebxdcView extends FrameLayout {
|
||||
// subtitle
|
||||
String summary = info.optString("summary");
|
||||
if (summary.isEmpty()) {
|
||||
summary = isCommunity? getContext().getString(R.string.community) : defaultSummary;
|
||||
summary = defaultSummary;
|
||||
}
|
||||
if (summary.isEmpty()) {
|
||||
appSubtitle.setVisibility(View.GONE);
|
||||
} else {
|
||||
appSubtitle.setVisibility(View.VISIBLE);
|
||||
appSubtitle.setText(summary);
|
||||
}
|
||||
appSubtitle.setText(summary);
|
||||
}
|
||||
|
||||
public boolean isCommunity() {
|
||||
return isCommunity;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
String type = getContext().getString(isCommunity? R.string.community : R.string.webxdc_app);
|
||||
String type = getContext().getString( R.string.webxdc_app);
|
||||
String desc = type;
|
||||
desc += "\n" + appName.getText();
|
||||
if (appSubtitle.getText() != null && !appSubtitle.getText().toString().isEmpty() && !appSubtitle.getText().toString().equals(type)) {
|
||||
|
||||
@@ -5,7 +5,6 @@ import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_VERIFIED_ONE_ON
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -22,7 +21,6 @@ import org.thoughtcrime.securesms.ConversationListActivity;
|
||||
import org.thoughtcrime.securesms.InstantOnboardingActivity;
|
||||
import org.thoughtcrime.securesms.WelcomeActivity;
|
||||
import org.thoughtcrime.securesms.accounts.AccountSelectionListFragment;
|
||||
import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
@@ -127,10 +125,10 @@ public class AccountManager {
|
||||
}
|
||||
|
||||
public void switchAccountAndStartActivity(Activity activity, int destAccountId) {
|
||||
switchAccountAndStartActivity(activity, destAccountId, null, null);
|
||||
switchAccountAndStartActivity(activity, destAccountId, null);
|
||||
}
|
||||
|
||||
private void switchAccountAndStartActivity(Activity activity, int destAccountId, @Nullable String backupQr, @Nullable byte[] communityBlob) {
|
||||
private void switchAccountAndStartActivity(Activity activity, int destAccountId, @Nullable String backupQr) {
|
||||
if (destAccountId==0) {
|
||||
beginAccountCreation(activity);
|
||||
} else {
|
||||
@@ -143,12 +141,6 @@ public class AccountManager {
|
||||
if (backupQr != null) {
|
||||
intent.putExtra(WelcomeActivity.BACKUP_QR_EXTRA, backupQr);
|
||||
}
|
||||
if (communityBlob != null) {
|
||||
String mimeType = "application/octet-stream";
|
||||
Uri uri = PersistentBlobProvider.getInstance().create(activity, communityBlob, mimeType, "backup.tar");
|
||||
intent.setType(mimeType);
|
||||
intent.putExtra(WelcomeActivity.COMMUNITY_EXTRA, uri);
|
||||
}
|
||||
activity.startActivity(intent);
|
||||
} else {
|
||||
activity.startActivity(new Intent(activity.getApplicationContext(), ConversationListActivity.class));
|
||||
@@ -170,11 +162,7 @@ public class AccountManager {
|
||||
activity.startActivity(intent);
|
||||
}
|
||||
|
||||
public void addAccountFromCommunity(Activity activity, byte[] communityBlob) {
|
||||
switchAccountAndStartActivity(activity, 0, null, communityBlob);
|
||||
}
|
||||
|
||||
public void addAccountFromSecondDevice(Activity activity, String backupQr) {
|
||||
switchAccountAndStartActivity(activity, 0, backupQr, null);
|
||||
switchAccountAndStartActivity(activity, 0, backupQr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,8 +51,13 @@ public class DcContactsLoader extends AsyncLoader<DcContactsLoader.Ret> {
|
||||
}
|
||||
if (query == null && addCreateGroupLinks) {
|
||||
additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_GROUP);
|
||||
final boolean broadcastsEnabled = !dcContext.isChatmail();
|
||||
if (broadcastsEnabled) additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST);
|
||||
|
||||
final boolean broadcastsEnabled = Prefs.isNewBroadcastAvailable(getContext());
|
||||
if (broadcastsEnabled) additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_BROADCAST);
|
||||
|
||||
if (!dcContext.isChatmail()) {
|
||||
additional_items = Util.appendInt(additional_items, DcContact.DC_CONTACT_ID_NEW_UNENCRYPTED_GROUP);
|
||||
}
|
||||
}
|
||||
int[] all_ids = new int[contact_ids.length + additional_items.length];
|
||||
System.arraycopy(additional_items, 0, all_ids, 0, additional_items.length);
|
||||
|
||||
@@ -23,23 +23,21 @@ import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcLot;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
import com.b44t.messenger.rpc.Rpc;
|
||||
import com.b44t.messenger.rpc.RpcException;
|
||||
|
||||
import org.json.JSONObject;
|
||||
import org.thoughtcrime.securesms.ApplicationContext;
|
||||
import org.thoughtcrime.securesms.BuildConfig;
|
||||
import org.thoughtcrime.securesms.LocalHelpActivity;
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.ShareActivity;
|
||||
import org.thoughtcrime.securesms.WebxdcActivity;
|
||||
import org.thoughtcrime.securesms.database.model.ThreadRecord;
|
||||
import org.thoughtcrime.securesms.notifications.NotificationCenter;
|
||||
import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
|
||||
import org.thoughtcrime.securesms.qr.QrActivity;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.IntentUtils;
|
||||
import org.thoughtcrime.securesms.util.FileUtils;
|
||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
@@ -65,8 +63,6 @@ public class DcHelper {
|
||||
public static final String CONFIG_DISPLAY_NAME = "displayname";
|
||||
public static final String CONFIG_SELF_STATUS = "selfstatus";
|
||||
public static final String CONFIG_SELF_AVATAR = "selfavatar";
|
||||
public static final String CONFIG_E2EE_ENABLED = "e2ee_enabled";
|
||||
public static final String CONFIG_FORCE_ENCRYPTION = "ui.force_encryption";
|
||||
public static final String CONFIG_SENTBOX_WATCH = "sentbox_watch";
|
||||
public static final String CONFIG_MVBOX_MOVE = "mvbox_move";
|
||||
public static final String CONFIG_ONLY_FETCH_MVBOX = "only_fetch_mvbox";
|
||||
@@ -80,6 +76,9 @@ public class DcHelper {
|
||||
public static final String CONFIG_WEBXDC_REALTIME_ENABLED = "webxdc_realtime_enabled";
|
||||
public static final String CONFIG_PRIVATE_TAG = "private_tag";
|
||||
|
||||
public static final String DEFAULT_VIDEOCHAT_URL_PREFIX = "https://meet.systemli.org/";
|
||||
public static final String DEFAULT_VIDEOCHAT_URL = DEFAULT_VIDEOCHAT_URL_PREFIX + "$ROOM#config.prejoinConfig.enabled=false&config.notifications=[]&config.toolbarButtons=[%22microphone%22,%22camera%22,%22hangup%22]";
|
||||
|
||||
public static DcContext getContext(@NonNull Context context) {
|
||||
return ApplicationContext.getInstance(context).dcContext;
|
||||
}
|
||||
@@ -156,14 +155,9 @@ public class DcHelper {
|
||||
dcContext.setStockTranslation(11, context.getString(R.string.audio));
|
||||
dcContext.setStockTranslation(12, context.getString(R.string.file));
|
||||
dcContext.setStockTranslation(23, context.getString(R.string.gif));
|
||||
dcContext.setStockTranslation(24, context.getString(R.string.encrypted_message));
|
||||
dcContext.setStockTranslation(29, context.getString(R.string.systemmsg_cannot_decrypt));
|
||||
dcContext.setStockTranslation(35, context.getString(R.string.contact_verified));
|
||||
dcContext.setStockTranslation(36, context.getString(R.string.contact_not_verified));
|
||||
dcContext.setStockTranslation(37, context.getString(R.string.contact_setup_changed));
|
||||
dcContext.setStockTranslation(40, context.getString(R.string.chat_archived_label));
|
||||
dcContext.setStockTranslation(42, context.getString(R.string.autocrypt_asm_subject));
|
||||
dcContext.setStockTranslation(43, context.getString(R.string.autocrypt_asm_general_body));
|
||||
dcContext.setStockTranslation(60, context.getString(R.string.login_error_cannot_login));
|
||||
dcContext.setStockTranslation(66, context.getString(R.string.location));
|
||||
dcContext.setStockTranslation(67, context.getString(R.string.sticker));
|
||||
@@ -196,7 +190,6 @@ public class DcHelper {
|
||||
dcContext.setStockTranslation(112, context.getString(R.string.error_x));
|
||||
dcContext.setStockTranslation(113, context.getString(R.string.not_supported_by_provider));
|
||||
dcContext.setStockTranslation(114, context.getString(R.string.messages));
|
||||
dcContext.setStockTranslation(115, context.getString(R.string.broadcast_list));
|
||||
dcContext.setStockTranslation(116, context.getString(R.string.part_of_total_used));
|
||||
dcContext.setStockTranslation(117, context.getString(R.string.secure_join_started));
|
||||
dcContext.setStockTranslation(118, context.getString(R.string.secure_join_replies));
|
||||
@@ -236,29 +229,24 @@ public class DcHelper {
|
||||
dcContext.setStockTranslation(155, context.getString(R.string.ephemeral_timer_days_by_other));
|
||||
dcContext.setStockTranslation(156, context.getString(R.string.ephemeral_timer_weeks_by_you));
|
||||
dcContext.setStockTranslation(157, context.getString(R.string.ephemeral_timer_weeks_by_other));
|
||||
dcContext.setStockTranslation(158, context.getString(R.string.ephemeral_timer_1_year_by_you));
|
||||
dcContext.setStockTranslation(159, context.getString(R.string.ephemeral_timer_1_year_by_other));
|
||||
|
||||
// HACK: svg does not handle entities correctly and shows `"` as the text `quot;`.
|
||||
// until that is fixed, we fix the most obvious errors (core uses encode_minimal, so this does not affect so many characters)
|
||||
// cmp. https://github.com/deltachat/deltachat-android/issues/2187
|
||||
dcContext.setStockTranslation(120, context.getString(R.string.qrshow_join_group_hint).replace("\"", ""));
|
||||
dcContext.setStockTranslation(121, context.getString(R.string.connectivity_not_connected));
|
||||
dcContext.setStockTranslation(122, context.getString(R.string.aeap_addr_changed));
|
||||
dcContext.setStockTranslation(123, context.getString(R.string.aeap_explanation));
|
||||
dcContext.setStockTranslation(162, context.getString(R.string.multidevice_qr_subtitle));
|
||||
dcContext.setStockTranslation(163, context.getString(R.string.multidevice_transfer_done_devicemsg));
|
||||
|
||||
// The next two strings should only be set if the UI actually shows more info when the user clicks on the
|
||||
// DC_INFO_PROTECTION_{EN|DIS}ABLED info message
|
||||
dcContext.setStockTranslation(170, context.getString(R.string.chat_protection_enabled_tap_to_learn_more));
|
||||
dcContext.setStockTranslation(171, context.getString(R.string.chat_protection_broken_tap_to_learn_more));
|
||||
|
||||
dcContext.setStockTranslation(172, context.getString(R.string.chat_new_group_hint));
|
||||
dcContext.setStockTranslation(173, context.getString(R.string.member_x_added));
|
||||
dcContext.setStockTranslation(174, context.getString(R.string.invalid_unencrypted_tap_to_learn_more));
|
||||
dcContext.setStockTranslation(176, context.getString(R.string.reaction_by_you));
|
||||
dcContext.setStockTranslation(177, context.getString(R.string.reaction_by_other));
|
||||
dcContext.setStockTranslation(190, context.getString(R.string.secure_join_wait));
|
||||
dcContext.setStockTranslation(191, context.getString(R.string.secure_join_wait_timeout));
|
||||
dcContext.setStockTranslation(193, context.getString(R.string.donate_device_msg));
|
||||
}
|
||||
|
||||
public static File getImexDir() {
|
||||
@@ -423,9 +411,12 @@ public class DcHelper {
|
||||
|
||||
}
|
||||
|
||||
public static boolean isWebrtcConfigOk(DcContext dcContext) {
|
||||
public static String getVideochatURL(DcContext dcContext) {
|
||||
String instance = dcContext.getConfig(DcHelper.CONFIG_WEBRTC_INSTANCE);
|
||||
return (instance != null && !instance.isEmpty());
|
||||
if (instance != null && !instance.isEmpty()) {
|
||||
return instance;
|
||||
}
|
||||
return DEFAULT_VIDEOCHAT_URL;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -481,20 +472,10 @@ public class DcHelper {
|
||||
}
|
||||
}
|
||||
|
||||
public static void showVerificationBrokenDialog(Context context, String name) {
|
||||
new AlertDialog.Builder(context)
|
||||
.setMessage(context.getString(R.string.chat_protection_broken_explanation, name))
|
||||
.setNeutralButton(R.string.learn_more, (d, w) -> openHelp(context, "#nocryptanymore"))
|
||||
.setNegativeButton(R.string.qrscan_title, (d, w) -> context.startActivity(new Intent(context, QrActivity.class)))
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setCancelable(true)
|
||||
.show();
|
||||
}
|
||||
|
||||
public static void showProtectionEnabledDialog(Context context) {
|
||||
new AlertDialog.Builder(context)
|
||||
.setMessage(context.getString(R.string.chat_protection_enabled_explanation))
|
||||
.setNeutralButton(R.string.learn_more, (d, w) -> openHelp(context, "#e2eeguarantee"))
|
||||
.setNeutralButton(R.string.learn_more, (d, w) -> openHelp(context, "#e2ee"))
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setCancelable(true)
|
||||
.show();
|
||||
@@ -510,31 +491,67 @@ public class DcHelper {
|
||||
.show();
|
||||
}
|
||||
|
||||
public static void openWebxdc(Context context, DcMsg dcMsg) {
|
||||
JSONObject info = dcMsg.getWebxdcInfo();
|
||||
if (JsonUtils.optBoolean(info, "community")) {
|
||||
String name = JsonUtils.optString(info, "name");
|
||||
new AlertDialog.Builder(context)
|
||||
.setMessage(context.getString(R.string.ask_join_community, name))
|
||||
.setPositiveButton(R.string.yes, (dialog, which) -> {
|
||||
String filename = "backup.tar";
|
||||
byte[] blob = dcMsg.getWebxdcBlob(filename);
|
||||
if (blob == null) {
|
||||
Toast.makeText(context, "invalid community file", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
AccountManager.getInstance().addAccountFromCommunity((Activity) context, blob);
|
||||
})
|
||||
.setNegativeButton(R.string.no, null)
|
||||
.show();
|
||||
} else {
|
||||
WebxdcActivity.openWebxdcActivity(context, dcMsg);
|
||||
}
|
||||
}
|
||||
|
||||
public static void openHelp(Context context, String section) {
|
||||
Intent intent = new Intent(context, LocalHelpActivity.class);
|
||||
if (section != null) { intent.putExtra(LocalHelpActivity.SECTION_EXTRA, section); }
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
/**
|
||||
* For the PGP-Contacts migration, things can go wrong.
|
||||
* The migration happens when the account is setup, at which point no events can be sent yet.
|
||||
* So, instead, if something goes wrong, it's returned by getLastError().
|
||||
* This function shows the error message to the user.
|
||||
* <p>
|
||||
* A few releases after the PGP-contacts migration (which happened in 2025-05),
|
||||
* we can remove this function again.
|
||||
*/
|
||||
public static void maybeShowMigrationError(Context context) {
|
||||
try {
|
||||
String lastError = DcHelper.getRpc(context).getMigrationError(DcHelper.getContext(context).getAccountId());
|
||||
|
||||
if (lastError != null && !lastError.isEmpty()) {
|
||||
Log.w(TAG, "Opening account failed, trying to share error: " + lastError);
|
||||
|
||||
String subject = "Delta Chat failed to update";
|
||||
String email = "delta@merlinux.eu";
|
||||
|
||||
new AlertDialog.Builder(context)
|
||||
.setMessage(context.getString(R.string.error_x, lastError))
|
||||
.setNeutralButton(R.string.global_menu_edit_copy_desktop, (d, which) -> {
|
||||
Util.writeTextToClipboard(context, lastError);
|
||||
})
|
||||
.setPositiveButton(R.string.menu_send, (d, which) -> {
|
||||
Intent sharingIntent = new Intent(
|
||||
Intent.ACTION_SENDTO, Uri.fromParts(
|
||||
"mailto", email, null
|
||||
)
|
||||
);
|
||||
sharingIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{email});
|
||||
sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
|
||||
sharingIntent.putExtra(Intent.EXTRA_TEXT, lastError);
|
||||
|
||||
if (sharingIntent.resolveActivity(context.getPackageManager()) == null) {
|
||||
Log.w(TAG, "No email client found to send crash report");
|
||||
sharingIntent = new Intent(Intent.ACTION_SEND);
|
||||
sharingIntent.setType("text/plain");
|
||||
sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
|
||||
sharingIntent.putExtra(Intent.EXTRA_TEXT, lastError);
|
||||
sharingIntent.putExtra(Intent.EXTRA_EMAIL, email);
|
||||
}
|
||||
|
||||
Intent chooser =
|
||||
Intent.createChooser(sharingIntent, "Send using...");
|
||||
chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
chooser.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||
|
||||
context.startActivity(chooser);
|
||||
})
|
||||
.setCancelable(false)
|
||||
.show();
|
||||
}
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
|
||||
private final LayoutInflater li;
|
||||
private final ItemClickListener clickListener;
|
||||
private final GlideRequests glideRequests;
|
||||
private final Set<String> selectedContacts = new HashSet<>(); // TODO: maybe better use contact-id here
|
||||
private final Set<Integer> selectedContacts = new HashSet<>();
|
||||
private final SparseIntArray actionModeSelection = new SparseIntArray();
|
||||
|
||||
@Override
|
||||
@@ -268,8 +268,10 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
|
||||
itemMultiSelect = false; // the item creates a new contact in the list that will be selected instead
|
||||
} else if (id == DcContact.DC_CONTACT_ID_NEW_GROUP) {
|
||||
name = context.getString(R.string.menu_new_group);
|
||||
} else if (id == DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST) {
|
||||
name = context.getString(R.string.new_broadcast_list);
|
||||
} else if (id == DcContact.DC_CONTACT_ID_NEW_UNENCRYPTED_GROUP) {
|
||||
name = context.getString(R.string.new_email);
|
||||
} else if (id == DcContact.DC_CONTACT_ID_NEW_BROADCAST) {
|
||||
name = context.getString(R.string.new_channel);
|
||||
} else if (id == DcContact.DC_CONTACT_ID_QR_INVITE) {
|
||||
name = context.getString(R.string.menu_new_contact);
|
||||
} else {
|
||||
@@ -292,7 +294,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
|
||||
enabled = !(dcContact.getId() == DcContact.DC_CONTACT_ID_SELF && itemMultiSelect);
|
||||
}
|
||||
viewHolder.bind(glideRequests, id, dcContact, name, addr, null, itemMultiSelect, enabled);
|
||||
viewHolder.setChecked(selectedContacts.contains(addr));
|
||||
viewHolder.setChecked(selectedContacts.contains(id));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -300,7 +302,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
|
||||
return VIEW_TYPE_CONTACT;
|
||||
}
|
||||
|
||||
public Set<String> getSelectedContacts() {
|
||||
public Set<Integer> getSelectedContacts() {
|
||||
return selectedContacts;
|
||||
}
|
||||
|
||||
|
||||