<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sistema de Login</title>
    <style>
        .hidden {
            display: none;
        }
        /* Estilos adicionais para melhorar a aparência */
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            padding: 20px;
        }
        form {
            background: #fff;
            padding: 20px;
            margin-bottom: 20px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        label, input, button {
            display: block;
            width: 100%;
            margin-bottom: 10px;
        }
        button {
            padding: 10px;
            background: #5cb85c;
            border: none;
            color: #fff;
            cursor: pointer;
            border-radius: 5px;
        }
        button:hover {
            background: #4cae4c;
        }
        .link {
            color: #0275d8;
            cursor: pointer;
            text-decoration: underline;
        }
    </style>
</head>
<body>

    <div id="loginForm">
        <h1>Login</h1>
        <form onsubmit="event.preventDefault(); handleLogin();">
            <label for="username">Nome de Usuário:</label>
            <input type="text" id="username" name="username" required>

            <label for="password">Senha:</label>
            <input type="password" id="password" name="password" required>

            <button type="submit">Login</button>
        </form>
        <p>Não tem uma conta? <span id="showRegister" class="link">Registre-se aqui</span></p>
    </div>

    <div id="activationScreen" class="hidden">
        <h1>Ativação da Conta</h1>
        <p>Por favor, insira o código de ativação enviado para seu e-mail:</p>
        <form onsubmit="event.preventDefault(); handleActivation();">
            <label for="activationCode">Código de Ativação:</label>
            <input type="text" id="activationCode" name="activationCode" required>

            <button type="submit">Ativar</button>
        </form>
    </div>

    <div id="registerForm" class="hidden">
        <h1>Criar Conta</h1>
        <form onsubmit="event.preventDefault(); handleRegister();">
            <label for="newUsername">Nome de Usuário:</label>
            <input type="text" id="newUsername" name="newUsername" required>

            <label for="newPassword">Senha:</label>
            <input type="password" id="newPassword" name="newPassword" required>

            <button type="submit">Criar Conta</button>
        </form>
        <p>Já tem uma conta? <span id="showLogin" class="link">Faça Login aqui</span></p>
    </div>

    <script src="./script4.js"></script>
</body>
</html>

// Função para gerar uma chave de acesso aleatória
function generateAccessKey(length = 50) {
  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let accessKey = '';
  for (let i = 0; i < length; i++) {
    accessKey += characters.charAt(Math.floor(Math.random() * characters.length));
  }
  return accessKey;
}

// Função para hash da chave de acesso usando SHA-256
async function hashAccessKey(accessKey) {
  const encoder = new TextEncoder();
  const data = encoder.encode(accessKey);
  const hashBuffer = await crypto.subtle.digest('SHA-256', data);
  const hashArray = Array.from(new Uint8Array(hashBuffer));
  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}

// Função para redirecionar (melhora a organização)
function redirectTo(url) {
  window.location.href = url;
}

// Função para exibir alertas
function showAlert(message) {
  alert(message);
}

// Função para validar entradas do formulário
function validateInput(input) {
  const sanitizedInput = input.trim();
  // Adicionar mais validações conforme necessário
  return sanitizedInput;
}

async function handleRegister() {
  const usernameInput = document.getElementById('newUsername');
  const passwordInput = document.getElementById('newPassword');

  const username = validateInput(usernameInput.value);
  const password = validateInput(passwordInput.value);

  if (!username || !password) {
    showAlert('Nome de usuário e senha são obrigatórios.');
    return;
  }

  const accessKey = generateAccessKey();

  try {
    const hashedAccessKey = await hashAccessKey(accessKey);
    const response = await fetch('register.php', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ username, password: hashPassword(password), accessKey }),
    });

    const result = await response.json();

    if (result.success) {
      // Armazena a chave de acesso hasheada no localStorage
      localStorage.setItem('hashedAccessKey', hashedAccessKey);
      showAlert('Conta criada e chave de acesso gerada com sucesso!');
      showLoginForm();
    } else {
      showAlert(result.message);
    }
  } catch (error) {
    showAlert("Erro ao registrar: " + error.message);
    console.error(error);
  }
}

async function handleLogin() {
  const usernameInput = document.getElementById('username');
  const passwordInput = document.getElementById('password');

  const username = validateInput(usernameInput.value);
  const password = validateInput(passwordInput.value);
  const storedHashedAccessKey = localStorage.getItem('hashedAccessKey');

  if (!username || !password) {
    showAlert('Nome de usuário e senha são obrigatórios.');
    return;
  }

  if (!storedHashedAccessKey) {
    showAlert('Chave de acesso não encontrada. Iniciando processo de ativação.');
    showActivationScreen();
    return;
  }

  try {
    const response = await fetch('login.php', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ username, password: hashPassword(password), hashedAccessKey: storedHashedAccessKey }),
    });

    const result = await response.json();
    console.log('Resposta do servidor:', result); // Log para depuração

    if (result.success) {
      showAlert('Login realizado com sucesso!');
      redirectTo('index.php');
    } else if (result.message === 'Chave de acesso inválida.') {
      // Armazena as credenciais temporariamente para uso na ativação
      sessionStorage.setItem('tempUsername', username);
      sessionStorage.setItem('tempPassword', password);
      console.log('Credenciais armazenadas:', { username, password }); // Confirma o armazenamento
      showActivationScreen();
    } else {
      showAlert(result.message);
    }
  } catch (error) {
    showAlert("Erro ao fazer login: " + error.message);
    console.error(error);
  }
}

function showActivationScreen() {
  document.getElementById('loginForm').classList.add('hidden');
  document.getElementById('registerForm').classList.add('hidden');
  document.getElementById('activationScreen').classList.remove('hidden');
}

function showLoginForm() {
  document.getElementById('activationScreen').classList.add('hidden');
  document.getElementById('registerForm').classList.add('hidden');
  document.getElementById('loginForm').classList.remove('hidden');

  // Limpa os campos do formulário de login
  document.getElementById('username').value = '';
  document.getElementById('password').value = '';
}

async function handleActivation() {
  const username = sessionStorage.getItem('tempUsername');
  const password = sessionStorage.getItem('tempPassword');
  console.log('Tentando recuperar credenciais:', { username, password });
  const activationCodeInput = document.getElementById('activationCode');
  const activationCode = validateInput(activationCodeInput.value);

  if (!username || !password) {
    showAlert('Erro: Informações de login não encontradas. Por favor, faça login novamente.');
    showLoginForm();
    return;
  }

  if (!activationCode) {
    showAlert('O código de ativação é obrigatório.');
    return;
  }

  try {
    const response = await fetch('regenerate_key.php', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ username, password: hashPassword(password), activationCode }),
    });

    const result = await response.json();

    if (result.success) {
      localStorage.setItem('hashedAccessKey', result.newHashedAccessKey);
      sessionStorage.removeItem('tempUsername');
      sessionStorage.removeItem('tempPassword');
      showAlert('Conta ativada com sucesso!');
      redirectTo('index.php');
    } else {
      showAlert(result.message);
    }
  } catch (error) {
    showAlert('Erro na ativação: ' + error.message);
    console.error(error);
  }
}

// Função auxiliar para hash de senha usando SHA-256
async function hashPassword(password) {
  const encoder = new TextEncoder();
  const data = encoder.encode(password);
  const hashBuffer = await crypto.subtle.digest('SHA-256', data);
  const hashArray = Array.from(new Uint8Array(hashBuffer));
  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}

// Adicionar eventos para trocar entre formulários
document.addEventListener('DOMContentLoaded', () => {
  const showRegisterButton = document.getElementById('showRegister');
  if (showRegisterButton) {
    showRegisterButton.addEventListener('click', () => {
      document.getElementById('loginForm').classList.add('hidden');
      document.getElementById('activationScreen').classList.add('hidden');
      document.getElementById('registerForm').classList.remove('hidden');
    });
  }

  const showLoginButton = document.getElementById('showLogin');
  if (showLoginButton) {
    showLoginButton.addEventListener('click', () => {
      document.getElementById('activationScreen').classList.add('hidden');
      document.getElementById('registerForm').classList.add('hidden');
      document.getElementById('loginForm').classList.remove('hidden');
    });
  }
});


<?php
header('Content-Type: application/json');

try {
    ini_set('display_errors', 0); // Desativar exibição de erros no ambiente de produção
    ini_set('log_errors', 1);
    ini_set('error_log', '/path/to/error.log'); // Atualize com o caminho real

    $data = json_decode(file_get_contents('php://input'), true);

    $newUsername = isset($data['username']) ? trim($data['username']) : null;
    $newPassword = isset($data['password']) ? trim($data['password']) : null;
    $accessKey = isset($data['accessKey']) ? trim($data['accessKey']) : null;

    if (!$newUsername || !$newPassword || !$accessKey) {
        echo json_encode(['message' => 'Nome de usuário, senha e chave de acesso são obrigatórios', 'success' => false]);
        exit();
    }

    // Hash da senha usando SHA-256 antes de enviar para o servidor Node.js
    $hashedPassword = hash('sha256', $newPassword);

    $ch = curl_init('http://localhost:3000/register');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
        'username' => $newUsername,
        'password' => $hashedPassword,
        'accessKey' => $accessKey
    ]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        throw new Exception(curl_error($ch));
    }

    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($http_status !== 200) {
        throw new Exception("Erro na requisição: HTTP Status $http_status");
    }

    echo $response;

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['message' => 'Ocorreu um erro no processamento.', 'success' => false]);
    error_log($e->getMessage());
    exit;
}
?>


Erro ao registrar: Unexpected end of JSON input
Failed to load resource: the server responded with a status of 404 ()
script4.js:53 
        
        
       POST https://lightmanworld.online/register.php 500 (Internal Server Error)
handleRegister @ script4.js:53
await in handleRegister
onsubmit @ (index):76
script4.js:71 SyntaxError: Unexpected end of JSON input
    at handleRegister (script4.js:59:35)
handleRegister @ script4.js:71
await in handleRegister
onsubmit @ (index):76
script4.js:53 
        
        
       POST https://lightmanworld.online/register.php 500 (Internal Server Error)
handleRegister @ script4.js:53
await in handleRegister
onsubmit @ (index):76