/* global React, ReactDOM, Icon, PageShell, useFormHardening, useIdleTimeout, usePageHardening, SecurityStancePanel */ const { useState: useS_rs } = React; function RestritaPage() { usePageHardening(); const sec = useFormHardening({ formKey: "area-restrita", botMinMs: 800 }); const [user, setUser] = useS_rs(""); const [pass, setPass] = useS_rs(""); const [otp, setOtp] = useS_rs(""); const [step, setStep] = useS_rs(1); const [err, setErr] = useS_rs(null); const [warning, setWarning] = useS_rs(null); // Idle logout — reset to step 1 after 15 min of inactivity. Active only // once the user has progressed past the first screen. useIdleTimeout({ minutes: 15, warnAt: 1, paused: step === 1, onWarn: (s) => setWarning("Sessão expira em ~" + Math.round(s / 60) + " min por inatividade."), onTimeout: () => { setStep(1); setUser(""); setPass(""); setOtp(""); setErr("Sessão encerrada por inatividade. Entre novamente."); setWarning(null); }, }); const onSubmit1 = (e) => { e.preventDefault(); const r = sec.validate({ user, pass }); if (!r.ok) { if (r.silent) { setErr("Falha na autenticação."); return; } if (r.reason === "rate") { setErr(`Muitas tentativas. Aguarde ${r.retryInSec}s.`); return; } setErr("Dados inválidos."); return; } if (!user || !pass) { setErr("Preencha usuário e senha."); return; } setErr(null); setWarning(null); setStep(2); }; const onSubmit2 = (e) => { e.preventDefault(); if (otp.length !== 6) { setErr("O código MFA tem 6 dígitos."); return; } setErr("Acesso restrito. Sua sessão será validada pela direção em até 30 minutos."); }; return (

Área restrita

Portal de clientes Crime Solution. Acesso somente com credenciais ativas e dispositivo registrado.

{step === 1 && (
setUser(e.target.value)} placeholder="seu.usuario@empresa.com" autoComplete="username" />
setPass(e.target.value)} placeholder="••••••••" autoComplete="current-password" />
{err && {err}}
)} {step === 2 && (
setOtp(e.target.value.replace(/[^0-9]/g, "").slice(0, 6))} placeholder="••••••" inputMode="numeric" autoComplete="one-time-code" maxLength={6} style={{ letterSpacing: "0.5em", fontFamily: "var(--font-mono)", fontSize: 18, textAlign: "center" }} />
{warning && {warning}} {err && {err}}
)}
TLS 1.3 · HSTS MFA obrigatório Logout em 15 min Rate limit anti força bruta
); } ReactDOM.createRoot(document.getElementById("root")).render();