/** * Processa o formulário de login */ protected static function processLoginForm() { // proteção contra CSRF \CSRF::Check(); $email = isset($_POST['email']) ? $_POST['email'] : null; $password = isset($_POST['password']) ? $_POST['password'] : null; $hashedPassword = \Hash::password($password); $errors = []; if (empty($email)) { $errors[] = 'Informe seu email'; } if (empty($password)) { $errors[] = 'Informe sua senha'; } if (count($errors) > 0) { return \View::make('login', compact('errors')); } $DB = new \DB(); $sql = "SELECT id, password, status FROM users WHERE email = :email"; $stmt = $DB->prepare($sql); $stmt->bindParam(':email', $email); $stmt->execute(); $rows = $stmt->fetchAll(\PDO::FETCH_OBJ); if (count($rows) <= 0) { $errors[] = 'Usuário não encontrado'; } else { $user = $rows[0]; if ($hashedPassword != $user->password) { $errors[] = 'Senha incorreta'; } elseif ($user->status != \Models\User::STATUS_ACTIVE) { $errors[] = 'Ative sua conta antes de fazer login'; } else { // busca os dados do usuário para criar os dados no cookie $objUser = new \Models\User(); $objUser->find($user->id); // gera um token de acesso $token = $objUser->generateToken(); // salva o cookie com os dados do usuário self::saveSessionCookieForUser($objUser); // redireciona para a página inicial redirect(getBaseURL()); } } if (count($errors) > 0) { return \View::make('login', compact('errors')); } }
/** * Salva a resposta */ public static function store() { // impede acesso a usuário não logado \Auth::denyNotLoggedInUsers(); // impede ataque por CSRF \CSRF::Check(); $questionID = isset($_POST['question_id']) ? (int) $_POST['question_id'] : null; $description = isset($_POST['description']) ? $_POST['description'] : null; $errors = []; if (empty($questionID)) { $errors[] = 'ID da pergunta inválido'; } if (empty($description)) { $errors[] = 'Informe a resposta'; } if (count($errors) > 0) { // se ocorrer erro, exibe-os e encerra a execução deste método, usando o return return \View::make('answer.create', compact('errors')); } // busca o usuário logado $user = \Auth::user(); $user_id = $user->getId(); $now = date('Y-m-d H:i:s'); $DB = new \DB(); $sql = "INSERT INTO answers(user_id, question_id, description, created_at, updated_at) VALUES(:user_id, :question_id, :description, :created_at, :updated_at)"; $stmt = $DB->prepare($sql); $stmt->bindParam(':question_id', $questionID, \PDO::PARAM_INT); $stmt->bindParam(':description', $description); $stmt->bindParam(':user_id', $user_id, \PDO::PARAM_INT); $stmt->bindParam(':created_at', $now); $stmt->bindParam(':updated_at', $now); if ($stmt->execute()) { // redireciona para a pergunta, já com a resposta criada redirect(getBaseURL() . '/pergunta/' . $questionID); } else { // exibe erro e gera um log com os detalhes do problema echo "Erro ao criar resposta"; \Log::error("Erro ao criar resposta: " . print_r($stmt->errorInfo(), true)); } }
/** * Processa o formulário de criação de pergunta */ public static function store() { \Auth::denyNotLoggedInUsers(); \CSRF::Check(); $title = isset($_POST['title']) ? $_POST['title'] : null; $description = isset($_POST['description']) ? $_POST['description'] : null; $errors = []; if (empty($title)) { $errors[] = 'Informe o título da pergunta'; } if (empty($description)) { $errors[] = 'Informe a descrição da pergunta'; } if (count($errors) > 0) { // se ocorrer erro, exibe-os e encerra o método usando return return \View::make('question.create', compact('errors')); } $user = \Auth::user(); $user_id = $user->getId(); $now = date('Y-m-d H:i:s'); $DB = new \DB(); $sql = "INSERT INTO questions(user_id, title, description, created_at, updated_at) VALUES(:user_id, :title, :description, :created_at, :updated_at)"; $stmt = $DB->prepare($sql); $stmt->bindParam(':title', $title); $stmt->bindParam(':description', $description); $stmt->bindParam(':user_id', $user_id, \PDO::PARAM_INT); $stmt->bindParam(':created_at', $now); $stmt->bindParam(':updated_at', $now); if ($stmt->execute()) { // busca o ID gerado na inserção $id = $DB->lastInsertId(); // redireciona para a páginca com o pergunta criada redirect(getBaseURL() . '/pergunta/' . $id); } else { echo "Erro ao criar pergunta"; \Log::error("Erro ao criar pergunta: " . print_r($stmt->errorInfo(), true)); } }
/** * Registra o usuário */ public static function store() { \CSRF::Check(); $nickname = isset($_POST['nickname']) ? $_POST['nickname'] : null; $email = isset($_POST['email']) ? $_POST['email'] : null; $password = isset($_POST['password']) ? $_POST['password'] : null; $passwordConfirmation = isset($_POST['password_confirmation']) ? $_POST['password_confirmation'] : null; $hashedPassword = \Hash::password($password); $hasErrors = false; $errorMessages = []; if ($nickname == null) { $errorMessages[] = "Informe seu apelido"; $hasErrors = true; } if ($email == null) { $errorMessages[] = "Informe seu email"; $hasErrors = true; } if ($password == null) { $errorMessages[] = "Informe uma senha"; $hasErrors = true; } if ($passwordConfirmation == null) { $errorMessages[] = "Confirme sua senha"; $hasErrors = true; } if ($password != $passwordConfirmation) { $errorMessages[] = "Senhas não coincidem"; $hasErrors = true; } if ($hasErrors) { return \View::make('user.create', compact('errorMessages')); } $sql = "INSERT INTO users(name, nickname, email, password, status, admin, created_at, updated_at) VALUES(:name, :nickname, :email, :password, :status, :admin, :created_at, :updated_at)"; $DB = new \DB(); $stmt = $DB->prepare($sql); $date = date('Y-m-d H:i:s'); $stmt->bindParam(':name', $name); $stmt->bindParam(':nickname', $nickname); $stmt->bindParam(':email', $email); $stmt->bindParam(':password', $hashedPassword); $stmt->bindValue(':status', \Models\User::STATUS_ACTIVE, \PDO::PARAM_INT); $stmt->bindValue(':admin', '0'); $stmt->bindParam(':created_at', $date); $stmt->bindParam(':updated_at', $date); if ($stmt->execute()) { // em vez de apenas exibir uma mensagem de sucesso, faremos um redirecionamento. // isso é melhor pois evita que o usuário atualize a página e crie uma nova conta redirect(getBaseURL() . '/cadastro_finalizado'); } else { list($error, $sgbdErrorCode, $sgbdErrorMessage) = $stmt->errorInfo(); if ($sgbdErrorCode == 1062) { // erro 1062 é o código do MySQL de violação de chave única // veja mais em: http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html if (preg_match("/for key .?nickname/iu", $sgbdErrorMessage)) { // nickname já em uso $errorMessages[] = "Apelido já está em uso"; } else { // email já em uso $errorMessages[] = "Email já está em uso"; } } return \View::make('user.create', compact('errorMessages')); } }