Привет, Хабр! Сегодня я хочу рассказать вам о проекте, над которым я и ещё несколько разработчиков трудимся уже полтора года. Этот проект называется 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 клиент. Мы просто сместили фокус на более перспективную технологии, и будем пока развивать клиент именно на ней.
Каковы дальнейшие идеи по развитию проекта?
Все идеи по развитию проекта описаны в тикете протокола, но из них можно выделить идею так называемых workspace. Что же это такое? Представьте сервер Slack, но внутри обычного мессенджера, всю мощь ветвления и интеграции с гитхабом, а также сторонними сервисами, не выходя из привычного приложения. Больше никакого хаоса. Вы занимаетесь разработкой какого-либо продукта? - пожалуйста, хоть каждую секунду создавайте чаты, и у вас не будет визуального мусора на главном экране. Всё, что находится внутри workspace - это ваша суверенная территория, которая находится внутри вашего любимого мессенджера. Эта фишка должна будет стать одной из основных в версии сервера 2.0.0. Как только мы реализуем эту фишку, мы сами переберёмся в MoreliaTalk из Telegram и Slack, т.к. наш мессенджер заменит все наши потребности в них.
Маскот
В время разработки сам по себе возник маскот нашего проекта и команды, он же наш логотип, кобра Morelia
Итог
В общем надо подытожить, что же такое MoreliaTalk. Это мессенджер с открытым исходным кодом, шифрующий всё, что через него проходит, и по сему безопасный, большим потенциалом для развития, амбициозный проект, который стремится вперёд. Мы будем продолжать разработку, и будем переодически рассказывать он ней на Хабре. Не знаю, смог ли я рассказать и описать всё, что задумывал, всё же я не писатель, а программист, однако если есть вопросы, или необходимо дополнить статью чем-либо - милости просим в комменты, я отвечу, и если надо дополню. Спасибо, за то, что прочитали эту статью и до скорой встречи!
Комментарии (29)
13werwolf13
24.02.2022 15:26+2ИМХО сейчас больше актуальны средства связи использующие не/нетолько интернет. учитывая постоянные блокировки и отключения связи во многих странах хотелось бы иметь месенджер который находит связь используя УСЛОВНО по bluetooth такой же месенджер у соседа который находит peer черес соседский yggdrasil который находит peer через радиоканал который.. ну и так до безконечности. проще говоря месенджер позволяющий иметь связь даже с полным отключением интернетов.
NekrodNIK Автор
24.02.2022 15:35Ну никто не исключает, что клиенты смогут в будущем общаться между собой без сервера напрямую, это вполне реализуемо. Но пока у нас централизированый мессенджер. Но вот ваш коммент на заметку возьму, спасибо!
13werwolf13
24.02.2022 15:36+2Исключать сервер совсем необязательно. Тут скорее вопрос в том как с этим сервером связаться в случае очередного локдауна..
ptech
24.02.2022 15:51+1Для мобильников (Android) есть Briar: https://ru.wikipedia.org/wiki/Briar
Без yggdrasil, правда, только Bluetooth, Wi-Fi, Tor.
Ведётся разработка клиента для десктопа.13werwolf13
24.02.2022 15:53+1спасибо, пощупаю. хотя если быть откровенным хотелось бы увидеть решение которое поможет "оставаться онлайн" всей системе а не только месенджеру.
13werwolf13
25.02.2022 07:41всё же пришёл к выводу что без десктопного клиента оно мне слабо подходит. да и в наших краях штука малоизвестная так что общаться особо не с кем.
с удивлением обнаружил что в ней нет возможности экспортировать профиль...ptech
25.02.2022 16:51Штука широко известна в узких кругах.
Так-то многие ничего не слышали о [matrix], например.
Думаю, профиль не экспортируется by design - профиль прибит гвоздями к устройству. Меняешь устройство - снова подтверждай все контакты. Безопасность.
Machirodont
24.02.2022 15:48+4шифрует данные, не позволяя получить к ним доступ никому, кроме вас и ваших собеседников
Надеюсь, вы понимаете, что, ходите по офигенно тонкому льду, если вы в РФ. По логике отчечественных силовых структур, вы разрабатываете орудие преступления для педофилов, террористов, иностранных агентов и прочих врагов народа. И если вы хоть чуть-чуть перестанете быть неуловимым Джо - к вам, как к разработчикам, придут и попросят логи, ключи шифрования, вот это все. И отговорки про оупен-сорс и что сервер может собрать кто угодно где угодно из исходников - помогать не будут.
NekrodNIK Автор
24.02.2022 15:58Основной сервер только для тестов и проверки работы клиентов. Пользователи должны сами развернуть сервер у себя и подключаться к нему. Сообщества людей могут сами развернуть сервер, и использовать его, и к ним мы отношения не имеем. Так что даже если к нам придут, в раскрытии данных тестового сервера мы не виновны, он на то и тестовый)))
aleksandr_el
24.02.2022 17:36+3Святая наивность
NekrodNIK Автор
24.02.2022 17:55Ну мы то тут при чём? Если кто-то хочет данных, которыми мы не владеем, то мы то тут при чём)))
aleksandr_el
24.02.2022 18:09+2А при чём тут разработчики оружия? Они же не виноваты, что его пользуют по назначению... Они всего-лишь хотели "подставьте_что_больше_нравится".
И Да, я тоже двумя руками за право на анонимность и возможность этим правом пользоваться. И разнообразие инструментов - это тоже хорошо. Но, как выше замечено: отговорки.. помогать не будут. Ни ваше мнение, ни моё тут врятли изменит видение власть имеющих. А "натянуть" на эту историю можно что угодно, вплоть до умышленного пособничества (да ещё так нагло, на виду у всех) :-(
Machirodont
24.02.2022 18:27Ну да, я про это. "Тем самым умышленно создали условия, способствующие совершению преступления..." и прочая копипаста из приговоров.
В общем, я это к тому, что если это имеет перспективы перерасти во что-то большее, чем учебный проект для портфолио, лучше этим заниматься с аккаунтов, которые сложно сопоставить с реальной личностью.
ptech
24.02.2022 16:21+2Чем этот протокол отличается от протокола Matrix (основной клиент Element)?
https://habr.com/ru/post/427649/NekrodNIK Автор
24.02.2022 20:23-1Начнём с начала его создания. Тогда мы были совсем зелёные новички, и понятия не имели о matrix. По сему и начали пилить свой велосипед. Теперь же, мы видим в его использовании следующие преимущества. Во-первых, он легче для клиента, с ним проще работать, чем с matrix-ом. Во-вторых, мы можем добавить в него дополнительную функциональность. Такое уже с matrix-ом не провернуть, пришлось бы его самому допиливать, и тот же Element не понимал бы нашего matrix.
Мы уважаем matrix, и даже добавим его поддержку в сервер(заглушки под это дело уже есть). Однако наш протокол заточен именно под мессенджер, под систему чатов, и не обвешан всем подряд, как matrix. Да, от этого наш протокол менее универсален, однако ему это не требуется, он нужен только для обмена данными между клиентом и сервером.
По поводу расширения протокола. Фичи, выходящие за рамки matrix, при работе сервера через matrix мы не будем реализовывать, по сему полную функциональность вы получите лишь при работе с нашим протоколом, но если она вам не нужна, то наш сервер cможет предложить вам и matrix)))
Chuvi
24.02.2022 19:15И самое главное - код ВСЕГДА нашего проекта открыт
Здесь говорится что этот проект - всегда ваш, и вы вправе делать с ним что захочется. Хоть платным сделаете. Про "будет всегда открыт" тут не говорится.
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 на сообщения?) - из-за которых оно будет не очень быстро и не очень надёжно работать из неэффективности протокола - это уже даже второстепенно на фоне абзаца выше.
NekrodNIK Автор
27.02.2022 10:25Здравствуйте, по-первому пункту - спасибо! По-второму пункту - мы и фокусируемся в основном на том, что нам нравится это делать и получать опыт. То, что статья получилась какой-то изишне пиарной и рекламной - мой косяк. Иногда я излишне преувеличиваю что-то, и пытаюсь пихать идеи туда, где им не следует быть. Мы вообще не планировали появляться на хабре до лета. Но как-то так вышло, что я написал эту статью... Вот так вышло... Бездумное, спонтанное действие... За которое винить сам проект не следует, вина всецело моя... В общем в следующий раз буду трижды обдумывать, прежде писать... И в следующий раз, смещу фокус в правильную сторону. Короче, спасибо за то, что правильно указали на косяки!
По поводу шифрования... Забыл указать, что на данный момент его нет. Оно будет, это наша цель, но пока мы движемся к минимально рабочей связке клиент-сервер, без шифрования, кроме разве что TLS. Шифрование будет.
По токенам - у нас есть uuid - это уникальный id пользователя, и auth_id - его токен авторизации. Пока auth_id постоянный, но затем мы его сделаем генерируемым для каждой сессии
В целом в статье описано как должно быть, и куда стремимся, но не как есть. И причины этого я описал выше
skymal4ik
Без скриншотов и описаний фич или особенностей (а они должны быть, чтобы пользователь или компания захотели поставить ещё один мессенджер в дополнение к десяткам существующих) статья не будет полной.
NekrodNIK Автор
Пока по скриншотам показывать нечего, т.к. клиент ещё не реализован в полной мере. Пока наш мессенджер представляет собой только сервер, клиент на Flutter скоро будет написан, думаю ближе к лету закончим. За замечание спасибо, попробую что-нибудь добавить
NekrodNIK Автор
Всё добавил фотографий