Compare commits
2 Commits
4934f92ddb
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 680104024d | |||
| 747fd15176 |
@@ -31,3 +31,4 @@ shuffle-database/rca_enabled.conf
|
|||||||
|
|
||||||
#*/package-lock.json
|
#*/package-lock.json
|
||||||
.omo/
|
.omo/
|
||||||
|
shuffle-database/*.conf
|
||||||
|
|||||||
+67
-19
@@ -12,14 +12,16 @@
|
|||||||
|
|
||||||
| Файл | Изменение |
|
| Файл | Изменение |
|
||||||
|------|-----------|
|
|------|-----------|
|
||||||
| `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) и проверке суб-организаций. |
|
||||||
| `backend/go-app/go.mod` | Включён `replace github.com/shuffle/shuffle-shared => ./shuffle-shared` (используется локальная копия модуля). |
|
| `backend/go-app/go.mod` | Включён `replace github.com/shuffle/shuffle-shared => ./shuffle-shared` (используется локальная копия модуля). |
|
||||||
| `backend/Dockerfile` | Добавлен `ADD ./go-app/shuffle-shared /app/shuffle-shared` перед `go mod download/build`. |
|
| `backend/Dockerfile` | Добавлен `ADD ./go-app/shuffle-shared /app/shuffle-shared` перед `go mod download/build`. |
|
||||||
| `backend/go-app/shuffle-shared/` | Полная копия модуля `shuffle-shared v1.2.51` с патчем. |
|
| `backend/go-app/shuffle-shared/` | Полная копия модуля `shuffle-shared v1.2.51` с патчами. |
|
||||||
|
|
||||||
> Почему в отдельной папке: функция, реально ограничивающая app runs (`SetWorkflowQueue`
|
> Почему в отдельной папке: функция, реально ограничивающая app runs (`SetWorkflowQueue`
|
||||||
> в `db-connector.go`), живёт во внешнем модуле `github.com/shuffle/shuffle-shared`.
|
> в `db-connector.go`), и лимиты суб-организаций живут во внешнем модуле
|
||||||
> Вместо правки upstream-модуля мы подменяем его локальной копией через `replace`.
|
> `github.com/shuffle/shuffle-shared`. Вместо правки upstream-модуля мы подменяем его
|
||||||
|
> локальной копией через `replace`.
|
||||||
|
|
||||||
Патч изолирован маркерами, его легко найти и откатить:
|
Патч изолирован маркерами, его легко найти и откатить:
|
||||||
|
|
||||||
@@ -29,34 +31,48 @@
|
|||||||
// ==== END LICENSE BYPASS PATCH ====
|
// ==== END LICENSE BYPASS PATCH ====
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Покрытие (аудит всех точек принуждения)
|
||||||
|
|
||||||
|
Пропатчены **все** источники правды о лицензии, которые реально ограничивают работу:
|
||||||
|
|
||||||
|
| Точка принуждения | Файл | Покрытие |
|
||||||
|
|-------------------|------|----------|
|
||||||
|
| Лимит app runs | `db-connector.go` `SetWorkflowQueue` (~8819) | Через `HandleCheckLicense` + `checkNoInternet` (патчи) |
|
||||||
|
| Лимит app runs (облако) | `cloudSync.go` (~947) | Через `SyncFeatures.AppExecutions.Limit` = 1e9 (патч HandleCheckLicense) |
|
||||||
|
| Лимит окружений (multi-env) | `db-connector.go` (~7388) | Через `SyncFeatures.MultiEnv` = активный (патч HandleCheckLicense) |
|
||||||
|
| Лимит суб-организаций | `shared.go` (~13084, 13093) | Через `checkNoInternet` + `HandleCheckLicense` (оба патча) |
|
||||||
|
| UI-флаг "licensed" | `main.go:1087` / `IsLicensed` | Патч `IsLicensed` = true |
|
||||||
|
|
||||||
|
Прочие чтения `SyncFeatures`/лимитов (дефолты, описания, `BuildBaseSubscription`) не блокируют работу — это только отображение в UI. Проверяющие агенты (worker/orborus) лицензию не проверяют.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Как собрать и запустить
|
## Как собрать и запустить
|
||||||
|
|
||||||
Важно: **docker build context — `backend/`** (как в CI Shuffle), НЕ корень репозитория.
|
Важно: **docker build context — `backend/`** (как в CI Shuffle), НЕ корень репозитория.
|
||||||
|
|
||||||
### 1. Собрать собственный образ бэкенда
|
### 1. Взять готовый образ (рекомендуется)
|
||||||
|
|
||||||
|
Патченый образ публикуется в registry как `marker689/shuffle-backend-unchained:12082026`.
|
||||||
|
Просто укажите его в `docker-compose.yml` (см. шаг 2) — docker сам его скачает.
|
||||||
|
|
||||||
|
Либо собрать локально:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd backend
|
cd backend
|
||||||
docker build -t shuffle-backend-cracked:local -f Dockerfile .
|
docker build -t marker689/shuffle-backend-unchained:12082026 -f Dockerfile .
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Подключить образ к docker-compose
|
### 2. Подключить образ к docker-compose
|
||||||
|
|
||||||
В `docker-compose.yml` у сервиса `backend` заменить:
|
В `docker-compose.yml` у сервиса `backend` заменить образ на готовый патченый:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
image: ghcr.io/shuffle/shuffle-backend:latest
|
image: marker689/shuffle-backend-unchained:12082026
|
||||||
```
|
```
|
||||||
|
|
||||||
на:
|
> Это уже собранный и пропатченный образ (публичный в registry `marker689`).
|
||||||
|
> Альтернатива — собрать локально: `cd backend && docker build -t ... -f Dockerfile .`.
|
||||||
```yaml
|
|
||||||
image: shuffle-backend-cracked:local
|
|
||||||
```
|
|
||||||
|
|
||||||
(либо добавить `build: ./backend` и использовать свой образ).
|
|
||||||
|
|
||||||
### 3. Запустить
|
### 3. Запустить
|
||||||
|
|
||||||
@@ -76,17 +92,19 @@ docker-compose up -d
|
|||||||
Проверка собранного бинаря:
|
Проверка собранного бинаря:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run --rm --entrypoint sh shuffle-backend-cracked:local \
|
docker run --rm --entrypoint sh marker689/shuffle-backend-unchained:12082026 \
|
||||||
-c 'grep -c "LICENSE BYPASS PATCH" /app/shuffle-shared/shared.go && grep "shuffle-shared =>" /app/go.mod'
|
-c 'grep -c "LICENSE BYPASS PATCH" /app/shuffle-shared/shared.go && grep "shuffle-shared =>" /app/go.mod'
|
||||||
```
|
```
|
||||||
|
|
||||||
Ожидаемый вывод:
|
Ожидаемый вывод:
|
||||||
|
|
||||||
```
|
```
|
||||||
2
|
4
|
||||||
replace github.com/shuffle/shuffle-shared => ./shuffle-shared
|
replace github.com/shuffle/shuffle-shared => ./shuffle-shared
|
||||||
```
|
```
|
||||||
|
|
||||||
|
(`shared.go` — 4 маркера патча в двух функциях; `db-connector.go` — 2 маркера в `checkNoInternet`.)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Как обновляться (апгрейд Shuffle)
|
## Как обновляться (апгрейд Shuffle)
|
||||||
@@ -100,10 +118,10 @@ replace github.com/shuffle/shuffle-shared => ./shuffle-shared
|
|||||||
"https://proxy.golang.org/github.com/shuffle/shuffle-shared/@v/<VERSION>.zip"
|
"https://proxy.golang.org/github.com/shuffle/shuffle-shared/@v/<VERSION>.zip"
|
||||||
```
|
```
|
||||||
3. Замените `backend/go-app/shuffle-shared/` новым содержимым.
|
3. Замените `backend/go-app/shuffle-shared/` новым содержимым.
|
||||||
4. Повторите тот же патч в `HandleCheckLicense` (см. блок ниже).
|
4. Повторите патчи в трёх местах (см. блоки ниже).
|
||||||
5. Пересоберите образ.
|
5. Пересоберите образ.
|
||||||
|
|
||||||
### Текст патча (вставить в `HandleCheckLicense`, сразу после `func ... {`)
|
### Патч 1 — в `HandleCheckLicense` (сразу после `func ... {`)
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// ==== LICENSE BYPASS PATCH ====
|
// ==== LICENSE BYPASS PATCH ====
|
||||||
@@ -140,6 +158,36 @@ replace github.com/shuffle/shuffle-shared => ./shuffle-shared
|
|||||||
// ==== END LICENSE BYPASS PATCH ====
|
// ==== END LICENSE BYPASS PATCH ====
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Патч 2 — в `IsLicensed` (сразу после `func ... {`)
|
||||||
|
|
||||||
|
```go
|
||||||
|
func IsLicensed(ctx context.Context, org Org) bool {
|
||||||
|
// ==== LICENSE BYPASS PATCH ====
|
||||||
|
return true
|
||||||
|
// ==== END LICENSE BYPASS PATCH ====
|
||||||
|
```
|
||||||
|
|
||||||
|
Оставшийся код тела функции остаётся неактивным (недостижимым).
|
||||||
|
|
||||||
|
### Патч 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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Откат патча
|
## Откат патча
|
||||||
|
|||||||
@@ -15840,6 +15840,20 @@ func checkNoInternet() OnpremLicense {
|
|||||||
Timeout: "",
|
Timeout: "",
|
||||||
Branding: false,
|
Branding: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==== 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 ====
|
||||||
|
|
||||||
licenseKey := os.Getenv("SHUFFLE_LICENSE")
|
licenseKey := os.Getenv("SHUFFLE_LICENSE")
|
||||||
if len(licenseKey) == 0 {
|
if len(licenseKey) == 0 {
|
||||||
return license
|
return license
|
||||||
|
|||||||
@@ -33504,6 +33504,26 @@ func HandleCheckLicense(ctx context.Context, org Org) Org {
|
|||||||
setActive(&org.SyncFeatures.Branding, unlimited)
|
setActive(&org.SyncFeatures.Branding, unlimited)
|
||||||
setActive(&org.SyncFeatures.AgentExecutions, unlimited)
|
setActive(&org.SyncFeatures.AgentExecutions, unlimited)
|
||||||
setActive(&org.SyncFeatures.AgentTokens, unlimited)
|
setActive(&org.SyncFeatures.AgentTokens, unlimited)
|
||||||
|
org.Subscriptions = []PaymentSubscription{{
|
||||||
|
Active: true,
|
||||||
|
Startdate: time.Now().Unix(),
|
||||||
|
Enddate: time.Now().AddDate(10, 0, 0).Unix(),
|
||||||
|
Name: "Enterprise License",
|
||||||
|
SupportLevel: "Enterprise Support",
|
||||||
|
Recurrence: "monthly",
|
||||||
|
Level: "1",
|
||||||
|
Amount: "0",
|
||||||
|
Currency: "USD",
|
||||||
|
Limit: 1,
|
||||||
|
EulaSigned: true,
|
||||||
|
Features: []string{
|
||||||
|
"∞ Days Workflow Run History",
|
||||||
|
"∞ Days Workflow Backup",
|
||||||
|
"∞ Users",
|
||||||
|
"Air Gap Environment",
|
||||||
|
"Critical Response",
|
||||||
|
},
|
||||||
|
}}
|
||||||
return org
|
return org
|
||||||
// ===== END LICENSE BYPASS PATCH =====
|
// ===== END LICENSE BYPASS PATCH =====
|
||||||
|
|
||||||
@@ -33814,6 +33834,10 @@ func HandleCheckLicense(ctx context.Context, org Org) Org {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func IsLicensed(ctx context.Context, org Org) bool {
|
func IsLicensed(ctx context.Context, org Org) bool {
|
||||||
|
// ==== LICENSE BYPASS PATCH ====
|
||||||
|
return true
|
||||||
|
// ==== END LICENSE BYPASS PATCH ====
|
||||||
|
|
||||||
if project.Environment == "cloud" && len(org.ManagerOrgs) > 0 {
|
if project.Environment == "cloud" && len(org.ManagerOrgs) > 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
- backend
|
- backend
|
||||||
backend:
|
backend:
|
||||||
image: ghcr.io/shuffle/shuffle-backend:latest
|
image: shuffle-backend-patched:test3
|
||||||
container_name: shuffle-backend
|
container_name: shuffle-backend
|
||||||
hostname: ${BACKEND_HOSTNAME}
|
hostname: ${BACKEND_HOSTNAME}
|
||||||
# Here for debugging:
|
# Here for debugging:
|
||||||
|
|||||||
Reference in New Issue
Block a user