Привет, Хабр! Сегодня я хочу рассказать вам о проекте, над которым я и ещё несколько разработчиков трудимся уже полтора года. Этот проект называется MoreliaTalk. Что это же он из себя представляет? MoreliaTalk - это мессенджер с открытым исходным кодом, построенный на клиент-серверной архитектуре. Сервер и клиенты можно использовать как встраиваемое решение для быстрого развёртывания функционала современного чата в своём проекте, так и в личных целях. Сервер написан на языке Python, а клиенты используют разные технологии для охвата как можно большего количества платформ. Это если описывать кратко, не вдаваясь в детали. А детали будут дальше...

Как зародился проект?

Проект, появился в июне 2020 года. После прохождения интенсива от компании SkillBox "Мессенджер за 3 дня", группа энтузиастов решила двигаться дальше, и продолжила разработку мессенджера. Так и родился проект MoreliaTalk.

Стоит ещё добавить, что после интенсива наш уровень был чуть выше уровня новичка, поэтому мы двигались методом проб и ошибок, однако же мы сразу старались использовать современные технологии и документировать код. Сейчас наш уровень куда выше, однако мы всё равно открыты к советам и дельным предложениям.

Проект основан на той же кодовой базе, что и получившийся по окончанию интенсива, или же был переписан с нуля?

Мы пришли к выводу, что связь между клиентом и сервером в современном мессенджере должна происходить не через get-запросы, а через протокол webscoket. А также решили написать свой протокол, описывающий структуру данных в json-е. Посовещавшись, мы снесли код сервера подчистую, и заново написали его уже на fastapi и websockets, а также реализовали в нём свой протокол. В общем наш мессенджер является развитием идеи, а не прямым потомком мессенджера со SkillBox.

Какова цель проекта?

Цель проекта - это предоставление людям системы чатов, которая легко встраивается куда угодно, шифрует данные, не позволяя получить к ним доступ никому, кроме вас и ваших собеседников. И самое главное - код нашего проекта ВСЕГДА открыт, и мы всегда рады вкладу сторонних разработчиков.

Что реализовано на текущий момент?

На момент написания статьи, а это 21 февраля 2022 года, у нас реализованы:

{
  "type": "get_update",
  "data": {
    "time": 1594492370,
    "flow": [{
      "uuid": "1254",
      "time": 1594492370,
      "type": "chat",
      "title": "Name Chat",
      "info": "Info about this chat",
      "owner": "123456",
      "users": ["123456", "65478"],
      "message_start": 0,
      "message_end": 100
    }],
    "message": [{
      "uuid": "1",
      "client_id": 123,
      "text": "some text...",
      "from_user": "1234567",
      "time": 1594492370,
      "from_flow": "123655455",
      "file_picture": "jkfikdkdsd",
      "file_video": "sdfsdfsdf",
      "file_audio": "fgfsdfsdfsdf",
      "file_document": "fghsfghsfgh",
      "emoji": "sfdfsdfsdf",
      "edited_time": 1594492370,
      "edited_status": true
    }],
    "user": [{
      "uuid": "1234567",
      "login": "username1",
      "password": "lksdjflksjfsd",
      "username": "Vasya",
      "is_bot": true,
      "auth_id": "4646hjgjhg64",
      "token_ttl": 6000,
      "email": "querty@querty.com",
      "avatar": "fffdddddd",
      "bio": "My bio",
      "time_created": 2542445821452
    }],
    "meta": null
  },
  "errors": {
    "code": 200,
    "status": "OK",
    "time": 1594492370,
    "detail": "successfully"
  },
  "jsonapi": {
    "version": "1.0",
    "revision": "17"
  },
  "meta": null
}

Над чем работаем сейчас?

Сейчас у нас в разработке:

  • Протокол версии 2.0(см. ссылку)

  • Первый стабильный релиз сервера 1.0.0(см. roadmap)

  • Кроссплатформенный клиент, написанный на Dart и Flutter

По клиенту хотелось бы пройтись поподробнее. На данный момент у нас имеется клиент на Python и Qt( правда, тоже в стадии разработки))) ), однако мы отказались от него в пользу клиента на Flutter, т.к. это позволит покрыть нам намного больше платформ, имея при этом единую кодовую базу клиента. Это не значит, что мы забросили Qt клиент. Мы просто сместили фокус на более перспективную технологии, и будем пока развивать клиент именно на ней.

Клиент на Qt
Клиент на Qt

Каковы дальнейшие идеи по развитию проекта?

Все идеи по развитию проекта описаны в тикете протокола, но из них можно выделить идею так называемых workspace. Что же это такое? Представьте сервер Slack, но внутри обычного мессенджера, всю мощь ветвления и интеграции с гитхабом, а также сторонними сервисами, не выходя из привычного приложения. Больше никакого хаоса. Вы занимаетесь разработкой какого-либо продукта? - пожалуйста, хоть каждую секунду создавайте чаты, и у вас не будет визуального мусора на главном экране. Всё, что находится внутри workspace - это ваша суверенная территория, которая находится внутри вашего любимого мессенджера. Эта фишка должна будет стать одной из основных в версии сервера 2.0.0. Как только мы реализуем эту фишку, мы сами переберёмся в MoreliaTalk из Telegram и Slack, т.к. наш мессенджер заменит все наши потребности в них.

Маскот

В время разработки сам по себе возник маскот нашего проекта и команды, он же наш логотип, кобра Morelia

Morelia
Morelia

Итог

В общем надо подытожить, что же такое MoreliaTalk. Это мессенджер с открытым исходным кодом, шифрующий всё, что через него проходит, и по сему безопасный, большим потенциалом для развития, амбициозный проект, который стремится вперёд. Мы будем продолжать разработку, и будем переодически рассказывать он ней на Хабре. Не знаю, смог ли я рассказать и описать всё, что задумывал, всё же я не писатель, а программист, однако если есть вопросы, или необходимо дополнить статью чем-либо - милости просим в комменты, я отвечу, и если надо дополню. Спасибо, за то, что прочитали эту статью и до скорой встречи!

Ссылка на наш github
Ссылка на наш сайт

Комментарии (29)


  1. skymal4ik
    24.02.2022 14:28
    +1

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


    1. NekrodNIK Автор
      24.02.2022 14:55
      -2

      Пока по скриншотам показывать нечего, т.к. клиент ещё не реализован в полной мере. Пока наш мессенджер представляет собой только сервер, клиент на Flutter скоро будет написан, думаю ближе к лету закончим. За замечание спасибо, попробую что-нибудь добавить


      1. NekrodNIK Автор
        24.02.2022 15:36
        +2

        Всё добавил фотографий


  1. 13werwolf13
    24.02.2022 15:26
    +2

    ИМХО сейчас больше актуальны средства связи использующие не/нетолько интернет. учитывая постоянные блокировки и отключения связи во многих странах хотелось бы иметь месенджер который находит связь используя УСЛОВНО по bluetooth такой же месенджер у соседа который находит peer черес соседский yggdrasil который находит peer через радиоканал который.. ну и так до безконечности. проще говоря месенджер позволяющий иметь связь даже с полным отключением интернетов.


    1. NekrodNIK Автор
      24.02.2022 15:35

      Ну никто не исключает, что клиенты смогут в будущем общаться между собой без сервера напрямую, это вполне реализуемо. Но пока у нас централизированый мессенджер. Но вот ваш коммент на заметку возьму, спасибо!


      1. 13werwolf13
        24.02.2022 15:36
        +2

        Исключать сервер совсем необязательно. Тут скорее вопрос в том как с этим сервером связаться в случае очередного локдауна..


        1. NekrodNIK Автор
          24.02.2022 15:39
          +1

          Да, это больная тема, и над этим надо подумать...


          1. kam005
            25.02.2022 10:39

            Был такой старый проект psyc. Решали это уже, так и не порешали.


    1. ptech
      24.02.2022 15:51
      +1

      Для мобильников (Android) есть Briar: https://ru.wikipedia.org/wiki/Briar
      Без yggdrasil, правда, только Bluetooth, Wi-Fi, Tor.
      Ведётся разработка клиента для десктопа.


      1. 13werwolf13
        24.02.2022 15:53
        +1

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


      1. 13werwolf13
        25.02.2022 07:41

        всё же пришёл к выводу что без десктопного клиента оно мне слабо подходит. да и в наших краях штука малоизвестная так что общаться особо не с кем.
        с удивлением обнаружил что в ней нет возможности экспортировать профиль...


        1. ptech
          25.02.2022 16:51

          Штука широко известна в узких кругах.
          Так-то многие ничего не слышали о [matrix], например.


          Думаю, профиль не экспортируется by design - профиль прибит гвоздями к устройству. Меняешь устройство - снова подтверждай все контакты. Безопасность.


  1. Machirodont
    24.02.2022 15:48
    +4

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

    Надеюсь, вы понимаете, что, ходите по офигенно тонкому льду, если вы в РФ. По логике отчечественных силовых структур, вы разрабатываете орудие преступления для педофилов, террористов, иностранных агентов и прочих врагов народа. И если вы хоть чуть-чуть перестанете быть неуловимым Джо - к вам, как к разработчикам, придут и попросят логи, ключи шифрования, вот это все. И отговорки про оупен-сорс и что сервер может собрать кто угодно где угодно из исходников - помогать не будут.


    1. NekrodNIK Автор
      24.02.2022 15:58

      Основной сервер только для тестов и проверки работы клиентов. Пользователи должны сами развернуть сервер у себя и подключаться к нему. Сообщества людей могут сами развернуть сервер, и использовать его, и к ним мы отношения не имеем. Так что даже если к нам придут, в раскрытии данных тестового сервера мы не виновны, он на то и тестовый)))


      1. aleksandr_el
        24.02.2022 17:36
        +3

        Святая наивность


        1. NekrodNIK Автор
          24.02.2022 17:55

          Ну мы то тут при чём? Если кто-то хочет данных, которыми мы не владеем, то мы то тут при чём)))


          1. aleksandr_el
            24.02.2022 18:09
            +2

            А при чём тут разработчики оружия? Они же не виноваты, что его пользуют по назначению... Они всего-лишь хотели "подставьте_что_больше_нравится".

            И Да, я тоже двумя руками за право на анонимность и возможность этим правом пользоваться. И разнообразие инструментов - это тоже хорошо. Но, как выше замечено: отговорки.. помогать не будут. Ни ваше мнение, ни моё тут врятли изменит видение власть имеющих. А "натянуть" на эту историю можно что угодно, вплоть до умышленного пособничества (да ещё так нагло, на виду у всех) :-(


            1. Machirodont
              24.02.2022 18:27

              Ну да, я про это. "Тем самым умышленно создали условия, способствующие совершению преступления..." и прочая копипаста из приговоров.

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


  1. ptech
    24.02.2022 16:21
    +2

    Чем этот протокол отличается от протокола Matrix (основной клиент Element)?
    https://habr.com/ru/post/427649/


    1. NekrodNIK Автор
      24.02.2022 20:23
      -1

      Начнём с начала его создания. Тогда мы были совсем зелёные новички, и понятия не имели о matrix. По сему и начали пилить свой велосипед. Теперь же, мы видим в его использовании следующие преимущества. Во-первых, он легче для клиента, с ним проще работать, чем с matrix-ом. Во-вторых, мы можем добавить в него дополнительную функциональность. Такое уже с matrix-ом не провернуть, пришлось бы его самому допиливать, и тот же Element не понимал бы нашего matrix.

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

      По поводу расширения протокола. Фичи, выходящие за рамки matrix, при работе сервера через matrix мы не будем реализовывать, по сему полную функциональность вы получите лишь при работе с нашим протоколом, но если она вам не нужна, то наш сервер cможет предложить вам и matrix)))


  1. Chuvi
    24.02.2022 19:15

    И самое главное - код ВСЕГДА нашего проекта открыт

    Здесь говорится что этот проект - всегда ваш, и вы вправе делать с ним что захочется. Хоть платным сделаете. Про "будет всегда открыт" тут не говорится.


    1. NekrodNIK Автор
      24.02.2022 20:07

      Извините, опечатка, имелось в виду другое))) Код нашего проекта ВСЕГДА открыт, а не то, что там написано, поправлю


      1. NekrodNIK Автор
        24.02.2022 20:10

        А вообще проект лицензирован под LGPL и GPL, по сему он наш, однако использовать его код и его изменять может любой)))


  1. nks1ckk
    25.02.2022 04:52
    +1

    А ведь когда-то я был с ними на зарождение проекта, но ливнул, не хватало скиллов, а теперь времени нет.


    1. NekrodNIK Автор
      25.02.2022 04:53

      А напомни, кто ты. Просто тех, кто ливнул в начале было много)))


  1. nitro80
    26.02.2022 01:00

    А почему изобрели что-то новое, а не взяли за основу xmmp?


  1. deilux
    26.02.2022 20:49

    Не смог пройти мимо, слишком кликбейтный заголовок!

    С одной стороны - достойно, что люди пройдя курс "учимся программировать за 3 дня", не боятся заявить на Хабре что они решили сделать "безопасный опенсорсный мессенджер". И проявляют настойчивость, зная что в индустрии уже есть немалое количество и безопасных, и опенсорсных, и полнофункциональных мессенджеров. Мы с друзьями, когда учились, тоже набирались опыта именно повторяя уже существующие решения и переизобретая велосипеды. И шишек набиваешь, и тешишь себя что оно "своё, ламповоое, родное, смотрите, я смог". Блин, даже сайт с описаниями сделали, за лицензию заморочились, слак зарегистрировали, CONTRIBUTING.md сочинили. Вобщем, серьёзно подошли к вопросу, не поленились. Такой подход - в целом редкость.

    С другой - обидно, что люди, пройдя курс "учимся программировать за 3 дня" и по какой-то причине решив что об этом нужно обязательно написать на Хабре, сделали это не исходя из идеи "мы вот такие и сякие, учимся, набиваем шишки, кому тоже интересно - присоединяйтесь, будем учиться вместе и помогать друг другу в процессе, будет круто!", а исходя из каких-то самопиарных идей, если можно так назвать. Мы в своё время были скромнее и фокусировались именно на целях проекта, а не шелухе вокруг.

    Ради интереса почитал исходный код и описание "протокола".

    https://github.com/MoreliaTalk/morelia_server/blob/1b8ed0bb7ed300ca902dfe83aea99169eaab63e4/mod/db/dbhandler.py#L377 - сохраняем пароль в открытом виде в БД.

    https://github.com/MoreliaTalk/morelia_server/blob/13e2b01f95d925328307849200b3f9f7ecee27bd/mod/protocol/mtp/worker.py#L728 - и потом действительно его используем, этот пароль. Сохранённый в открытом виде.

    https://github.com/MoreliaTalk/morelia_server/blob/13e2b01f95d925328307849200b3f9f7ecee27bd/mod/protocol/mtp/worker.py#L409 - текст сообщений хранится тоже в открытом виде, вместо заявленного в описании шифрования.

    Аутентификация тоже сделана довольно интересно: довольно большое количество (больше одного) предположительных "аутентификационных токенов", типа uuid, auth_id, вроде бы ещё что-то проскакивало. Ожидается, что эти токены будут сессионными (временными), генерироваться на лету и т.д.. Однако они всё равно хранятся в общей таблице пользователей и проверяются именно при помощи БД: https://github.com/MoreliaTalk/morelia_server/blob/13e2b01f95d925328307849200b3f9f7ecee27bd/mod/protocol/mtp/worker.py#L204 . Ну и до кучи, этот токен походу генерируется всего один раз и затем никогда не изменяется. (Хотя в коде и есть намётки TTL'а для него, но я не смог понять до конца, как он используется и используется ли вообще)

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

    Ну вещи типа в передачи двоичных данных картинок\документов прямо в JSON'е, хранить это всё прямо в табличке с сообщениями, ограничение на всего одну картинку, всего один документ и всего одну emoji (это видимо reactions на сообщения?) - из-за которых оно будет не очень быстро и не очень надёжно работать из неэффективности протокола - это уже даже второстепенно на фоне абзаца выше.


    1. NekrodNIK Автор
      27.02.2022 10:25

      Здравствуйте, по-первому пункту - спасибо! По-второму пункту - мы и фокусируемся в основном на том, что нам нравится это делать и получать опыт. То, что статья получилась какой-то изишне пиарной и рекламной - мой косяк. Иногда я излишне преувеличиваю что-то, и пытаюсь пихать идеи туда, где им не следует быть. Мы вообще не планировали появляться на хабре до лета. Но как-то так вышло, что я написал эту статью... Вот так вышло... Бездумное, спонтанное действие... За которое винить сам проект не следует, вина всецело моя... В общем в следующий раз буду трижды обдумывать, прежде писать... И в следующий раз, смещу фокус в правильную сторону. Короче, спасибо за то, что правильно указали на косяки!

      По поводу шифрования... Забыл указать, что на данный момент его нет. Оно будет, это наша цель, но пока мы движемся к минимально рабочей связке клиент-сервер, без шифрования, кроме разве что TLS. Шифрование будет.

      По токенам - у нас есть uuid - это уникальный id пользователя, и auth_id - его токен авторизации. Пока auth_id постоянный, но затем мы его сделаем генерируемым для каждой сессии

      В целом в статье описано как должно быть, и куда стремимся, но не как есть. И причины этого я описал выше


      1. NekrodNIK Автор
        27.02.2022 10:39

        В общем, закрыв глаза на эту статью, ближе к лету попробуем снова. Статья будет более технической и более наполненной энтузиазмом получения опыта, а не идеей. До встречи @deilux!