# Лицензирование Bridge-and-Join-s (#19)

Годовые лицензии с офлайн-проверкой по подписи Ed25519 + опциональный
онлайн-отзыв.

## Компоненты

- `internal/license` — формат лицензии + подпись/проверка (offline).
- `cmd/bj-license` — издательский CLI: keygen, issue, verify.
- `cmd/bj-license-server` — онлайн-реестр отзывов (revocation).
- Интеграция в bj-server: `internal/lkgateway/licensecheck.go` — проверка
  лицензии + гейт обновлений; UI раздел «Лицензия».

## Модель

Лицензия — самодостаточный подписанный токен: `payload.signature.keyid`.
bj-server проверяет подпись зашитым публичным ключом и срок **офлайн** —
работает без связи с сервером. Online-сервер нужен только для отзыва.

**Гейт обновлений:** если лицензирование включено (есть публичный ключ),
авто-обновление (#20) выполняется только при валидной лицензии с фичей
`updates`. Без лицензирования (публичный ключ не зашит) — открытый режим,
гейты не действуют (бесплатная редакция / разработка).

## Издателю

```bash
# 1. Ключи лицензий (однократно; приватный — в секрете!)
bj-license keygen -out ./keys/license
#    публичный base64 — зашить в bj-server (DefaultLicensePublicKey)

# 2. Выпустить годовую лицензию клиенту
bj-license issue -tenant "ООО Ромашка" -plan pro -days 365 \
    -features updates,web-cabinet -key ./keys/license.priv -keyid main
#    → выводит ключ payload.signature.keyid — отдать клиенту

# 3. Проверить
bj-license verify -key-file license.key -pub ./keys/license.pub
```

Планы: `free` (без фич), `pro` (перечисленные features), `enterprise`
(всё включено). Фичи: `updates`, `web-cabinet`, …

## Клиенту (on-prem bj-server)

Админ → Настройка → **Лицензия** → вставить ключ → «Активировать».
Проверка офлайн; статус (организация, план, срок, обновления) виден сразу.

## Онлайн-отзыв (опционально)

```bash
bj-license-server --addr :8091 --revoked /var/lib/bj-license/revoked.json
```

`revoked.json` — JSON-массив отозванных license ID:

```json
["28db4973-fde8-434c-b102-e83623eede2c"]
```

`GET /v1/check?id=<id>` → `{"revoked":true|false}`. Перечитывается раз в
минуту. В проде заменить файл на PostgreSQL + admin API выпуска/отзыва.

## Зашивка публичного ключа в релиз

```bash
go build -ldflags "\
  -X .../lkgateway.DefaultLicensePublicKey=<base64-pub> \
  -X .../lkgateway.DefaultUpdatePublicKey=<base64-pub-артефактории> \
  -X .../lkgateway.BuildVersion=1.0.0" -o bj-server ./cmd/bj-server/
```
