PageRenderTime 23ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/Controller/UsersController.php

http://github.com/CauanCabral/Comitiva
PHP | 471 lines | 339 code | 93 blank | 39 comment | 46 complexity | 42536d444d36976f664d35ead62770a2 MD5 | raw file
  1. <?php
  2. class UsersController extends AppController
  3. {
  4. public $name = 'Users';
  5. public $helpers = array('Locale.Locale');
  6. public $components = array('Search.Prg');
  7. public $presetVars = array(
  8. array('field' => 'query', 'type' => 'value')
  9. );
  10. /***********************
  11. * Ações publicas
  12. ***********************/
  13. public function login()
  14. {
  15. if(!empty($this->activeUser))
  16. {
  17. $this->__setFlash('Você está autenticado', 'success');
  18. $this->redirect($this->Auth->redirect());
  19. }
  20. if ($this->request->is('post'))
  21. {
  22. if ($this->Auth->login())
  23. {
  24. $this->activeUser = $this->Auth->user();
  25. // verifica se usuário logado está ativo
  26. if(empty($this->activeUser['active']))
  27. {
  28. $this->__setFlash('Você precisa ativar sua conta. Verifique seu email por favor.', 'alert');
  29. $this->redirect($this->Auth->logout());
  30. }
  31. $now = new DateTime();
  32. $this->User->id = $this->activeUser['id'];
  33. $this->User->saveField('last_access', $now->format("Y-m-d H:i:s"));
  34. $this->__setFlash('Você está autenticado', 'success');
  35. $this->redirect($this->Auth->redirect());
  36. }
  37. $this->__setFlash('Usuário ou senha incorreto', 'error');
  38. }
  39. }
  40. public function logout()
  41. {
  42. $this->__setFlash('Você saiu do sistema', 'success');
  43. $this->redirect($this->Auth->logout());
  44. }
  45. public function recover()
  46. {
  47. if (!empty($this->request->data))
  48. {
  49. $userData = $this->User->find(
  50. 'first',
  51. array(
  52. 'conditions' => array(
  53. 'User.email' => $this->request->data['User']['email']
  54. ),
  55. 'contains' => array()
  56. )
  57. );
  58. if(!empty($userData))
  59. {
  60. $this->__sendLinkToMail($userData);
  61. return;
  62. }
  63. $this->__setFlash('Endereço de email não cadastrado', 'error');
  64. return;
  65. }
  66. }
  67. public function reset_password($secureHash = '')
  68. {
  69. if(!empty($secureHash))
  70. {
  71. $this->set('secureHash', $secureHash);
  72. $userToAlter = $this->User->find(
  73. 'first',
  74. array(
  75. 'conditions' => array(
  76. 'User.token' => $secureHash
  77. ),
  78. 'recursive' => -1
  79. )
  80. );
  81. if(empty($userToAlter))
  82. {
  83. $this->__setFlash('Token fornecido inválido. Verique o endereço acessado, por favor.', 'error');
  84. $this->redirect('/');
  85. }
  86. $this->set('user_id', $userToAlter['User']['id']);
  87. if(!empty($this->request->data) && $this->request->data['User']['id'] == $userToAlter['User']['id'])
  88. {
  89. $toSave = array(
  90. 'id' => $userToAlter['User']['id'],
  91. 'token' => null,
  92. 'token_expires_at' => null,
  93. 'password' => $this->request->data['User']['password']
  94. );
  95. if($this->User->save($toSave, array('validate' => false)))
  96. {
  97. $this->__setFlash('Senha atualizada. Agora você já pode fazer seu login com a nova senha.', 'success');
  98. $this->redirect(array('action' => 'login'));
  99. }
  100. $this->__setFlash('Falha ao atualizar senha. Tente novamente.');
  101. return;
  102. }
  103. }
  104. }
  105. public function account_create()
  106. {
  107. if (!empty($this->request->data))
  108. {
  109. // define grupo inicial do usuário
  110. $this->request->data['User']['groups'] = json_encode(array('participant'));
  111. if($this->User->save($this->request->data))
  112. {
  113. if($this->__sendAccountConfirmMail($this->User->read()))
  114. {
  115. $this->redirect('login');
  116. }
  117. }
  118. if(isset($this->request->data['User']['password']))
  119. unset($this->request->data['User']['password']);
  120. if(isset($this->request->data['User']['password_confirm']))
  121. unset($this->request->data['User']['password_confirm']);
  122. $this->__setFlash('Não foi possível criar a conta. Verifique os dados inseridos.', 'alert');
  123. }
  124. }
  125. public function account_confirm($hash = null,$user)
  126. {
  127. if(isset($hash) && isset($user))
  128. {
  129. $this->User->contain();
  130. $userData = $this->User->find('first', array(
  131. 'conditions' => array(
  132. 'username' => $user
  133. ),
  134. 'fields' => array('id', 'active', 'account_validation_token', 'account_validation_expires_at')
  135. ));
  136. if($userData['User']['active'])
  137. {
  138. $this->__setFlash('Seu cadastro já foi verificado');
  139. $this->redirect('/');
  140. }
  141. $expiresAt = new DateTime($userData['User']['account_validation_expires_at']);
  142. $now = date('U');
  143. if($expiresAt->format('U') < $now)
  144. {
  145. $this->__setFlash('Seu cadastro expirou. Você pode criar uma nova conta se desejar.', 'error');
  146. $this->User->delete($userData['User']['id']);
  147. $this->redirect('/');
  148. }
  149. if($userData['User']['account_validation_token'] == $hash)
  150. {
  151. $toSave = array(
  152. 'id' => $userData['User']['id'],
  153. 'account_validation_token' => null,
  154. 'account_validation_expires_at' => null,
  155. 'active' => true
  156. );
  157. $this->User->create();
  158. if($this->User->save($toSave) === false)
  159. {
  160. $this->__setFlash('Houve uma falha ao confirmar sua conta. Por favor, contacte o suporte', 'error');
  161. $this->redirect('/');
  162. }
  163. $this->__setFlash('Cadastro Verificado com Sucesso!', 'success');
  164. $this->redirect('/');
  165. }
  166. $this->__setFlash('Código de verificação inválido!', 'error');
  167. $this->redirect('/');
  168. }
  169. $this->__setFlash('Endereço inválido!', 'error');
  170. $this->redirect('/');
  171. }
  172. /*******************
  173. * Admin actions
  174. ******************/
  175. public function admin_profile()
  176. {
  177. $this->render('profile');
  178. }
  179. public function admin_index()
  180. {
  181. $this->User->recursive = 0;
  182. $this->Prg->commonProcess();
  183. $this->paginate['conditions'] = $this->User->parseCriteria($this->passedArgs);
  184. $this->set('users', $this->paginate());
  185. }
  186. public function admin_view($id = null)
  187. {
  188. if (!$id)
  189. {
  190. $this->__setFlash('Usuário inválido', 'error');
  191. $this->redirect(array('action' => 'index'));
  192. }
  193. $this->set('user', $this->User->find(
  194. 'first',
  195. array(
  196. 'conditions' => array(
  197. 'User.id' => $id
  198. ),
  199. 'recursive' => 2
  200. )
  201. )
  202. );
  203. }
  204. public function admin_add()
  205. {
  206. if (!empty($this->request->data))
  207. {
  208. // default, all admin added user has confirmed
  209. $this->request->data['User']['active'] = true;
  210. // default group (all user are in participant group
  211. $groups = array();
  212. if(is_array($this->request->data['User']['groups']) && !empty($this->request->data['User']['groups']))
  213. {
  214. $groups = array_merge($groups, $this->request->data['User']['groups']);
  215. }
  216. $this->request->data['User']['groups'] = json_encode($groups);
  217. if ($this->User->save($this->request->data))
  218. {
  219. $this->__setFlash('Usuário adicionado', 'success');
  220. $this->redirect(array('action' => 'index'));
  221. }
  222. if(isset($this->request->data['User']['password']))
  223. unset($this->request->data['User']['password']);
  224. if(isset($this->request->data['User']['password_confirm']))
  225. unset($this->request->data['User']['password_confirm']);
  226. $this->request->data['User']['groups'] = json_decode($this->request->data['User']['groups'], true);
  227. $this->__setFlash('Usuário não pode ser salvo. Tente novamente, por favor.', 'alert');
  228. }
  229. }
  230. public function admin_edit($id = null)
  231. {
  232. if (!$id && empty($this->request->data))
  233. {
  234. $this->__setFlash('Usuário inválido', 'error');
  235. $this->redirect(array('action' => 'index'));
  236. }
  237. if (!empty($this->request->data))
  238. {
  239. $this->request->data['User']['groups'] = json_encode($this->request->data['User']['groups']);
  240. if ($this->User->save($this->request->data))
  241. {
  242. // se o admin está editando sua própria conta
  243. if($this->request->data['User']['id'] == $this->activeUser['id'])
  244. {
  245. // recarrega suas informações
  246. $this->__reloadUserInfo();
  247. }
  248. $this->__setFlash('Usuário salvo', 'success');
  249. $this->__goBack();
  250. }
  251. $this->request->data['User']['groups'] = json_decode($this->request->data['User']['groups'], true);
  252. $this->__setFlash('Não foi possível salvar a alteração. Tente novamente, por favor.', 'alert');
  253. }
  254. if (empty($this->request->data))
  255. {
  256. $this->request->data = $this->User->read(null, $id);
  257. $this->request->data['User']['groups'] = json_decode($this->request->data['User']['groups']);
  258. }
  259. }
  260. public function admin_delete($id = null)
  261. {
  262. if (!$id)
  263. {
  264. $this->__setFlash('Usuário inválido', 'error');
  265. $this->redirect(array('action'=>'index'));
  266. }
  267. if ($this->User->delete($id))
  268. {
  269. $this->__setFlash('Usuário removido', 'success');
  270. $this->redirect(array('action'=>'index'));
  271. }
  272. $this->__setFlash('Usuário não pode ser removido', 'error');
  273. $this->redirect(array('action' => 'index'));
  274. }
  275. /***************************
  276. * Participant actions
  277. ***************************/
  278. public function participant_profile()
  279. {
  280. $this->set('user', $this->activeUser['id']);
  281. $this->render('profile');
  282. }
  283. public function participant_edit()
  284. {
  285. if(!empty($this->request->data))
  286. {
  287. $this->request->data['User']['id'] = $this->activeUser['id'];
  288. $this->request->data['User']['username'] = $this->activeUser['username'];
  289. if($this->User->save($this->request->data))
  290. {
  291. $this->__reloadUserInfo();
  292. $this->__setFlash('Dados Atualizados!', 'success');
  293. $this->redirect('/');
  294. }
  295. $this->__setFlash('Erro ao Atualizar Dados', 'alert');
  296. }
  297. $this->request->data = $this->User->read(null, $this->activeUser['id']);
  298. }
  299. /***************************
  300. * Auxiliar methods
  301. **************************/
  302. /**
  303. * Recupera informações atualizadas do usuário logado e salva na seção
  304. * os novos valores
  305. *
  306. * @return void
  307. */
  308. protected function __reloadUserInfo()
  309. {
  310. $user = $this->User->read(null, $this->activeUser['id']);
  311. unset($user['User']['password'], $user['User']['token'], $user['User']['account_validation_token']);
  312. // escreve trecho pertinente da sessão
  313. $this->Session->write('Auth.User', $user['User']);
  314. }
  315. /**
  316. * Envia um email para o endereço associado ao usuário
  317. * com informações para recuperação da senha
  318. *
  319. * @param array $userData
  320. * @return bool
  321. */
  322. protected function __sendLinkToMail($userData)
  323. {
  324. $secureHash = sha1($userData['User']['password'] . time());
  325. $d = new DateTime();
  326. $d->modify('+1 day');
  327. $token_expires = $d->format('Y-m-d H:i:s');
  328. $success = $this->User->save(
  329. array('id' => $userData['User']['id'], 'token' => $secureHash, 'token_expires_at' => $token_expires)
  330. );
  331. $this->set('user', $userData['User']['name']);
  332. $this->set('token', $secureHash);
  333. if($success)
  334. {
  335. $sub = '[' . Configure::read('Comitiva.name') . ' - Inscrições] Pedido para recuperar senha';
  336. if($this->__sendMailNotification($userData['User']['email'], $sub, 'reset_password'))
  337. {
  338. $this->__setFlash('Instruções para redefinir a senha foram enviadas para seu email cadastrado', 'alert');
  339. return;
  340. }
  341. }
  342. $this->__setFlash(sprintf('Não foi possível iniciar processo para rercuperação da senha. Entre em contato através do email %s para obter ajuda', Configure::read('Message.from')), 'error');
  343. }
  344. /**
  345. * Envia um email para o usuário com os dados de sua conta
  346. * não inclui senha
  347. *
  348. * @param array $userData
  349. * @return bool
  350. */
  351. protected function __sendAccountConfirmMail($userData)
  352. {
  353. $d = new DateTime();
  354. $d->modify('+1 day');
  355. $token = sha1(md5($this->request->data['User']['password']) . time());
  356. $this->User->create();
  357. $success = $this->User->save(
  358. array('id' => $userData['User']['id'], 'account_validation_token' => $token, 'account_validation_expires_at' => $d->format('Y-m-d H:i:s'))
  359. );
  360. $this->set('user', $userData['User']);
  361. $this->set('token', $token);
  362. if($success)
  363. {
  364. $sub = '[' . Configure::read('Comitiva.name') . ' - Inscrições] Confirmação de conta';
  365. if($this->__sendMailNotification($userData['User']['email'], $sub, 'account_confirm'))
  366. {
  367. $this->__setFlash('Foi enviado um email para confirmação da sua conta', 'info');
  368. return true;
  369. }
  370. }
  371. else
  372. {
  373. $this->User->delete($userData['User']['id']);
  374. }
  375. $this->__setFlash(sprintf(__('Não foi possível enviar o email de confirmação da conta para seu endereço. Entre em contato através do email %s para obter ajuda'), Configure::read('Message.replyTo')), 'error');
  376. return false;
  377. }
  378. }