Доставка и восстановление
Каждый статус, который rChat показывает под сообщением, должен быть правдой: приложение никогда не говорит, что сообщение дошло, если другой телефон этого не подтвердил. Надписи интерфейса приводятся по-английски, как в приложении.
Статус сообщения
Заголовок раздела «Статус сообщения»| Статус | Значок | Что означает |
|---|---|---|
| Sending | часы | Сообщение сохранено на вашем телефоне и в пути. Ретранслятор ещё не подтвердил его. |
| Sent | галочка | Ретранслятор его принял: передал подключению собеседника или держит до следующего подключения его телефона. Это не доказательство доставки. |
| Delivered | галочка в круге | Телефон собеседника сохранил его. |
| Read | закрашенная галочка в круге | Собеседник открыл его. |
| Not delivered | восклицательный знак | Телефон собеседника сообщил, что не смог прочитать это сообщение. |
| Not confirmed | часы | Подтверждение ретранслятора не пришло вовремя. Сообщение могло дойти, и последующие Delivered или Read всё равно обновят статус. Нажмите на него, чтобы отправить снова; оно может прийти дважды. |
| Failed to send | восклицательный знак | rChat сдался до того, как ретранслятор принял сообщение, например потому что контакт заблокирован или его ключи были отвергнуты. |
Delivered и Read приходят из уведомлений, зашифрованных сквозным шифрованием, которые отправляет телефон собеседника. Ретранслятор не может их прочитать или подделать. Они приходят чуть позже, небольшими пакетами, поэтому сообщение может ненадолго показать Sent, прежде чем показать Delivered. Delivered означает, что сообщение сохранено на его телефоне, а не просто получено: если его телефон упал до сохранения, вы увидите Not delivered, а не ложное Delivered.
Сообщение со статусом Delivered или Read никогда не возвращается к более раннему статусу.
Resend и Resent
Заголовок раздела «Resend и Resent»Когда телефон собеседника не смог прочитать некоторые ваши сообщения, rChat сообщает об этом в разговоре.
- Resent. Если rChat мог безопасно отправить сообщения повторно сам, он это сделал, и под каждым стоит неприметная пометка Resent. Строка в разговоре говорит, например: «Sam’s phone couldn’t read 1 message, so rChat sent it again.»
- Resend. Иначе сообщения показывают Not delivered, и строка говорит, например: «2 messages couldn’t be read on Sam’s phone.» Нажмите Resend, чтобы отправить их снова. Resend предлагается только для контакта, ключи которого не менялись, и пока вы не нажмёте, ничего не отправляется.
Повторное сообщение уходит с тем же идентификатором, что и оригинал, поэтому если первая копия всё-таки дошла, телефон собеседника покажет её только один раз.
Собеседник видит у себя соответствующую строку: «{N} messages from {name} couldn’t be decrypted on this phone. {name} has been told, so they can resend them.»
Перезапуски приложения
Заголовок раздела «Перезапуски приложения»rChat сохраняет состояние шифрования каждого разговора на телефоне, запечатанное ключом, которым может пользоваться только этот телефон. Поэтому:
- Перезапуск rChat, сбой или закрытие приложения системой iOS в фоне не теряют ни одного сообщения, принятого ретранслятором, если собственное хранилище телефона уцелело, кроме сообщений, которые ретранслятор передавал телефону именно в этот момент (см. Ограничения). Уже полученные сообщения остаются, а сообщения, ещё ждущие на ретрансляторе, можно прочитать, когда вы вернётесь.
- Сообщение, которое ещё не покинуло ваш телефон, отправляется, когда приложение снова работает. Это первая отправка, а не повторная, поэтому пометки Resent нет.
Сохранённое состояние исключено из резервных копий устройства и не открывается на другом телефоне, поэтому восстановленный или новый телефон начинает без него и проходит восстановление, описанное ниже.
Когда собеседник переустанавливает приложение или меняет телефон
Заголовок раздела «Когда собеседник переустанавливает приложение или меняет телефон»Если собеседник переустанавливает rChat или переходит на новый телефон, его телефон теряет состояние шифрования вашего разговора. Сообщения, отправленные вами при старом состоянии, там больше не читаются. Так задумано: без этого состояния их ничто не расшифрует.
Когда приложение собеседника снова работает, два телефона автоматически устанавливают новый защищённый сеанс. Внутри этого нового сеанса его телефон сообщает вашему, какие сообщения он не смог прочитать. Дальше:
- Автоматическая повторная отправка. Ваш телефон сам отправляет эти сообщения снова, и они показывают Resent, только если это уведомление подписано ключом устройства собеседника — ключом в защищённом оборудовании его телефона, который вы закрепили из его кода (сканированием лично или вставкой, которой вы его впервые добавили). Также требуется, чтобы с момента отправки сообщений его ключи никак не менялись. Переустановка на том же телефоне сохраняет ключ устройства, поэтому это обычный случай.
- Повторная отправка по нажатию. Если собеседник перешёл на новый телефон, у него новый ключ устройства, который вы не закрепляли. Тогда ваши сообщения показывают Not delivered, и вы нажимаете Resend. Так продолжается, пока вы снова не отсканируете его код лично; это закрепит его новый ключ устройства.
- После ротации ключей ничего не отправляется повторно автоматически. Вы видите, сколько сообщений могли не дойти, и нажимаете Resend, если доверяете изменению.
- Если ключи не совпадают (контакт показывает Keys don’t match), ему ничего нельзя отправить, пока вы снова не отсканируете его код.
Ретранслятор не может ничего из этого подделать. Уведомление о том, что телефон потерял состояние, существует только внутри сеанса, созданного с закреплёнными ключами собеседника, а автоматический путь ещё и требует подписи его ключа устройства. Тот, кто украл копию ключей учётной записи собеседника, но не его телефон, не может заставить ваш телефон что-либо отправить повторно автоматически.
Если телефон собеседника начал заново, но rChat не может ничего отправить повторно автоматически, а на некоторые ваши недавние сообщения нет уведомлений, вы можете увидеть «{name}‘s phone started a new secure session with you. {N} messages may not have reached them.» с кнопкой Resend. Эти сообщения сохраняют свой статус, потому что могли дойти.
Ограничения
Заголовок раздела «Ограничения»- 72 часа. Автоматически отправляются повторно только сообщения, отправленные за последние 72 часа и ни разу не доставленные и не прочитанные. Более старые показывают Not delivered с кнопкой Resend.
- 50 в сутки. rChat автоматически отправляет повторно не более 50 сообщений одному собеседнику за любые 24 часа. Остальные показывают Not delivered с кнопкой Resend.
- Один раз. Сообщение автоматически отправляется повторно не более одного раза.
- Очередь ретранслятора. Сообщения для собеседника не в сети ретранслятор хранит до 72 часов при настройке по умолчанию, затем удаляет. Если ретранслятор отклоняет сообщение, потому что очередь собеседника полна, оно никогда не показывает Sent.
- Перезапуск ретранслятора. Ретранслятор держит ожидающие сообщения в памяти, поэтому его перезапуск теряет их, если оператор не включил зашифрованное сохранение. Вы продолжаете видеть Sent.
- Телефон убит во время получения. Если телефон собеседника убит, пока ретранслятор передаёт ему ожидавшие сообщения, эти сообщения могут потеряться. Вы продолжаете видеть Sent, и это правда: ретранслятор их принял.
На чём основаны эти гарантии, см. в модели безопасности.