Открытое ПО в коммерческом продукте: как проверить лицензии перед релизом

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

Открытое ПО, или open source, — не «код без правообладателя» и не обязательно бесплатный код. Право на его использование дают условия лицензии. Коммерческий продукт может включать открытые компоненты, если компания соблюдает эти условия: например, сохраняет уведомления об авторстве, передает текст лицензии или предоставляет исходный код в предусмотренных случаях.

Сначала определите способ использования кода

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

  • Внутреннее использование. Программа работает в инфраструктуре компании и не передается третьим лицам. У некоторых лицензий обязанности, связанные с передачей копий, в таком случае не возникают. Но саму лицензию и другие ограничения, в том числе по товарным знакам, все равно нужно проверить.
  • Доступ через сеть. Клиент пользуется сервисом, не получая копию серверной программы. Для ряда лицензий это не то же самое, что распространение программы. Однако отдельные лицензии предусматривают обязанности и при взаимодействии с пользователями через сеть.
  • Передача копии. Компания поставляет установочный пакет, контейнерный образ, мобильное приложение, устройство с прошивкой или SDK. Выясните, какие компоненты получает клиент и какие уведомления, тексты лицензий или исходные файлы должны сопровождать поставку.
  • Изменение и повторная публикация. Если команда исправила ошибку в чужом компоненте и передает измененную версию, могут появиться дополнительные обязанности в отношении изменений и исходного кода.

Модель продаж сама по себе не отвечает на вопрос о передаче кода. SaaS-поставщик может не передавать серверное приложение, но отправлять пользователю JavaScript-код через браузер или предоставлять агент для установки. Эти части продукта оценивают отдельно.

разработчик проверяет список библиотек проекта

Что означает тип лицензии на практике

У открытых лицензий нет общего набора условий. Деление на группы помогает сориентироваться, но вывод зависит от текста конкретной лицензии, ее версии и способа использования компонента.

Разрешительные лицензии

Лицензии семейства MIT, BSD и Apache обычно допускают использование кода в закрытом коммерческом продукте. Однако «разрешительная» не значит «без условий»: часто нужно сохранять сведения об авторских правах и текст лицензии. Apache License 2.0 содержит дополнительные положения, в частности о патентах и уведомлениях об изменениях. Формулировки в разных лицензиях и редакциях отличаются, поэтому требования одной библиотеки нельзя переносить на другую.

Лицензии с условием сохранения открытости

GPL связывает распространение охватываемой программы с обязанностями по исходному коду и лицензированию. Для библиотек под LGPL предусмотрен иной режим, но результат зависит от версии лицензии, способа подключения и возможности пользователя заменить библиотеку. MPL обычно привязывает обязанности к определенным файлам, а не автоматически ко всему продукту. AGPL отдельно регулирует взаимодействие пользователей с программой через сеть.

Фраза «GPL заражает весь проект» слишком груба для принятия решения. Важны границы программы, характер связи компонентов, наличие модификаций, версия лицензии и обстоятельства передачи. Но и вывод «мы продаем только доступ, значит обязанностей нет» может быть ошибочным, особенно если используется компонент под AGPL.

Лицензия каждого компонента, а не только главного пакета

У пакета могут быть собственные зависимости, а отдельные файлы в репозитории — распространяться на разных условиях. Шрифты, изображения, наборы данных, документация и примеры кода тоже могут лицензироваться отдельно. Лицензия библиотеки не обязательно разрешает использовать ее название или логотип в рекламе: права на товарные знаки обычно регулируются отдельно.

Бывает и так, что исходный код доступен для просмотра, но условия ограничивают коммерческое использование или предоставление конкурирующего сервиса. Доступность исходников сама по себе не подтверждает, что проект соответствует принятому в компании определению open source или подходит для ее бизнес-модели.

Где искать условия и что сохранять

Короткая пометка о лицензии на странице пакета — лишь отправная точка. Проверьте файл LICENSE, уведомления NOTICE, заголовки отдельных файлов, данные о зависимостях, документацию и условия именно для используемой версии. Если текст в репозитории расходится с метаданными менеджера пакетов, выясните причину до релиза, а не выбирайте более удобную формулировку.

Чтобы проверку можно было повторить, ведите реестр зависимостей. Для каждого компонента укажите название, версию, источник, дату проверки, заявленную лицензию, ссылку на архивную копию ее текста, сведения о модификациях и место использования в продукте. Зафиксируйте также вывод: передается ли компонент клиенту и что нужно сделать до поставки. К этому реестру можно вернуться при обновлении продукта, переговорах с покупателем или смене команды.

Если лицензии нет, остановитесь на проверке. Публикация исходного кода без указания условий не дает компании права свободно копировать его в свой продукт. Можно запросить разрешение правообладателя, найти замену с подходящей лицензией или отказаться от использования, пока статус кода не прояснится.

Соблюдение условий при поставке продукта

Обязанности зависят от лицензии и состава поставки. Иногда достаточно сохранить уведомления об авторстве и приложить тексты лицензий; иногда требуется предоставить соответствующий исходный код на предусмотренных условиях. Универсальная папка с лицензиями не заменяет проверку: в ней могут отсутствовать нужные документы, лежать тексты не тех версий или не учитываться измененный компонент.

  1. Зафиксируйте состав поставки. Проверьте не только основной исполняемый файл, но и плагины, мобильные сборки, контейнеры, прошивки, установщики и клиентский код.
  2. Сопоставьте компоненты с условиями. Уточните, какие уведомления должны оставаться в коде, какие нужно передать получателю и где требуется обозначить изменения.
  3. Подготовьте материалы. Если лицензия требует предоставить исходный код, определите его объем, состав сопутствующих материалов, способ и срок предоставления по применимой редакции.
  4. Проверьте документы для клиента. Пользовательское соглашение, договор поставки и условия конфиденциальности не должны противоречить правам получателя в отношении открытых компонентов.
  5. Сохраните подтверждения. Архив релизной сборки, перечень компонентов и копии переданных уведомлений помогут установить, что именно получил клиент.

Предположим, договор обещает клиенту исключительные права на весь продукт «без каких-либо прав третьих лиц», а в сборке есть открытые библиотеки. Такое обещание некорректно. Компания может передать права на собственный код в согласованном объеме, но не становится исключительным правообладателем чужой библиотеки после ее включения в продукт. В договоре стоит отделить собственную разработку от сторонних компонентов и описать их режим, не ограничивая права, предоставленные открытыми лицензиями.

команда сверяет условия поставки программы

Изменения чужого кода и вклад сотрудников

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

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

Отправка исправления в публичный проект — отдельное действие. Проверьте правила приема вклада: проект может требовать соглашение с участником или подтверждение происхождения кода. Перед публикацией убедитесь, что исправление не раскрывает закрытые сведения, чужой код без разрешения или материалы клиента, которые компания не вправе публиковать.

Совместимость лицензий: задача для конкретной архитектуры

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

Если есть сомнения, нарисуйте схему: какие компоненты связаны, что изменено, что получает клиент и чего требует каждая лицензия. Когда эти требования противоречат договорной модели — например, клиент настаивает на закрытии исходников, которые нужно предоставить по лицензии, — решайте вопрос до интеграции. Можно заменить зависимость, изменить архитектуру при реальном разделении компонентов, получить отдельную коммерческую лицензию у правообладателя или пересмотреть условия поставки. Одно лишь переименование модуля либо изменение упаковки обязанностей не снимает.

Коммерческая лицензия и поддержка — разные вопросы

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

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

Как встроить проверку в работу команды

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

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

Перед ближайшим релизом выгрузите перечень компонентов именно из релизной сборки и отметьте, копию каких из них получает клиент. Это даст отправную точку для проверки условий поставки. Материал носит общий информационный характер и не заменяет индивидуальную юридическую консультацию: вывод зависит от текста лицензии, применимого права, архитектуры продукта и фактической поставки.