# License Server

سيرفر ترخيص بسيط لتطبيقاتك أنت. لا يقلد أي سيرفر خارجي ولا يتجاوز تفعيل مكتبات طرف ثالث.

## التشغيل

```powershell
$env:ADMIN_TOKEN="ضع-توكن-قوي"
node server.mjs
```

السيرفر يعمل افتراضيا على:

```text
http://localhost:8080
```

أول تشغيل ينشئ مفاتيح RSA داخل `data/`:
أول تشغيل ينشئ مفاتيح RSA داخل مسار البيانات.

افتراضيا يستخدم:

```text
%TEMP%\license-server-data
```

ويمكن تغييره هكذا:

```powershell
$env:LICENSE_DATA_DIR="C:\secure\license-server-data"
```

- `license_private.pem`
- `license_public.pem`
- `db.json`

احتفظ بالمفتاح الخاص على السيرفر فقط. المفتاح العام يمكن تضمينه في التطبيق للتحقق offline.

## Endpoints

### Health

```http
GET /health
```

### Public Key

```http
GET /api/v1/public-key
```

### Register Device

```http
POST /api/v1/device/register
Content-Type: application/json

{
  "appId": "com.example.app",
  "deviceId": "device-123",
  "androidId": "android-id",
  "model": "Pixel",
  "brand": "Google"
}
```

يرجع `deviceFp`.

### Issue License

يتطلب admin token.

```http
POST /api/v1/license/issue
Authorization: Bearer ضع-توكن-قوي
Content-Type: application/json

{
  "appId": "com.example.app",
  "deviceFp": "DEVICE_FP",
  "days": 30,
  "features": ["multi_process", "ble"]
}
```

### Verify License

```http
POST /api/v1/license/verify
Content-Type: application/json

{
  "license": "LICENSE_STRING",
  "appId": "com.example.app",
  "deviceFp": "DEVICE_FP"
}
```

### Renew License

يتطلب admin token.

```http
POST /api/v1/license/renew
Authorization: Bearer ضع-توكن-قوي
Content-Type: application/json

{
  "currentLic": "LICENSE_STRING",
  "days": 30
}
```

## ملاحظات أمان

- شغل السيرفر خلف HTTPS في الإنتاج.
- غير `ADMIN_TOKEN` ولا تترك القيمة الافتراضية.
- لا ترفع `data/license_private.pem` إلى Git.
- استخدم قاعدة بيانات حقيقية مثل PostgreSQL إذا صار عندك مستخدمون كثيرون.
