webmoney/backend/app/Http/Middleware/DemoProtection.php
marco 54cccdd095 refactor: migração para desenvolvimento direto no servidor
- Removido README.md padrão do Laravel (backend)
- Removidos scripts de deploy (não mais necessários)
- Atualizado copilot-instructions.md para novo fluxo
- Adicionada documentação de auditoria do servidor
- Sincronizado código de produção com repositório

Novo workflow:
- Trabalhamos diretamente em /root/webmoney (symlink para /var/www/webmoney)
- Mudanças PHP são instantâneas
- Mudanças React requerem 'npm run build'
- Commit após validação funcional
2025-12-19 11:45:32 +01:00

79 lines
2.4 KiB
PHP
Executable File

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class DemoProtection
{
/**
* Rotas e métodos permitidos para usuário demo (whitelist)
* Estas rotas são operações de leitura/cálculo que não modificam dados reais
*/
protected array $allowedRoutes = [
'GET' => ['*'], // Permite todos os GETs
'POST' => [
'api/login',
'api/logout',
'api/refresh',
'api/accounts/recalculate-all', // Recálculo de saldos (não modifica dados)
'api/accounts/*/recalculate', // Recálculo de conta específica
'api/categories/match', // Matching de categorias (leitura)
'api/cost-centers/match', // Matching de centros de custo (leitura)
],
];
/**
* Handle an incoming request.
* Bloqueia operações de escrita (POST/PUT/PATCH/DELETE) para usuário demo
*/
public function handle(Request $request, Closure $next): Response
{
$user = $request->user();
// Se não está logado ou não é demo, permite tudo
if (!$user || !$user->is_demo) {
return $next($request);
}
$method = $request->method();
$path = $request->path();
// GET sempre permitido para demo
if ($method === 'GET') {
return $next($request);
}
// Verifica se a rota está na whitelist
if (isset($this->allowedRoutes[$method])) {
foreach ($this->allowedRoutes[$method] as $allowedPath) {
if ($allowedPath === '*' || $this->pathMatches($path, $allowedPath)) {
return $next($request);
}
}
}
// Bloqueia a operação para usuário demo
return response()->json([
'success' => false,
'message' => 'Usuario DEMO: Esta acción no está permitida en modo demostración. Los datos no pueden ser modificados.',
'demo_mode' => true,
], 403);
}
/**
* Verifica se o path corresponde ao padrão
*/
protected function pathMatches(string $path, string $pattern): bool
{
if ($pattern === '*') {
return true;
}
$pattern = str_replace('*', '.*', $pattern);
return (bool) preg_match('#^' . $pattern . '$#', $path);
}
}