- CRACKED.md: target image is marker689/shuffle-backend-unchained:12082026
- docker-compose.yml: point backend at patched image (drop override file)
- shared.go: HandleCheckLicense also sets org.Subscriptions to an active
Enterprise License so the UI shows 'Licensed' (was showing Unlicensed)
- gitignore shuffle-database runtime *.conf
Verified: backend image builds and runs with all limits lifted.
Audit of all license enforcement points found two hard limits that read
checkNoInternet() directly, bypassing HandleCheckLicense:
- SetWorkflowQueue (app runs limit) at db-connector.go:8822/8828
- sub-organization limit check at shared.go:13084
Patches now close all sources of truth:
- checkNoInternet: always return Valid=true with 1e9 limits (closes the
two direct reads above and cloudSync.go app-runs limit)
- IsLicensed: return true (UI 'licensed' flag)
- HandleCheckLicense: unchanged (already forces Licensed + all limits)
Verified: backend image builds successfully via docker.
2026-08-12 03:26:33 +03:00
5 changed files with 107 additions and 20 deletions
| `backend/go-app/shuffle-shared/shared.go` | В`HandleCheckLicense` добавлен блок `LICENSE BYPASS PATCH`: принудительно `org.Licensed = true`и всем `SyncFeatures[*].Active = true, Limit = 1e9`,с ранним возвратом — вся логика проверки ключа пропущена. |
| `backend/go-app/shuffle-shared/shared.go` | Три блока `LICENSE BYPASS PATCH` в `HandleCheckLicense` и `IsLicensed`: (1) `HandleCheckLicense` принудительно `org.Licensed = true`+ всем `SyncFeatures[*].Active = true, Limit = 1e9`с ранним возвратом; (2) `IsLicensed` возвращает `true`. |
| `backend/go-app/shuffle-shared/db-connector.go` | Блок `LICENSE BYPASS PATCH` в `checkNoInternet()`: всегда возвращает `Valid=true` и лимиты `1e9`. Это закрывает прямые чтения в `SetWorkflowQueue` (app runs) и проверке суб-организаций. |
Прочие чтения `SyncFeatures`/лимитов (дефолты, описания, `BuildBaseSubscription`) не блокируют работу — это только отображение в UI. Проверяющие агенты (worker/orborus) лицензию не проверяют.
---
## Как собрать и запустить
Важно: **docker build context — `backend/`** (как в CI Shuffle), НЕ корень репозитория.
### 1. Собрать собственный образ бэкенда
### 1. Взять готовый образ (рекомендуется)
Патченый образ публикуется в registry как `marker689/shuffle-backend-unchained:12082026`.
Просто укажите его в `docker-compose.yml` (см. шаг 2) — docker сам его скачает.
Оставшийся код тела функции остаётся неактивным (недостижимым).
### Патч 3 — в `checkNoInternet` (сразу после инициализации `license`)
```go
// ==== LICENSE BYPASS PATCH ====
license.Valid = true
license.Environment.Active = true
license.Environment.Limit = 1000000000
license.Tenant.Active = true
license.Tenant.Limit = 1000000000
license.AppRuns.Active = true
license.AppRuns.Limit = 1000000000
license.Branding = true
license.Timeout = "01-01-2100"
return license
// ==== END LICENSE BYPASS PATCH ====
```
Этот ранний возврат делает всю дальнейшую проверку `SHUFFLE_LICENSE` недостижимой — он закрывает прямые чтения `checkNoInternet()` в `SetWorkflowQueue` (app runs) и в проверке лимита суб-организаций, которые **не идут через `HandleCheckLicense`** и не были бы закрыты патчем 1.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.