omponente para tratamento de usuários * @author sjunior * @since Feb 28, 2011 * */ class usuarioComponent extends Object { public $controller; public $msgError; /** * Inicializar Componente * @param $controller */ public function startup(&$controller) { $this->controller = $controller; } /** * Inicializar Componente * @param $controller */ public function initialize(&$controller) { $this->controller = $controller; } /** * * Enter description here ... * @param $usuario_id * @param $usuario_status_id */ public function set_usuario_status($usuario_id, $usuario_status_id = 2) { App::Import('Model', 'Usuario'); $usr = new Usuario(); $usr->id = $usuario_id; if ($usr->save(array('usuario_status_id' => $usuario_status_id))) { return true; } return false; } /** * * Enter description here ... * @param $email * @param $senha */ public function check_login($email, $senha) { App::Import('Model', 'Usuario'); $usr = new Usuario(); $usuario = $usr->find('first', array('conditions' => array('email' => $email, 'senha' => $senha))); if (!empty($usuario) && is_array($usuario)) { return $usuario['Usuario']['usuario_id']; } return false; } /** * Verifica email e senha do usuario * @param string $email * @param string $senha * @param bool $auto_login * @param bool $redirect * @return bool */ public function set_login($email, $senha) { App::Import('Model', 'Usuario'); App::Import('Component', 'jacotei'); App::Import('Component', 'Crypt'); App::Import('Component', 'dominio'); $usr = new Usuario(); $jac = new jacoteiComponent(); $usuario = $usr->find('first', array('conditions' => array('email' => $email, 'senha' => $senha))); if (count($usuario) > 0 && in_array($usuario['Usuario']['usuario_status_id'], array(1, 2))) { if ($usuario['Usuario']['usuario_status_id'] == 1) { $_SESSION['user'] = $usuario['Usuario']; return 'valida_codigo'; } else if ($usuario['Usuario']['usuario_status_id'] == 2) { $_SESSION['user'] = $usuario['Usuario']; return 'entrar'; } else { return false; } } } public function setLoginRedeSocial($usuario, $forcar = false) { if (!$this->set_login($usuario['Usuario']['login'], $usuario['Usuario']['senha'])) { App::Import('Model', 'Usuario'); $usr = new Usuario(); $usr->create($usuario); if ($forcar) { $usuarioAntigo = $this->getUsuarioDadosByEmail($usuario['Usuario']['email']); $usr->set('usuario_id', $usuarioAntigo['Usuario']['usuario_id']); } $usr->set('codigo_validacao', $this->getCodigoValidacao()); if ($usr->saveAll()) { $usuarioNovo = $this->getUsuarioDadosByEmail($usuario['Usuario']['email']); $this->set_login($usuarioNovo['Usuario']['email'], $usuarioNovo['Usuario']['senha']); $this->controller->redirect(array('controller' => 'login', 'action' => 'retorno')); } else { $this->controller->redirect(array('controller' => 'cadastro', 'action' => 'usuario_rede_social')); } } } /** * Função logoff * */ public function saveDados($dados) { App::Import('Model', 'Usuario'); App::Import('Model', 'UsuarioCampoExtra'); $usr = new Usuario(); $usrCampoExtra = new UsuarioCampoExtra(); $usuario = array( 'Usuario' => array( 'nome' => $_POST['nome_altera'], 'email' => $_POST['email_altera'], 'cpf' => $_POST['cpf_altera'], 'usuario_id' => $_SESSION['user']['usuario_id'] ) ); $usr->save($usuario); foreach ($_POST['programa-valor'] as $dados_extras_id => $CampoExtra) { if ($dados_extras_id != 0) { foreach ($CampoExtra as $campo_id => $value) { $fields = array( 'UsuarioCampoExtra' => array( 'usuario_id' => $_SESSION['user']['usuario_id'], 'valor' => $value, 'campo_id' => $campo_id, 'dados_extras_id' => $dados_extras_id ) ); try { $result = $usrCampoExtra ->save($fields); } catch (Exception $e) { echo $e->getMessage(); } } } } if ($result) { $resultado = true; } else { $resultado = false; } return $resultado; } public function logoff($redirect = '/') { if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time() - 36000, '/'); } session_destroy(); if (($redirect == 'http://' . $_SERVER['SERVER_NAME'] . '/meujacotei') || ($redirect == 'http://' . $_SERVER['SERVER_NAME'] . '/meujacotei/')) { $redirect = '/'; } $this->controller->redirect($redirect); } /** * * Efetua o cadastro de usuário * @param $dados * @param $novo_usario * @return mixed */ public function set_cadastro($dados, $novo_usario = true, $envia_email = true) { $erro_validacao = false; App::Import('Model', 'Usuario'); $usr = new Usuario(); App::Import('Component', 'jacotei'); $jac = new jacoteiComponent(); App::Import('Component', 'Date'); $date_component = new DateComponent(); $usuario = $usr->find('first', array('conditions' => array('email' => $dados['email']))); if (!empty($usuario) && $novo_usario) { if ($usuario['Usuario']['usuario_status_id'] == 4 || $usuario['Usuario']['usuario_status_id'] == 3) { $dados['usuario_id'] = $usuario['Usuario']['usuario_id']; $dados['usuario_status_id'] = 1; $usr->id = $usuario['Usuario']['usuario_id']; } else if ($usuario['Usuario']['usuario_status_id'] == 1) { $jac->set_flash_msg('Este usuário já esta registrado aguardando validação, por favor, informe o código de validação enviado para seu email.', 'mensagem_alerta_atencao'); $this->controller->redirect('/cadastro/validacao/' . $dados['email']); } else { $jac->set_flash_msg('Este usuário já esta registrado.', 'mensagem_alerta_atencao'); $erro_validacao = true; } } if (!$erro_validacao) { // código de validação somente para NOVO cadastro if ($novo_usario) $dados['codigo_validacao'] = $this->getCodigoValidacao(); // se tiver passado o ID força para UPDATE if (isset($dados['usuario_id'])) { $usr->id = $dados['usuario_id']; } $dados['data_nascimento'] = $date_component->ReadToDB($dados['data_nascimento']); // limpa formatacao foreach ($dados as $key => $value) { if ($key != 'email' && $key != 'email_confirmacao') $dados[$key] = $jac->clear_format($value); } if ($usr->save($dados)) { if (isset($dados['PromocaoUsuario'])) { $dados['PromocaoUsuario']['usuario_id'] = $usr->id; App::Import('Model', 'PromocaoUsuario'); $promocaoUsuario = new PromocaoUsuario(); $verificacao = $promocaoUsuario->find('first', array('conditions' => array('usuario_id' => $dados['PromocaoUsuario']['usuario_id'], 'promocao_id' => $dados['PromocaoUsuario']['promocao_id']))); if (empty($verificacao)) { $promocaoUsuario->save($dados['PromocaoUsuario']); } else { return false; } } $usuario_id = $usr->id; $aceita_mala = $dados['newsletter_status'] == 1 ? 'S' : 'N'; App::Import('Model', 'Newsletter'); $news = new Newsletter ( ); $news->validaNewsletter($dados['email'], $aceita_mala, $usuario_id); if ($envia_email) { $this->send_mail_validacao_cadastro(array( 'nome' => $usr->nome, 'email' => $usr->email, 'codigo' => $usr->codigo_validacao, 'senha' => $usr->senha, )); } return $usuario_id; } } return false; } /** * Método de Cadastro Via Ajax * * @param $dados * @param $novo_usario * @return mixed */ public function set_cadastro_ajax($dados, $retornoSocial) { App::Import('Model', 'Usuario'); $usr = new Usuario(); if ($this->_checkIsUsuarioExists($dados['email'], $retornoSocial)) { $retorno = $this->_checkIsUsuarioExists($dados['email'], $retornoSocial); } else { $codigoVerificacao = $this->getCodigoValidacao(); $usuario = array( 'Usuario' => array( 'nome' => $dados['nome'], 'email' => $dados['email'], 'codigo_validacao' => $codigoVerificacao, 'senha' => $dados['senha'], 'newsletter_status' => $dados['newsletter_status'] ) ); if ($usr->save($usuario)) { $this->send_mail_validacao_cadastro(array( 'nome' => $dados['nome'], 'email' => $dados['email'], 'codigo' => $codigoVerificacao, 'senha' => $dados['senha'], )); $retorno = array('mensagem' => NULL, 'acao' => true); } else { $retorno = array('mensagem' => 'Não foi possivel completar seu cadastro', 'acao' => false); } } return $retorno; } public function setCadastroCompletoAjax($usuario, $cpf, $multiplus, $smiles, $email_novo = NULL) { App::Import('Model', 'Usuario'); App::Import('Model', 'UsuarioCampoExtra'); App::Import('Vendor', 'Microservices', array('file' => 'microservices' . DS . 'microservices.php')); $usr = new Usuario(); $campoExtra = new UsuarioCampoExtra(); $Microservices = new microservices(); $usuario['Usuario']['cpf'] = $cpf; if ($email_novo != null){ if (!$hash = $usr->requireChangeMail ( $usuario['Usuario']['usuario_id'] , $email_novo )){ return false; }else{ // prepara dados do template $jsonBody = json_encode ( array ( "nome" => $usuario['Usuario']['nome'], "email_antigo" => $usuario['Usuario']['email'], "novo_email" => $email_novo, "hash" => $hash ) ); // prepara dados para o envio do email $Microservices->setTo($email_novo); $Microservices->setSubject('[JáCotei] Alteração de email'); $Microservices->setTemplate('trocaemail'); // envia o email if (!$Microservices->sendEmail($jsonBody)){ $this->msgError = $Microservices->getErrorMsg(); return false; } } } if ($usr->save($usuario)) { $campoExtra->deleteAll(array('UsuarioCampoExtra.usuario_id' => $usuario['Usuario']['usuario_id'])); if ($multiplus != 'null') { $campoExtra->create(); $campoExtra->set('valor', $multiplus); $campoExtra->set('campo_id', 3); $campoExtra->set('usuario_id', $usuario['Usuario']['usuario_id']); $campoExtra->save(); } if ($smiles != 'null') { $campoExtra->create(); $campoExtra->set('valor', $smiles); $campoExtra->set('campo_id', 4); $campoExtra->set('usuario_id', $usuario['Usuario']['usuario_id']); $campoExtra->save(); } } return true; } public function enviaSenhaEmailEsquecido($email, $retornoSocial) { App::Import('Component', 'Facebook'); $facebook = new FacebookComponent(); App::Import('Component', 'OpenId'); $google = new OpenIdComponent(); $usuario = $this->getUsuarioDadosByEmail($email); if (count($usuario) > 1) { if (empty($usuario['UsuarioRedeSocial']['usuario_id'])) { if ($this->sendEmailEsqueceuSenha($usuario['Usuario']['nome'], $usuario['Usuario']['senha'], $usuario['Usuario']['email'])) { return array('mensagem' => NULL, 'acao' => true); } else { return array('mensagem' => 'Não foi possivel enviar enviar sua senha para seu email, por favor tente novamente', 'acao' => false, 'cor' => 'amarelo'); } } else { $rede = ($usuario['UsuarioRedeSocial']['rede_social_id'] == 1) ? 'Facebook' : 'Google'; $link = ($usuario['UsuarioRedeSocial']['rede_social_id'] == 1) ? '$.usingFacebook();' : '$.usingGoogle();'; $montaLink = "clique aqui"; return array('mensagem' => "E-mail cadastrado através do {$rede}, {$montaLink} e faça seu login pela sua rede social.", 'acao' => false, 'cor' => 'amarelo'); } } else { return array('mensagem' => 'Email não encontrado.', 'acao' => false, 'cor' => 'vermelho'); } } /** * Método responsavel por verificar se o usuario já existe * @param type $email */ protected function _checkIsUsuarioExists($email, $retornoSocial) { App::Import('Component', 'Facebook'); $facebook = new FacebookComponent(); App::Import('Component', 'OpenId'); $google = new OpenIdComponent(); $usuario = $this->getUsuarioDadosByEmail($email); if (count($usuario) > 1) { if ($usuario['Usuario']['usuario_status_id'] == 1) { if (!empty($usuario['UsuarioRedeSocial']['usuario_id'])) { $rede = ($usuario['UsuarioRedeSocial']['rede_social_id'] == 1) ? 'Facebook' : 'Google'; $link = ($usuario['UsuarioRedeSocial']['rede_social_id'] == 1) ? '$.usingFacebook();' : '$.usingGoogle();'; $montaLink = "clique aqui"; return array('mensagem' => "E-mail cadastrado através do {$rede}, {$montaLink} e faça seu login pela sua rede social.", 'acao' => false); } else { $this->send_mail_validacao_cadastro(array( 'nome' => $usuario['Usuario']['nome'], 'email' => $usuario['Usuario']['email'], 'codigo' => $usuario['Usuario']['codigo_validacao'], 'senha' => $usuario['Usuario']['senha'], )); return array('mensagem' => 'Cadastro pentente de validação. Por favor, verifique seu e-mail para validar.', 'acao' => false); } } else { if (!empty($usuario['UsuarioRedeSocial']['usuario_id'])) { $rede = ($usuario['UsuarioRedeSocial']['rede_social_id'] == 1) ? 'Facebook' : 'Google'; $link = ($usuario['UsuarioRedeSocial']['rede_social_id'] == 1) ? '$.usingFacebook();' : '$.usingGoogle();'; $montaLink = "clique aqui"; return array('mensagem' => "E-mail cadastrado através do {$rede}, {$montaLink} e faça seu login pela sua rede social.", 'acao' => false); } else { return array('mensagem' => 'Desculpe, mas você já possui cadastro.', 'acao' => false); } } } return false; } /** * Método responsavel por verificar se o usuario já existe * @param type $email */ public function getUsuarioDadosByEmail($email) { App::Import('Model', 'Usuario'); $usr = new Usuario(); App::Import('Model', 'UsuarioCampoExtra'); $camposExtra = new UsuarioCampoExtra(); $usuario = $usr->find('first', array('conditions' => array('email' => $email))); $usuario['UsuarioCampoExtra'] = $camposExtra->find('all', array('conditions' => array('usuario_id' => $usuario['Usuario']['usuario_id']))); return $usuario; } public function makeUsuarioAtivacao($email, $codigo) { $email = (is_null($email)) ? $_SESSION['user']['email'] : $this->hexToStr($email); $usuario = $this->getUsuarioDadosByEmail($email); if (count($usuario) > 0) { // Verifica se o usuario já esta ativo // se o usuário já estiver ATIVO direciona ao login if ($usuario['Usuario']['usuario_status_id'] == 2) { // Usuario Ativo $return = array('mensagem' => 'Seu cadastro já foi validado! Para logar no site, por favor, informe seu email e senha', 'acao' => 'login_cadastro_ajax', 'valido' => false); } if (trim($usuario['Usuario']['codigo_validacao']) == trim($codigo)) { // Codigo válido if ($this->set_usuario_status($usuario['Usuario']['usuario_id'])) { $this->set_login($usuario['Usuario']['email'], $usuario['Usuario']['senha']); $return = array('mensagem' => NULL, 'acao' => 'box_complete_cadastro_1', 'valido' => true); } else { // Não deu pra alterar o status $return = array('mensagem' => 'Não foi possivel realizar a ativação do seu cadastro.', 'acao' => 'login_cadastro_ajax', 'valido' => false); } } else { // Codigo de validação inválido $return = array('mensagem' => 'Codigo de validação inválido.', 'acao' => 'login_cadastro_ajax', 'valido' => false); } } else { // Não existe o usuario $return = array('mensagem' => null, 'acao' => 'login_cadastro_ajax', 'valido' => false); } return $return; } /** * * envia email de validação de cadastro * @param $dados */ public function send_mail_validacao_cadastro($dados) { App::Import('Component', 'Email'); $email = new EmailComponent(); App::Import('Controller', 'Cadastro'); $cad = new CadastroController(); $emailU = $this->strToHex($dados['email']); $linkForm = "http://" . $_SERVER["SERVER_NAME"] . "?ativacao_cadastro=" . $dados['codigo'] . '&email=' . $emailU; $cad->set('nome', $dados['nome']); $cad->set('email', $dados['email']); $cad->set('senha', $dados['senha']); $cad->set('link', $linkForm); $cad->set('codigo', $dados['codigo']); $cad->set('email_title', 'Validação de cadastro'); $email->to = $dados['email']; $email->subject = 'JáCotei - Validação de Cadastro'; $email->layout = 'email/jacotei_email'; $email->template = 'cadastro'; // passa a referência para o component para poder renderizar o template certo $email->set_controller($cad); $email->send(); } /** * * @param string $nome * @param string $senha * @param string $email * @return bool */ public function sendEmailEsqueceuSenha($nome, $senha, $emailUser) { App::Import('Component', 'Email'); $email = new EmailComponent(); App::Import('Controller', 'Cadastro'); $cad = new CadastroController(); $cad->set('email_title', 'Solicitação de Senha'); $cad->set('cliente_nome', htmlentities($nome)); $cad->set('cliente_login', $emailUser); $cad->set('cliente_senha', $senha); $email->layout = 'email/jacotei_email'; $email->template = 'email_lembrete_senha'; $email->sendAs = 'both'; $email->to = $emailUser; $email->subject = 'Envio de Senha'; // passa a referência para o component para poder renderizar o template certo $email->set_controller($cad); $retorno = $email->send(); return $retorno; } /** * Verifica se o usuário está logado */ public function isLogged() { $retorno = (isset($_SESSION['user'])) ? $_SESSION['user'] : false; return $retorno; } /** * Gera um codigo de validação aleatório * @return string */ public function getCodigoValidacao() { //Random rand = new Random(); //int type, number; $password = ""; for ($i = 0; $i < 7; $i++) { $type = rand(0, 21) % 3; $number = rand(0, 25); if ($type == 1) { $password = $password . chr(48 + ($number % 10)); } else { if ($type == 2) { $password = $password . chr(65 + $number); } else { $password = $password . chr(97 + $number); } } } return $password; } public function alteraSenha($senhaAntiga, $novaSenha, $confirmaSenha) { App::Import('Model', 'Usuario'); $usr = new Usuario(); if ($_COOKIE['sid']) { $usuarioCookie = SessaoController::_consultaSessao($_COOKIE['sid']); } $usuario_id = $usuarioCookie->id; $usr->id = $usuarioCookie->id; $usuario = $usr->read(); $salt = "5a27c0945b15297b24272f5e6650c1280149f22c8b750d27cf0a2e3da4e4c120"; $senhaAntiga = hash('sha256', $salt.$senhaAntiga); if ($senhaAntiga == $usuario['Usuario']['senha']) { if ($novaSenha == $confirmaSenha) { $novaSenha = hash('sha256', $salt.$novaSenha); $usuario = array( 'Usuario' => array( 'usuario_id' => $usr->id, 'senha' => $novaSenha ) ); if ($usr->save($usuario)) { return array('mensagem' => NULL, 'acao' => true); } else { return array('mensagem' => 'Não foi possivel salvar sua nova senha', 'acao' => false); } } else { return array('mensagem' => 'As senhas não são iguais', 'acao' => false); } } else { return array('mensagem' => 'Por favor digite sua senha corretamente', 'acao' => false); } } public function strToHex($string) { $hex = ''; for ($i = 0; $i < strlen($string); $i++) { $hex .= dechex(ord($string[$i])); } return $hex; } public function hexToStr($hex) { $string = ''; for ($i = 0; $i < strlen($hex) - 1; $i+=2) { $string .= chr(hexdec($hex[$i] . $hex[$i + 1])); } return $string; } public function send_mail_validacao_novo_email($dados) { App::Import('Component', 'Email'); $email = new EmailComponent(); App::Import('Controller', 'Cadastro'); $cad = new CadastroController(); $emailU = $this->strToHex($dados['email']); $linkForm = "http://" . $_SERVER["SERVER_NAME"] . "?ativacao_cadastro=" . $dados['codigo'] . '&email=' . $emailU; $cad->set('nome', htmlentities($dados['nome'])); $cad->set('email', $dados['email']); $cad->set('senha', $dados['senha']); $cad->set('link', $linkForm); $cad->set('codigo', $dados['codigo']); $cad->set('email_title', 'Validação de cadastro'); $email->to = $dados['email']; $email->subject = 'JáCotei - Validação de Cadastro'; $email->layout = 'email/jacotei_email'; $email->template = 'cadastro'; // passa a referência para o component para poder renderizar o template certo $email->set_controller($cad); $email->send(); } }