Tul xxx Tul
User / IP
:
216.73.216.159
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
ventas
/
app
/
Http
/
Middleware
/
Viewing: LicenseEnforcer.php
<?php /** * ============================================================================ * LC DESIGN - Sistema de Gestión Empresarial * ============================================================================ * * @copyright 2024-2025 LC Design. Todos los derechos reservados. * @license Propietario - Uso exclusivo bajo licencia * ============================================================================ */ namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use App\Services\ActivationCodeGenerator; use App\Models\Venta; use Illuminate\Support\Facades\Cache; class LicenseEnforcer { protected $excludedRoutes = [ 'login', 'logout', 'lc/*', 'acerca-de', 'about', 'dispositivos/*', ]; public function handle(Request $request, Closure $next) { // Excluir rutas específicas foreach ($this->excludedRoutes as $route) { if ($request->is($route)) { return $next($request); } } $licenseStatus = ActivationCodeGenerator::getLicenseStatus(); // Si está activo, permitir todo if ($licenseStatus['status'] === 'active') { return $next($request); } // Contar movimientos (ventas) en modo demo $demoStats = $this->getDemoStats(); // Compartir estadísticas con las vistas view()->share('demoStats', $demoStats); view()->share('licenseStatus', $licenseStatus); // Si está en modo demo y se agotaron los movimientos if ($licenseStatus['status'] === 'demo' && $demoStats['remaining'] <= 0) { // Bloquear acciones de escritura (POST, PUT, DELETE) if (in_array($request->method(), ['POST', 'PUT', 'PATCH', 'DELETE'])) { // Permitir solo logout y activación if (!$request->is('logout', 'lc/*')) { if ($request->expectsJson()) { return response()->json([ 'success' => false, 'error' => 'license_required', 'message' => 'Límite de modo DEMO alcanzado. Active su licencia para continuar.', ], 403); } return redirect()->route('about')->with('error', '⚠️ Límite de modo DEMO alcanzado (' . $demoStats['limit'] . ' movimientos). Active su licencia para continuar.' ); } } } // Si la licencia expiró, bloquear todo excepto visualización if ($licenseStatus['status'] === 'expired') { if (in_array($request->method(), ['POST', 'PUT', 'PATCH', 'DELETE'])) { if (!$request->is('logout', 'lc/*')) { if ($request->expectsJson()) { return response()->json([ 'success' => false, 'error' => 'license_expired', 'message' => 'Licencia expirada. Contacte a LC Design para renovar.', ], 403); } return redirect()->route('about')->with('error', '⚠️ Licencia expirada. Contacte a LC Design para renovar.' ); } } } return $next($request); } protected function getDemoStats(): array { // Cachear por 1 minuto para no consultar en cada request return Cache::remember('demo_stats', 60, function () { $limit = ActivationCodeGenerator::DEMO_LIMIT; // Contar ventas como "movimientos" $ventasCount = 0; try { $ventasCount = Venta::count(); } catch (\Exception $e) { // Si la tabla no existe, asumir 0 } return [ 'limit' => $limit, 'used' => $ventasCount, 'remaining' => max(0, $limit - $ventasCount), 'percentage' => min(100, ($ventasCount / max(1, $limit)) * 100), ]; }); } }
Coded With 💗 by
0x6ick