O T2Mark é composto por três camadas que se comunicam via HTTP/HTTPS.
| Camada | Tecnologia |
|---|---|
| Backend | PHP (framework MVC custom — Setor9 Simple MVC), MariaDB |
| Frontend | Bootstrap, Feather Icons, Smooch Sans + Mozilla Text |
| API | REST sobre HTTP, autenticação por X-API-Key (SHA-256) |
| Agente | Windows (C#/.NET), comunica via HTTPS |
| Infra | Docker + Docker Compose, Nginx reverse proxy, Ubuntu 24.04 |
O agente Windows segue um fluxo de dois estágios para se autenticar na API:
Agente API
│ │
│ POST /api/register │
│ { tenantKey, hostname, │
│ hwid, osVersion } │
│─────────────────────────────▶│
│ │ Valida tenantKey
│ │ Gera apiKey (random 64 chars)
│ │ Armazena SHA-256(apiKey) no banco
│ 201 { apiKey, machineId } │
│◀─────────────────────────────│
│ │
Agente API
│ │
│ GET /api/policy │
│ X-API-Key: <apiKey> │
│─────────────────────────────▶│
│ │ SHA-256(apiKey) → busca no banco
│ │ Valida status da máquina e tenant
│ 200 { template, version, │
│ visualConfig } │
│◀─────────────────────────────│
│ │
O sistema é multi-tenant: cada empresa (tenant) tem seus próprios dados isolados. O isolamento é garantido por:
$_SESSION['usuarioTenant'] filtra todas as queriesTodas as queries de Model usam filtro duplo:
WHERE id = :id AND tenantId = :tenantId, prevenindo ataques de IDOR (Insecure Direct Object Reference).
Application/
├─ core/ Framework base (Router, Controller, Database)
├─ controllers/ Handlers de requisição (Api, Home, Politica...)
├─ models/ Acesso a dados (Users, Tenants, Politicas, Apikeys...)
├─ views/ Templates PHP (HTML)
└─ theme/ Layout: header.php + footer.php
public/
└─ index.php Entry point (front controller)