Skip to content
This repository was archived by the owner on Dec 19, 2024. It is now read-only.
This repository was archived by the owner on Dec 19, 2024. It is now read-only.

Расширение протокола до версии 2.0 #33

@stepanskryabin

Description

@stepanskryabin

черновик предстоящих изменений в протокол.

1. Права пользователей

1.1 Основные типы пользователей

  • модератор | moderator
  • владелец | owner
  • читающий | reader
  • пищущий | writer

1.2 Права

  • чтение | read
  • редактирование | edit
  • удаление | delete

2. Добавление новых сущностей

2.1 Новый тип flow - workspace

К основным трём потокам добавляется третий поток с наименованием Workspace который предназначен для объединения Chat, Group, Channel в единое целевое пространство.

Для этого в flow добавляются следующие поля:

Ключ Тип Обязательный (запрос / ответ) Описание
sub_flow list[str] No / No Список uuid потоков flow входящих в Workspace

2.2 Добавление дополнительных полей в message

Для улучшения удобства обсуждения добавляется поле threads, а так же поле content которое служит для облегчения обработки сообщений и добавления дополнительных данных о контенте.

Поле threads

Ключ Тип Обязательный (запрос / ответ) Описание
message_uuid str No / No uuid исходного message от которого пошел thread

Поле content

Ключ Тип Обязательный (запрос / ответ) Описание
body str Yes / Yes Тело контента (текст) или имя файла (для другого типа контента)
formatted_body str No / No Тело контента (только для текста) с включенными тэгами оформления
info info Yes / Yes Информация о контенте
thumbnail_info thumbnail_info No / No Превью (для изображения или видео)
msgtype str Yes / Yes Тип контента (text, image, video, documents, audio)
url str No / No Ссылка на скачивание

Поле info

Ключ Тип Обязательный (запрос / ответ) Описание
mimetype str Yes / Yes Mime-тип контента
size int No / No размер в байтах
width int No / No Ширина (для видео и изображения) в пикселах, для остальных типов данных значение null
height int No / No Высота (для видео и изображения) в пикселах, для остальных типов данных значение null
duration int No / No Длительность (для видео и аудио) в секундах, для остальных типов данных значение null

Поле thumbnail_info

Ключ Тип Обязательный (запрос / ответ) Описание
thumbnail_url str No / No Ссылка на скачивание
mimetype str No / No Mime-тип контента
size int No / No Размер, в байтах
width int No / No Ширина (для видео и изображения) в пикселах, для остальных типов данных значение null
height int No / No Высота (для видео и изображения) в пикселах, для остальных типов данных значение null

2.3 Добавление дополнительных полей в user

Ключ Тип Обязательный (запрос / ответ) Описание
flow_invite list[int] No / No Потоки в которых пользователь был приглашен
flow_join list[int] No / No Потоки к которым пользователь присоединился
flow_leave list[int] No / No Потоки из которых пользователь вышел самостоятельно
flow_ban list[int] No / No Потоки из которых пользователь был удален администратором
flow_knock list[int] No / No Потоки в которые пользователь запросил доступ

пример:

{
"content": {
    "body": "image.jpeg",
    "info": {
        "mimetype": "image/jpeg",
        "size": "1024000",
        "widht": 1980,
        "height": 1280,
        "duration": null
        },
    "thumbnail_info": {
        "thumbnail_url": "/server/files/asdgalkdfg87adft7a6df",
        "mimetype": "image/jpeg",
        "size": 1024,
        "width": 320,
        "height": 480
        },
   "msgtype": "image",
   "url": "/server/files/xzdf89gud98fffg45g45h45h45h"
   }
}

2.3. Удаление лишних полей из message:

  • file_picture
  • file_video
  • file_audio
  • file_document
  • emoji

2.4. Изменение наименования полей в user:

Так как хранение пароля будет осуществлятся клиентом самостоятельно, сервер будет хранить только хэш пароля (клиент передаёт не голый пароль а его хэш) полученного от клиента. Для этого имя поля password заменяется на hash_password.

2.5 Новый объект server после data

Поле предназначено для передачи общей информации о сервере.

Ключ Тип Обязательный (запрос / ответ) Описание
name str Yes / Yes Имя сервера
crypto_protocol str No / No наименование протокола поддерживаемого сервером
protocol_min_version str No/No Минимальная версия протокола которую поддерживает сервер
protocol_max_version str No/No Максимальная версия протокола которую поддерживает сервер

2.6. Новый объект ciphers после server

Поле предназначено для передачи информации о используемых протоколах шифрования.

Ключ Тип Обязательный (запрос / ответ) Описание
open_key str No / Yes открытый ключ шифрования
open_key_time_stamp int No / Yes время формирования ключа подписи / шифрования
crypto_protocol str No / Yes тип протокола шифрования
session_key str No / Yes сессионный (симметричный) ключ шифрования
session_key_time_stamp int No / Yes время формирования ключа шифрования

2.7. Новый объект event после ciphers

Event служит для передачи от клиента серверу дополнительного запроса на получение обновлений данных (сообщений, потоков и пр.). Такой запрос сервер обрабатывает во время сессии websocket-соединения.

Ключ Тип Обязательный (запрос / ответ) Описание
flow list[str] No / No Список с uuid потоков, по котором сервер должен отправить обновление
user list[str] No / No Список с uuid пользователей, по которым сервер должен отправить обновление
time int No / No Время с которого сервер должен отправить обновление
start int No / No Начальная позиция при запросе большой партии
end int No / No Конечная позиция при запросе большой партии

3. Новые методы

3.1. метод handshake

  • клиент направляет запрос handshake_hello cо своим открытым ключем шифрования и временем его жизни.
  • сервер отвечает handshake_hello со своим открытым ключем шифрования, временем его жизни, а также симметричным (сессионным) ключем шифрования зашифрованным открытым ключем клиента и временем жизни сессионного ключа.
  • после чего клиент отвечает серверу handshake_end и отправляет свой симметричный (сессионный) ключ шифрования зашифрованный сессионным ключем сервера, а также время жизни сессионного ключа.
  • в ответ сервер отвечает пустым handshake_end со статусом 200.

запрос клиента:

{
"type": "handshake_hello",
"ciphers": {
    "open_key": "DKMDKDJDJDJDJ",
    "open_key_time_stamp": 34534543645645645,
    "crypto_protocol": "PKSC#7",
    "session_key": null,
    "session_key_time_stamp": null
             },
"jsonapi": {
   "version": "2.0",
   "revision": "1"
              },
"meta": null
}

ответ сервера:

{
"type": "handshake_hello",
"ciphers": {
    "open_key": "PLPLPLPLPLPLPLLLPLPP",
    "open_key_time_stamp": 34534543645645645,
    "crypto_protocol": "PKSC#7",
    "session_key": "iof87fx78cfb87cxgb78xc78cxv",
    "session_key_time_stamp": 3534543654645
            },
"errors": {
    "code": 200,
    "status": "Ok",
    "time": 235235345345,
    "detail": "successfully"
            },
"jsonapi": {
    "version": "2.0",
    "revision": "1"
     },
"meta": null
}

ответ клиента:

{
"type": "handshake_end",
"ciphers": {
    "open_key": null,
    "open_key_time_stamp": null ,
    "crypto_protocol": "PKSC#7",
    "session_key": "zdf98gzd98fbyz80fgb087xcgb",
    "session_key_time_stamp": 8943894389459874
               },
"jsonapi": {
   "version": "2.0",
   "revision": "1"
              },
"meta": null
}

ответ сервера:

{
"type": "handshake_end",
"errors": {
   "code": 200,
   "status": "Ok",
   "time": 235235345345,
   "detail": "successfully"
          },
"jsonapi": {
   "version": "2.0",
   "revision": "1"
     },
"meta": null
}

3.2 метод - update_session_key

  • клиент направляет на сервер запрос на обновление сессионных ключей, запрос подписан ключем сервера и зашифрован старым сессионным ключем.
  • сервер в ответ отправляет клиенту новый сессионный ключ подписаный и зашифрованный открытым ключем клиента, в ответе статус "Accepted" и код "202"

запрос клиента:

{
"type": "update_session_key",
"data": {
    "user": [{
        "uuid": "334534534",
        "aith_id": 87934897789
             }]
        },
"jsonapi": {
    "version": "2.0",
    "revision": "1"
           },
"meta": null
}

Ответ сервера:

{
"type": "update_session_key",
"data": {
    "user": [{
        "uuid": "334534534"
             }],
        "meta": null
         },
"ciphers": {
    "session_key": "98df89897f7890fg890f",
    "session_key_time_stamp": 984389748974897
             },
"errors": {
    "code": 202,
    "status": "Accepted",
    "time": 34894798345,
    "detail": "Information is accepted."
         },
"jsonapi": {
    "version": "2.0",
    "revision": "1"
              },
"meta": null
}

3.3 метод update_open_key

  • клиент направляет на сервер запрос на обновление открытого ключа, запрос содержит новый открытый ключ шифрования, подписан ключем сервера и зашифрован сессионным ключем.
  • сервер в ответ отправляет клиенту новый сессионный ключ подписаный и зашифрованный открытым ключем клиента, в ответе статус "Accepted" и код 202

запрос клиента:

{
"type": "update_open_key",
"data": {
    "user": [{
        "uuid": "334534534",
             }]
        },
"ciphers": {
    "open_key": "xcv90xv9088cvx89cxv89xvc",
    "open_key_time_stamp": "4390849804590845",
    "crypto_protocol": "PKSC#7"
           },
"jsonapi": {
    "version": "2.0",
    "revision": "1"
             },
"meta": null
}

Ответ сервера:

{
"type": "update_session_key",
"data": {
    "user": [{
        "uuid": "334534534",
               }]
           },
"ciphers": {
    "session_key": "98df89897f7890fg890f",
    "session_key_time_stamp": 984389748974897
               },
"errors": {
    "code": 202,
    "status": "Accepted",
    "time": 34894798345,
    "detail": "Information is accepted."
         },
"jsonapi": {
    "version": "2.0",
    "revision": "1"
        },
"meta": null
}

3.4 Разделение метода get_update на несколько методов

get_update_flow

Метод get_update_flow позволяет получить от сервера доступную информацию о flow, от времени time по натстоящее время.

Запрос клиента:

{
"type": "get_update_flow",
"data": {
    "time": 1594492370,
    "flow": [{
        "uuid": "34543646"},
         {...}],
    "user": [{
        "uuid": "1234567",
        "auth_id": "dks7sd9f6g4fg67vb78g65"
          }]
        },
"jsonapi": {
    "version": "1.0",
    "revision": "17"
            },
"meta": null
}

get_update_message

Метод get_update_message позволяет получить от сервера доступную информацию о сообщениях которые принадлежать определенному flow, от времени time по настоящее время.

Запрос клиента:

{
"type": "get_update_message",
"data": {
    "time": 1594492370,
    "flow": [{
        "uuid": "34543646"},
         {...}],
    "user": [{
        "uuid": "1234567",
        "auth_id": "dks7sd9f6g4fg67vb78g65"
          }]
        },
"jsonapi": {
    "version": "1.0",
    "revision": "17"
             },
"meta": null
}

get_update_user

Метод get_update_user позволяет получить от сервера доступную информацию о пользователях, от времени time по настоящее время.

Запрос клиента:

{
"type": "get_update_user",
"data": {
    "time": 1594492370,
    "user": [{
        "uuid": "1234567",
        "auth_id": "dks7sd9f6g4fg67vb78g65"
          }]
        },
"jsonapi": {
    "version": "1.0",
    "revision": "17"
             },
"meta": null
}

3.5 Метод invite_user_to_flow

Метод предназначен для приглашения пользователя вступить в поток.

  • Клиент отправляет серверу запрос invite_client_to_flow с указанием ID пользователей
  • Сервер отвечает invite_user_to_flow со статусом 200

Запрос клиента:

{
"type": "invite_user_to_flow",
"data": {
    "time": 1594492370,
    "flow": [{
        "uuid": "34543646",
        "user_uuid": []
               }],
    "user": [{
        "uuid": "1234567",
        "auth_id": "dks7sd9f6g4fg67vb78g65"
          }]
        },
"jsonapi": {
    "version": "1.0",
    "revision": "17"
             },
"meta": null
}
{
"type": "get_update_message",
"data": {
    "time": 1594492370,
    "flow": [{
        "uuid": "34543646"},
         {...}],
    "user": [{
        "uuid": "1234567",
        "auth_id": "dks7sd9f6g4fg67vb78g65"
          }]
        },
"jsonapi": {
    "version": "1.0",
    "revision": "17"
             },
"meta": null
}

4. Прочие изменения (не)протокола

4.1 Хранение / шифрование файлов сервером

  • все файлы хранятся на сервере в директории /static/files
  • у всех файлов вместо имени хэш, расширения нет
  • информация о файле хранится в БД
  • ссылка на файл хранится в БД
  • каждый файл зашифрован

4.2 Шифрование flow

Пользователю будет доступно настройка шифрования для чатов, групп, каналов, сообществ

Шифрование chat

В параметрах чата будут хранится оба открытых ключа шифрования пользователей время их выдачи, а так же сессионные ключи и дата их выдачи.

  • вложенное поле ciphers
    • вложенное поле user1
      • вложенное поле open_key
      • вложенное поле open_key_time_stamp
      • вложенное поле crypto_protocol
      • вложенное поле session_key
      • вложенное поле session_key_time_stamp
    • вложенное поле user2
      • вложенное поле open_key
      • вложенное поле open_key_time_stamp
      • вложенное поле crypto_protocol
      • вложенное поле session_key
      • вложенное поле session_key_time_stamp

Шифрование group

  • как?

Шифрование channel

  • как?

Шифрование workspace

  • необходимо?

Добавить логаут и логаут на всех устроиствах

?

Добавить защиту от регистрации множества аккаунтов

Добавить лимит на количество зарегистрированных аккаунтов в день (не более 5) для чего использовать подтверждение по адресу эл.почты.

Metadata

Metadata

Labels

documentationImprovements or additions to documentationwontfixThis will not be worked on

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions