Architektura
Cały plugin to dwa procesy które rozmawiają ze sobą po HMAC-podpisanym HTTP. Trzecia strona to serwer licencji na license.sisl.pl który podpisuje odpowiedzi Ed25519.
Topologia
flowchart LR
subgraph SHOP["Magento 2.4.x · PHP 8.2/8.3 + MariaDB"]
SO["<b>Sisl_Optima</b><br/>moduł Magento<br/>admin · cron · observer"]
end
subgraph WIN["Windows Server · Comarch ERP Optima"]
SS["<b>Sisl.Sync.Service</b><br/>.NET 8 Windows Service"]
SQL[("SQL Server<br/>CDN_Firma_*")]
SS -- "Trusted_Connection" --> SQL
end
LIC["<b>license.sisl.pl</b><br/>License Server<br/>Ed25519 signing"]
SO <== "HMAC-signed REST<br/>GET /v1/products · /v1/stocks<br/>POST /v1/orders" ==> SS
SO -. "HTTPS license verify (24h)" .-> LIC
SS -. "HTTPS license verify (24h)" .-> LIC
classDef shop fill:#15151b,stroke:#d4ad5a,stroke-width:1px,color:#e5e5ec
classDef win fill:#15151b,stroke:#6aa6ff,stroke-width:1px,color:#e5e5ec
classDef lic fill:#1c1c24,stroke:#7ad6a8,stroke-width:1.5px,color:#e5e5ec
class SHOP shop
class WIN win
class LIC lic
Komponenty
Sisl_Optima (Magento PHP module)
| Plik | Odpowiedzialność |
|---|---|
Service/ProductSync.php |
pobiera /v1/products, upsertuje do catalog_product_entity |
Service/StockSync.php |
pobiera /v1/stocks, zapisuje przez StockRegistryInterface |
Service/OrderForward.php |
wysyła zamówienia do /v1/orders przy sales_order_place_after |
Service/Diagnostics.php |
14 kontroli stanu (licencja, sieć, perms, cron, drift...) |
Service/ProductExclusion.php |
sprawdza atrybut sisl_optima_sync_disabled per produkt |
Model/SyncClient.php |
HTTP klient z HMAC + retry 3x exponential backoff |
Model/LicenseChecker.php |
weryfikacja licencji + 7-dniowy grace offline |
Cron/SyncProducts.php |
cron wrapper (dropdown harmonogramu w admin) |
Cron/SyncStock.php |
jw. dla stanów |
Cron/CheckLicense.php |
codzienny check licencji |
Sisl.Sync.Service (.NET 8 ASP.NET Core minimal API)
| Plik | Odpowiedzialność |
|---|---|
Program.cs |
HTTP endpointy, DI, license gate middleware |
Comarch/OptimaSqlClient.cs |
Dapper queries do CDN.Towary/TwrZasoby/TwrCeny/KntKarty |
Comarch/MockComarchClient.cs |
backend testowy (bez Optimy) |
Auth/HmacAuthMiddleware.cs |
weryfikacja podpisu klienta na każdym /v1/* |
Auth/LicenseGuard.cs |
weryfikacja Ed25519, gate na /v1/* (HTTP 402 jeśli invalid) |
Bezpieczeństwo
- HMAC-SHA256 na każdym request/response między Magento a
Sisl.Sync.Service. Replay protection przezX-SISL-Timestampz driftem max 300s. - Ed25519 asymetryczne podpisy odpowiedzi serwera licencyjnego. Klucz prywatny tylko na
license.sisl.pl. Plugin ma tylko klucz publiczny — nie da się sfałszować "valid:true". - Nonce w request → echo w response → niemożliwy replay starych odpowiedzi.
- Manifest hash plików pluginu — serwer rejestruje zmiany, wykrywa cracked instally.
- Multi-checkpoint weryfikacja licencji w 5 miejscach (PHP) + 1 (microservice) → zedycja jednego callsite nie wystarczy.
Schemat bazy Comarch Optima (read-only)
Mikrousługa czyta z base tables, nie z CDN.TwrKarty (view który wymaga CDN.RptTemp2):
| Tabela | Co | Filtr |
|---|---|---|
CDN.Towary |
produkty | Twr_GIDTyp = 16 (towar, nie usługa) |
CDN.TwrCeny |
ceny w cennikach | TwC_TwCNumer = 1 (cennik detal) |
CDN.TwrZasoby |
rzeczywisty stan z PZ/PW | TwZ_TrSIdDost > 0 (tylko dokumentami pokryte) |
CDN.TwrIlosci |
rezerwacje + zamówienia | dla Reserved i OnOrder |
CDN.Magazyny |
magazyny | filtr po Mag_Symbol |
CDN.KntKarty |
kontrahenci | Knt_GIDTyp = 32 |
Następny krok: Instalacja →