Политика использования стороннего кода и данных (MOffice)
Статус: действует с 2026-10-03 (уточнение владельца: «всё должно быть под нашей лицензией»). Применяется ко всему коду, данным, шрифтам, иконкам, моделям, тестовым корпусам и документации, которые попадают в продукт, установщик, сервисы или репозиторий. Инструментальная проверка —
deny.toml(cargo-deny) иscripts/third_party.py(реестрTHIRD_PARTY.md, файлNOTICE, SBOMsbom.cdx.json).
1. Цель и главный принцип
Продукт целиком распространяется под собственной коммерческой лицензией MOffice (EULA). Ни один сторонний компонент не должен навязывать условия нашему коду: ни раскрытия исходников, ни копилефта, ни ограничений на продажу. Чужого кода «вообще без лицензии» в нужных объёмах не существует (без лицензии = нельзя использовать вовсе), поэтому практическая цель формулируется так:
- Приоритет 0 — без обязательств: Public Domain, CC0-1.0, Unlicense, 0BSD, WTFPL. Можно брать, менять, встраивать, не упоминать. (Пример: SQLite, mypaint-brushes, отдельные TeX-шаблоны переносов (например, казахский), GovDocs1. Русские TeX-шаблоны — LPPL-1.2+ (класс 1 с условием переименования изменённых файлов), чешские — GPL (запрещено).)
- Приоритет 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 без публикации правок. Это основной класс для повторного использования.
- Приоритет 2 — НЕ используем (решение владельца 2026-10-04: «полностью свой код»). Ранее: условные, только по отдельному решению владельца: MPL-2.0 (правки в их файлах надо публиковать), LGPL-2.1/3 (только динамическая линковка, пользователь должен иметь возможность заменить библиотеку), EPL-2.0 (отдельный модуль). Используем, только если нет замены из приоритетов 0–1 и выгода велика. Каждый случай — отдельная запись в реестре с подписью владельца. Самый важный случай — Qt 6: либо LGPL-условия (динамическая линковка, без правок Qt), либо покупка коммерческой лицензии Qt (тогда никаких условий) — решение владельца в фазе 0.
- Запрещены всегда: 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. Правила «чистой комнаты»
- Исходники проектов класса 3 (LibreOffice-LGPL-части, Gnumeric, Krita, GIMP, OnlyOffice, MuPDF, Poppler, Calligra-GPL, AbiWord, HyperFormula-GPL) разработчики ядра не читают. Допустимо изучать документацию, баг-трекеры, форматы файлов, спецификации и поведение программ как пользователь.
- Если нужный алгоритм описан только в GPL-коде: один сотрудник пишет текстовое описание алгоритма (без кода), другой — реализацию; переписка сохраняется как доказательство независимой разработки.
- Код классов 0–1 переносить можно, в том числе портом на Rust, с уведомлением об авторстве в файле и NOTICE.
- Класс 2 — только целыми файлами/библиотеками по правилам лицензии и только по решению владельца.
5. Процесс одобрения зависимости
- Крейты Rust попадают в реестр автоматически из
Cargo.lock; для всего остального разработчик добавляет запись вthird_party.toml(из него генерируютсяTHIRD_PARTY.md,NOTICE, SBOM): имя, версия, ссылка, SPDX, назначение, способ связи (статически / динамически / отдельный процесс / данные), класс, что требуется (атрибуция / публикация правок). cargo deny checkв CI на каждый коммит (разрешены только классы 0–1; класс 2 — черезexceptionsс обоснованием); для C/C++/JS/данных —scancode/licenseeв CI (фаза 0).- Класс 2 и 4 одобряет владелец; класс 3 — автоматический отказ без обсуждения.
THIRD_PARTY.md,NOTICEи SBOM (CycloneDX 1.6,sbom.cdx.json) генерируютсяscripts/third_party.pyпри каждом изменении зависимостей и проверяются в CI (--check: актуальность файлов, класс 3 и классы 2/4 без решения владельца — ошибка); текстNOTICEпоказывается в окне «О программе → Лицензии открытого ПО» и на сайте (/licenses/).
6. Особые случаи
- Спецификации Microsoft ([MS-DOC], [MS-XLS], [MS-PPT], [MS-ONE], [MS-PST], [MS-CFB], [MS-OFFCRYPTO]) — Open Specification Promise: реализация допустима, код пишем сами (класс «по спецификации»).
- ECMA-376 / ISO 29500 схемы (XSD), ODF RELAX NG (OASIS), presetShapeDefinitions.xml — данные спецификаций, допустимы с указанием источника.
- Шрифты: только OFL/Apache (Liberation, Carlito, Caladea, Noto, STIX Two, Inter, JetBrains Mono, PT); коммерческие метрические клоны (например, для Aptos) — заказ по договору с передачей прав.
- Модели ИИ: лицензия весов проверяется отдельно от кода; CC-BY-NC — запрещены.
- Тестовые корпуса хранятся вне продукта; на лицензию продукта не влияют.
- Патенты: ribbon — юридическое заключение в фазе 0; видеокодеки — только платформенные кодеры ОС.
- Qt: решение «LGPL с динамической линковкой» или «коммерческая лицензия» принимает владелец в фазе 0; до решения в коде не допускаются GPL-only модули Qt (Qt Charts, Qt Data Visualization, Qt Virtual Keyboard и др.).
7. Что ищем в первую очередь
- Крейты Rust классов 0–1 с живым сообществом (обновление < 12 мес., > 300 звёзд или известный автор).
- Библиотеки C/C++ класса 1 с устойчивым ABI (Skia, HarfBuzz, pdfium, lcms2, SQLite, libmypaint).
- Приложения класса 1 как источник алгоритмов для порта (Apache OpenOffice, Pinta, draw.io, Univer, Grist, SheetJS).
- Серверные компоненты класса 1 для MOffice ID / обновлений / аварийных отчётов (Keycloak, velopack, GlitchTip).
Каталог найденного — docs/11-open-source-reuse.md,
исходные отчёты — docs/research/.