# Offline Activation (Оффлайн активация)

## Для пользователей

### Когда использовать оффлайн активацию?

- У вас нет подключения к интернету
- Сервер PostgreSQL недоступен
- Вы хотите использовать программу в автономном режиме

### Как активировать программу оффлайн?

#### Шаг 1: Получить Machine ID

1. Запустите программу BIgo Reader
2. На экране входа нажмите ссылку **"🔑 Оффлайн активация"**
3. Скопируйте ваш **Machine ID** (кнопка "📋 Копировать")
   - Пример: `A1B2C3D4E5F6G7H8`

#### Шаг 2: Запросить лицензионный ключ

Отправьте email на `support@baduk.org` с темой "License Request":

```
Имя пользователя: [ваше имя]
Machine ID: [скопированный Machine ID]
Желаемый уровень доступа: full / custom
```

#### Шаг 3: Получить и ввести ключ

1. Дождитесь email с лицензионным ключом
2. В программе на экране "Оффлайн активация" вставьте ключ
   - Используйте кнопку "📄 Вставить из буфера" или введите вручную
3. Нажмите **"Активировать"**
4. Готово! Программа активирована

### Часто задаваемые вопросы

**Q: Можно ли использовать один ключ на нескольких компьютерах?**  
A: Нет, каждый ключ привязан к конкретному Machine ID (компьютеру).

**Q: Что делать если переустановил Windows?**  
A: Machine ID может измениться. Запросите новый ключ с новым Machine ID.

**Q: Сколько действует лицензия?**  
A: Срок действия указывается при выдаче ключа (обычно 365 дней).

**Q: Нужен ли интернет после активации?**  
A: Нет, после активации программа работает полностью автономно.

---

## Для администраторов

### Генерация лицензионных ключей

#### Установка

```bash
# Файл находится в:
bigo_book/tools/generate_license_key.py
```

#### Использование

```bash
python generate_license_key.py <username> <machine_id> [access_level] [days] [allowed_books]
```

**Параметры:**
- `username` - имя пользователя (обязательно)
- `machine_id` - Machine ID с компьютера пользователя (обязательно, 16 символов)
- `access_level` - уровень доступа: `guest`, `full`, `custom` (по умолчанию: `full`)
- `days` - количество дней до истечения (по умолчанию: 365)
- `allowed_books` - список книг для `custom` уровня, JSON формат (например: `"[1,2,3]"`)

#### Примеры

**1. Полный доступ на 1 год:**
```bash
python generate_license_key.py user1 A1B2C3D4E5F6G7H8
```

**2. Гостевой доступ на 30 дней:**
```bash
python generate_license_key.py guest_user 1234567890ABCDEF guest 30
```

**3. Кастомный доступ к книгам 1, 2, 3 на 180 дней:**
```bash
python generate_license_key.py custom_user FEDCBA0987654321 custom 180 "[1,2,3]"
```

#### Вывод программы

```
======================================================================
ЛИЦЕНЗИОННЫЙ КЛЮЧ СГЕНЕРИРОВАН
======================================================================

Пользователь:    user1
Machine ID:      A1B2C3D4E5F6G7H8
Уровень доступа: full
Выдан:           2025-01-15T10:30:00
Действителен до: 2026-01-15T10:30:00

Лицензионный ключ:
----------------------------------------------------------------------
eyJ1c2VybmFtZSI6InVzZXIxIiwibWFjaGluZV9pZCI6IkExQjJDM0Q0RTVGNkc3SDgiLC
JhY2Nlc3NfbGV2ZWwiOiJmdWxsIiwiZXhwaXJlcyI6IjIwMjYtMDEtMTVUMTA6MzA6MD
AiLCJpc3N1ZWQiOiIyMDI1LTAxLTE1VDEwOjMwOjAwIn06YWJjZGVmZ2hpamtsbW5vcH
FyYXR1dnd4eXowMTIzNDU2Nzg5
----------------------------------------------------------------------

Отправьте этот ключ пользователю по email.
Пользователь должен ввести его в программе через
'Offline Activation' (оффлайн активация).
======================================================================

✓ Ключ сохранён в файл: license_user1_20250115_103000.txt
```

### Формат лицензионного ключа

Лицензионный ключ имеет следующую структуру:

```
BASE64(JSON_DATA + ':' + SIGNATURE)
```

**JSON_DATA содержит:**
```json
{
  "username": "user1",
  "machine_id": "A1B2C3D4E5F6G7H8",
  "access_level": "full",
  "expires": "2026-01-15T10:30:00",
  "issued": "2025-01-15T10:30:00",
  "allowed_books": "[1,2,3]"  // только для custom уровня
}
```

**SIGNATURE:**
```
SHA256(JSON_DATA + SECRET_KEY)
```

### Безопасность

- **SECRET_KEY** хранится в двух местах:
  - `manual_license_dialog.py` (клиент, для проверки)
  - `generate_license_key.py` (сервер, для генерации)
  
- **Важно:** Оба SECRET_KEY должны совпадать!

- **Рекомендации:**
  - Храните `generate_license_key.py` в безопасном месте
  - Не публикуйте SECRET_KEY в открытом доступе
  - Периодически меняйте SECRET_KEY (требует перегенерации всех ключей)

### Проверка ключа

При активации программа проверяет:

1. ✅ Формат ключа (Base64 + JSON)
2. ✅ Наличие обязательных полей
3. ✅ Соответствие Machine ID
4. ✅ Подпись (HMAC-SHA256)
5. ✅ Срок действия (expires > now)

Если хотя бы одна проверка не пройдена - активация отклоняется.

---

## Техническая информация

### Machine ID

Machine ID генерируется на основе:
- MAC-адреса сетевой карты
- Имени компьютера (hostname)

Формат: `SHA256(hostname + MAC)[:16]`

### Хранение лицензии

После успешной активации:
- Лицензионный ключ сохраняется в: `config['license_key']`
- Данные лицензии в: `config['license_data']` (JSON)

### Оффлайн работа

После активации программа может работать полностью автономно:
- Не требуется подключение к серверу
- Проверка лицензии выполняется локально
- Доступ к книгам согласно `access_level` и `allowed_books`

---

## Troubleshooting

### Ошибка: "Неверный формат ключа"
- Проверьте, что ключ скопирован полностью
- Убедитесь, что нет лишних пробелов или переносов строк

### Ошибка: "Ключ предназначен для другого компьютера"
- Machine ID изменился (переустановка ОС, смена оборудования)
- Запросите новый ключ с актуальным Machine ID

### Ошибка: "Срок действия ключа истёк"
- Лицензия закончилась
- Запросите новый ключ с продлённым сроком

### Ошибка: "Неверная подпись ключа"
- Ключ повреждён или изменён
- Запросите новый ключ
- Проверьте, что SECRET_KEY совпадает на клиенте и сервере

---

## Лицензия

© 2025 BIgo Team  
Все права защищены
