1: <?php
2:
3: App::uses('CakeEmail', 'Network/Email');
4:
5: class AuthenticationController extends AppController {
6:
7: public $uses = array(
8: 'Authentication.AuthenticationUser',
9: 'Authentication.UserChangePassword',
10: 'Authentication.UserResetPassword',
11: 'Authentication.UserResetPasswordRequest',
12: 'Authentication.UserResetPasswordRequestSubmission',
13: );
14: public $components = array(
15: 'Session',
16: 'ExtendedScaffold.ScaffoldUtil',
17: );
18: public function login() {
19: if ($this->request->is('post')) {
20: if ($this->Auth->login()) {
21: return $this->redirect($this->Auth->redirect());
22: } else {
23: $this->Session->setFlash(__d('authentication','Username or password is incorrect'), 'default', array(), 'auth');
24: }
25: }
26: }
27:
28: public function logout() {
29: $this->redirect($this->Auth->logout());
30: }
31:
32: public function change_password() {
33: if ($this->request->isPost()) {
34: $this->request->data[$this->UserChangePassword->alias]['user_id'] = $this->Authentication->userId();
35: if ($this->UserChangePassword->save($this->data)) {
36: $this->flash('Senha alterada', $this->ScaffoldUtil->referer());
37: }
38: }
39: }
40:
41: public function reset_password($chave) {
42: $request = $this->UserResetPasswordRequest->findByChave($chave);
43: $user = $this->AuthenticationUser->findById(
44: $request['UserResetPasswordRequest']['user_id']
45: );
46:
47: $errorMessage = false;
48: if (empty($request)) {
49: $errorMessage = 'Não foi encontrada uma requisição de reset de senha com a chave informada.';
50: } else if ($request['UserResetPasswordRequest']['usado']) {
51: $errorMessage = 'A requisição de reset de senha indicada pela chave já foi utilizada anteriormente.';
52: } else if ($this->UserResetPasswordRequest->expired($request)) {
53: $errorMessage = 'A requisição de reset de senha indicada pela chave expirou.';
54: } else if (empty($user)) {
55: $errorMessage = 'Usuário não encontrado.';
56: } else if (!$user['AuthenticationUser']['active']) {
57: $errorMessage = 'Usuário encontra-se desabilitado no momento. Contate o administrador do sistema.';
58: }
59:
60: if ($errorMessage) {
61: $this->flash($errorMessage, array('action' => 'login'));
62: } else if ($this->request->isPost()) {
63: $this->request->data['UserResetPassword']['user_reset_password_request_id'] =
64: $request['UserResetPasswordRequest']['id'];
65: if ($this->UserResetPassword->save($this->request->data)) {
66: $this->flash('Senha resetada', array('action' => 'login'));
67: } else {
68: $this->Session->setFlash('Falha ao tentar resetar a senha.');
69: }
70: }
71:
72: $this->request->data['UserResetPassword']['username'] = $user['AuthenticationUser']['username'];
73: }
74:
75: public function reset_password_request() {
76: if ($this->request->isPost()) {
77: $this->UserResetPasswordRequestSubmission->set($this->request->data);
78: if ($this->UserResetPasswordRequestSubmission->validates()) {
79: $user = $this->UserResetPasswordRequestSubmission->getUser();
80: $userId = $user['AuthenticationUser']['id'];
81: if ($this->UserResetPasswordRequest->createNewRequest($userId)) {
82: $this->_sendUserResetPasswordRequestMail($this->UserResetPasswordRequest->id);
83: $this->flash("Um email foi enviado para \"{$user['AuthenticationUser']['email']}\" com instruções de como resetar sua senha.", array('action' => 'login'));
84: } else {
85: throw new Exception('Falha ao tentar salvar requisição de reset de senha: ' . print_r($request, true));
86: }
87: }
88: }
89: }
90:
91: private function _sendUserResetPasswordRequestMail($userResetPasswordRequestId) {
92: $userResetPasswordRequest = $this->UserResetPasswordRequest->findById($userResetPasswordRequestId);
93: if (empty($userResetPasswordRequest)) {
94: throw new Exception("Não foi encontrada uma requisição de reset de senha com id=$userResetPasswordRequestId");
95: }
96:
97: $user = $this->AuthenticationUser->findById(
98: $userResetPasswordRequest['UserResetPasswordRequest']['user_id']
99: );
100:
101: $email = new CakeEmail('default');
102: $email->emailFormat('html');
103: $email->template('Authentication.user_reset_password_request');
104: $email->to($user['AuthenticationUser']['email']);
105: $email->subject(__d('authentication','Reset Password Request'));
106: $email->viewVars(compact('userResetPasswordRequest', 'user'));
107: $email->send();
108: }
109:
110: }
111:
112: ?>
113: