MOffice

Политика использования стороннего кода и данных (MOffice)

Статус: действует с 2026-10-03 (уточнение владельца: «всё должно быть под нашей лицензией»). Применяется ко всему коду, данным, шрифтам, иконкам, моделям, тестовым корпусам и документации, которые попадают в продукт, установщик, сервисы или репозиторий. Инструментальная проверка — deny.toml (cargo-deny) и scripts/third_party.py (реестр THIRD_PARTY.md, файл NOTICE, SBOM sbom.cdx.json).

1. Цель и главный принцип

Продукт целиком распространяется под собственной коммерческой лицензией MOffice (EULA). Ни один сторонний компонент не должен навязывать условия нашему коду: ни раскрытия исходников, ни копилефта, ни ограничений на продажу. Чужого кода «вообще без лицензии» в нужных объёмах не существует (без лицензии = нельзя использовать вовсе), поэтому практическая цель формулируется так:

  1. Приоритет 0 — без обязательств: Public Domain, CC0-1.0, Unlicense, 0BSD, WTFPL. Можно брать, менять, встраивать, не упоминать. (Пример: SQLite, mypaint-brushes, отдельные TeX-шаблоны переносов (например, казахский), GovDocs1. Русские TeX-шаблоны — LPPL-1.2+ (класс 1 с условием переименования изменённых файлов), чешские — GPL (запрещено).)
  2. Приоритет 1 — только упоминание авторов: MIT, BSD-2/3-Clause, ISC, Zlib, Apache-2.0, BSL-1.0, Unicode, PSF, OFL-1.1 (шрифты), CC-BY-4.0 (данные/иконки). Продукт остаётся полностью под нашей лицензией; единственное обязательство — сохранить текст уведомления об авторстве в окне «О программе → Лицензии открытого ПО» и в файле NOTICE (так делают Microsoft Office, Apple, Adobe). Код можно менять и портировать на Rust без публикации правок. Это основной класс для повторного использования.
  3. Приоритет 2 — НЕ используем (решение владельца 2026-10-04: «полностью свой код»). Ранее: условные, только по отдельному решению владельца: MPL-2.0 (правки в их файлах надо публиковать), LGPL-2.1/3 (только динамическая линковка, пользователь должен иметь возможность заменить библиотеку), EPL-2.0 (отдельный модуль). Используем, только если нет замены из приоритетов 0–1 и выгода велика. Каждый случай — отдельная запись в реестре с подписью владельца. Самый важный случай — Qt 6: либо LGPL-условия (динамическая линковка, без правок Qt), либо покупка коммерческой лицензии Qt (тогда никаких условий) — решение владельца в фазе 0.
  4. Запрещены всегда: GPL-2/3, AGPL-3, SSPL, BUSL, Elastic, FSL, Commons Clause, CC-BY-SA/NC для кода и встраиваемых данных, «source-available», лицензии с водяным знаком или обязательной надписью в интерфейсе (bpmn.io, tldraw). Такие проекты нельзя ни подключать, ни копировать из них код.

2. Классы лицензий (сводная таблица)

Класс Лицензии (SPDX) Обязательства Правило
0 — без обязательств CC0-1.0, Unlicense, 0BSD, WTFPL, Public Domain нет брать свободно
1 — атрибуция MIT, BSD-2-Clause, BSD-3-Clause, ISC, Zlib, Apache-2.0 (+LLVM exception), BSL-1.0, Unicode-3.0/DFS, PSF-2.0, OpenSSL, CDLA-Permissive-2.0, OFL-1.1, CC-BY-4.0 сохранить уведомление об авторстве; Apache — также файл NOTICE; OFL — не продавать шрифт отдельно, при изменении переименовать; CC-BY — указать автора основной класс; статическая линковка и порт кода разрешены
2 — условные (решение владельца) MPL-2.0, LGPL-2.1, LGPL-3.0, EPL-2.0 MPL: публиковать правки их файлов, не смешивать в одном файле с нашим кодом; LGPL: только динамическая линковка + возможность замены библиотеки + публикация правок библиотеки; EPL: отдельный модуль только при отсутствии замены; запись в реестре; юридическая проверка
3 — запрещены GPL-2.0, GPL-3.0, AGPL-3.0, SSPL-1.0, BUSL-1.1, Elastic-2.0, FSL-1.1, Commons Clause, CC-BY-SA-, CC-BY-NC-, «source-available», лицензии с водяным знаком неприемлемы для закрытого продукта не подключать, не копировать; см. «чистая комната»
4 — коммерческие Qt Commercial, QtitanRibbon, HyperFormula Commercial, Sentry (FSL) и т.п. договор и оплата по решению владельца; фиксируется в реестре

3. Как получить код «под нашей лицензией» из чужого

Способ Что получаем Когда применять
Зависимость класса 0–1 без изменений компонент чужой, продукт наш; атрибуция библиотеки с устойчивым API (Skia, HarfBuzz, SQLite, image, tantivy, Yrs)
Vendoring (копия в репозиторий) класса 0–1 с правками наш форк, правки публиковать не нужно; атрибуция сохраняется когда нужны глубокие изменения (IronCalc, Pinta-алгоритмы, draw.io-трафареты)
Порт на Rust кода класса 0–1 новый файл под нашей лицензией; в заголовке — «основано на … (MIT)» Java/JS/C#/Python источники (POI, SheetJS SSF, formulajs, jackcess, Pinta)
Реализация по спецификации/статье полностью наш код без упоминаний когда есть спецификация (ECMA-376, MS-DOC, RFC 5545, TeXbook прил. G)
«Чистая комната» полностью наш код когда единственный код — GPL/AGPL: один человек описывает поведение, другой реализует

Алгоритмы и идеи не защищаются авторским правом — защищается конкретный текст кода. Поэтому любой алгоритм из любого источника можно реализовать заново; копировать текст можно только из классов 0–2.

4. Правила «чистой комнаты»

  1. Исходники проектов класса 3 (LibreOffice-LGPL-части, Gnumeric, Krita, GIMP, OnlyOffice, MuPDF, Poppler, Calligra-GPL, AbiWord, HyperFormula-GPL) разработчики ядра не читают. Допустимо изучать документацию, баг-трекеры, форматы файлов, спецификации и поведение программ как пользователь.
  2. Если нужный алгоритм описан только в GPL-коде: один сотрудник пишет текстовое описание алгоритма (без кода), другой — реализацию; переписка сохраняется как доказательство независимой разработки.
  3. Код классов 0–1 переносить можно, в том числе портом на Rust, с уведомлением об авторстве в файле и NOTICE.
  4. Класс 2 — только целыми файлами/библиотеками по правилам лицензии и только по решению владельца.

5. Процесс одобрения зависимости

  1. Крейты Rust попадают в реестр автоматически из Cargo.lock; для всего остального разработчик добавляет запись в third_party.toml (из него генерируются THIRD_PARTY.md, NOTICE, SBOM): имя, версия, ссылка, SPDX, назначение, способ связи (статически / динамически / отдельный процесс / данные), класс, что требуется (атрибуция / публикация правок).
  2. cargo deny check в CI на каждый коммит (разрешены только классы 0–1; класс 2 — через exceptions с обоснованием); для C/C++/JS/данных — scancode/licensee в CI (фаза 0).
  3. Класс 2 и 4 одобряет владелец; класс 3 — автоматический отказ без обсуждения.
  4. THIRD_PARTY.md, NOTICE и SBOM (CycloneDX 1.6, sbom.cdx.json) генерируются scripts/third_party.py при каждом изменении зависимостей и проверяются в CI (--check: актуальность файлов, класс 3 и классы 2/4 без решения владельца — ошибка); текст NOTICE показывается в окне «О программе → Лицензии открытого ПО» и на сайте (/licenses/).

6. Особые случаи

7. Что ищем в первую очередь

  1. Крейты Rust классов 0–1 с живым сообществом (обновление < 12 мес., > 300 звёзд или известный автор).
  2. Библиотеки C/C++ класса 1 с устойчивым ABI (Skia, HarfBuzz, pdfium, lcms2, SQLite, libmypaint).
  3. Приложения класса 1 как источник алгоритмов для порта (Apache OpenOffice, Pinta, draw.io, Univer, Grist, SheetJS).
  4. Серверные компоненты класса 1 для MOffice ID / обновлений / аварийных отчётов (Keycloak, velopack, GlitchTip).

Каталог найденного — docs/11-open-source-reuse.md, исходные отчёты — docs/research/.