PageRenderTime 150ms CodeModel.GetById 61ms app.highlight 58ms RepoModel.GetById 22ms app.codeStats 0ms

/controller/user.php

https://github.com/alugo/Goteo
PHP | 783 lines | 526 code | 90 blank | 167 comment | 130 complexity | 57be566eb863c1dd5b983e1b5cb40f69 MD5 | raw file
  1<?php
  2/*
  3 *  Copyright (C) 2012 Platoniq y Fundación Fuentes Abiertas (see README for details)
  4 *	This file is part of Goteo.
  5 *
  6 *  Goteo is free software: you can redistribute it and/or modify
  7 *  it under the terms of the GNU Affero General Public License as published by
  8 *  the Free Software Foundation, either version 3 of the License, or
  9 *  (at your option) any later version.
 10 *
 11 *  Goteo is distributed in the hope that it will be useful,
 12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 14 *  GNU Affero General Public License for more details.
 15 *
 16 *  You should have received a copy of the GNU Affero General Public License
 17 *  along with Goteo.  If not, see <http://www.gnu.org/licenses/agpl.txt>.
 18 *
 19 */
 20
 21namespace Goteo\Controller {
 22
 23    use Goteo\Core\Redirection,
 24        Goteo\Core\Error,
 25        Goteo\Core\View,
 26        Goteo\Model,
 27        Goteo\Library\Feed,
 28        Goteo\Library\Text,
 29        Goteo\Library\Message,
 30        Goteo\Library\Listing;
 31
 32    class User extends \Goteo\Core\Controller {
 33
 34        /**
 35         * Atajo al perfil de usuario.
 36         * @param string $id   Nombre de usuario
 37         */
 38        public function index($id, $show = '') {
 39            throw new Redirection('/user/profile/' . $id . '/' . $show, Redirection::PERMANENT);
 40        }
 41
 42        public function raw($id) {
 43            $user = Model\User::get($id, LANG);
 44            \trace($user);
 45            die;
 46        }
 47
 48        /**
 49         * Inicio de sesión.
 50         * Si no se le pasan parámetros carga el tpl de identificación.
 51         *
 52         * @param string $username Nombre de usuario
 53         * @param string $password Contraseña
 54         */
 55        public function login($username = '') {
 56
 57            // si venimos de la página de aportar
 58            if (isset($_POST['amount'])) {
 59                $_SESSION['invest-amount'] = $_POST['amount'];
 60                $msg = Text::get('user-login-required-login');
 61                $msg .= (!empty($_POST['amount'])) ? '. ' . Text::get('invest-alert-investing') . ' ' . $_POST['amount'] . '&euro;' : '';
 62                Message::Info($msg);
 63            }
 64
 65            if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['login'])) {
 66                $username = \strtolower($_POST['username']);
 67                $password = $_POST['password'];
 68                if (false !== ($user = (\Goteo\Model\User::login($username, $password)))) {
 69                    $_SESSION['user'] = $user;
 70                    
 71                    // creamos una cookie
 72                    setcookie("goteo_user", $user->id, time() + 3600 * 24 * 365);
 73                    
 74                    if (!empty($user->lang)) {
 75                        $_SESSION['lang'] = $user->lang;
 76                    }
 77                    unset($_SESSION['admin_menu']);
 78                    if (isset($user->roles['admin'])) {
 79                        // (Nodesys)
 80                    } else {
 81                        unset($_SESSION['admin_node']);
 82                    }
 83                    if (!empty($_REQUEST['return'])) {
 84                        throw new Redirection($_REQUEST['return']);
 85                    } elseif (!empty($_SESSION['jumpto'])) {
 86                        $jumpto = $_SESSION['jumpto'];
 87                        unset($_SESSION['jumpto']);
 88                        throw new Redirection($jumpto);
 89                    } elseif (isset($user->roles['admin']) || isset($user->roles['superadmin'])) {
 90                        throw new Redirection('/admin');
 91                    } else {
 92                        throw new Redirection('/dashboard');
 93                    }
 94                } else {
 95                    Message::Error(Text::get('login-fail'));
 96                }
 97            } elseif (empty($_SESSION['user']) && !empty($_COOKIE['goteo_user'])) {
 98                // si tenemos cookie de usuario
 99                return new View('view/user/login.html.php', array('username'=>$_COOKIE['goteo_user']));
100            }
101
102            return new View('view/user/login.html.php');
103        }
104
105        /**
106         * Cerrar sesión.
107         */
108        public function logout() {
109            $lang = '?lang=' . $_SESSION['lang'];
110            session_start();
111            session_unset();
112            session_destroy();
113            session_write_close();
114            session_regenerate_id(true);
115            throw new Redirection('/' . $lang);
116            die;
117        }
118
119        /**
120         * Registro de usuario.
121         */
122        public function register() {
123            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
124
125                foreach ($_POST as $key => $value) {
126                    $_POST[$key] = trim($value);
127                }
128
129                $errors = array();
130
131                if (strcmp($_POST['email'], $_POST['remail']) !== 0) {
132                    $errors['remail'] = Text::get('error-register-email-confirm');
133                }
134                if (strcmp($_POST['password'], $_POST['rpassword']) !== 0) {
135                    $errors['rpassword'] = Text::get('error-register-password-confirm');
136                }
137
138                $user = new Model\User();
139                $user->userid = $_POST['userid'];
140                $user->name = $_POST['username'];
141                $user->email = $_POST['email'];
142                $user->password = $_POST['password'];
143                $user->active = true;
144                $user->node = \NODE_ID;
145
146                $user->save($errors);
147
148                if (empty($errors)) {
149                    Message::Info(Text::get('user-register-success'));
150
151                    $_SESSION['user'] = Model\User::get($user->id);
152
153                    // creamos una cookie
154                    setcookie("goteo_user", $user->id, time() + 3600 * 24 * 365);
155
156                    if (!empty($_SESSION['jumpto'])) {
157                        $jumpto = $_SESSION['jumpto'];
158                        unset($_SESSION['jumpto']);
159                        throw new Redirection($jumpto);
160                    } else {
161                        throw new Redirection('/dashboard');
162                    }
163                } else {
164                    foreach ($errors as $field => $text) {
165                        Message::Error($text);
166                    }
167                }
168            }
169            return new View(
170                            'view/user/login.html.php',
171                            array(
172                                'errors' => $errors
173                            )
174            );
175        }
176
177        /**
178         * Registro de usuario desde oauth
179         */
180        public function oauth_register() {
181
182            //comprovar si venimos de un registro via oauth
183            if ($_POST['provider']) {
184
185                require_once OAUTH_LIBS;
186
187                $provider = $_POST['provider'];
188
189                $oauth = new \SocialAuth($provider);
190                //importar els tokens obtinguts anteriorment via POST
191                if ($_POST['tokens'][$oauth->provider]['token'])
192                    $oauth->tokens[$oauth->provider]['token'] = $_POST['tokens'][$oauth->provider]['token'];
193                if ($_POST['tokens'][$oauth->provider]['secret'])
194                    $oauth->tokens[$oauth->provider]['secret'] = $_POST['tokens'][$oauth->provider]['secret'];
195                //print_r($_POST['tokens']);print_R($oauth->tokens[$oauth->provider]);die;
196                $user = new Model\User();
197                $user->userid = $_POST['userid'];
198                $user->email = $_POST['email'];
199                $user->active = true;
200
201                //resta de dades
202                foreach ($oauth->user_data as $k => $v) {
203                    if ($_POST[$k]) {
204                        $oauth->user_data[$k] = $_POST[$k];
205                        if (in_array($k, $oauth->import_user_data))
206                            $user->$k = $_POST[$k];
207                    }
208                }
209                //si no existe nombre, nos lo inventamos a partir del userid
210                if (trim($user->name) == '')
211                    $user->name = ucfirst($user->userid);
212
213                //print_R($user);print_r($oauth);die;
214                //no hará falta comprovar la contraseña ni el estado del usuario
215                $skip_validations = array('password', 'active');
216
217                //si el email proviene del proveedor de oauth, podemos confiar en el y lo activamos por defecto
218                if ($_POST['provider_email'] == $user->email) {
219                    $user->confirmed = 1;
220                }
221                //comprovamos si ya existe el usuario
222                //en caso de que si, se comprovará que el password sea correcto
223                $query = Model\User::query('SELECT id,password,active FROM user WHERE email = ?', array($user->email));
224                if ($u = $query->fetchObject()) {
225                    if ($u->password == sha1($_POST['password'])) {
226                        //ok, login en goteo e importar datos
227                        //y fuerza que pueda logear en caso de que no esté activo
228                        if (!$oauth->goteoLogin(true)) {
229                            //si no: registrar errores
230                            Message::Error(Text::get($oauth->last_error));
231                        }
232                    } else {
233                        Message::Error(Text::get('login-fail'));
234                        return new View(
235                                        'view/user/confirm_account.html.php',
236                                        array(
237                                            'oauth' => $oauth,
238                                            'user' => Model\User::get($u->id)
239                                        )
240                        );
241                    }
242                } elseif ($user->save($errors, $skip_validations)) {
243                    //si el usuario se ha creado correctamente, login en goteo e importacion de datos
244                    //y fuerza que pueda logear en caso de que no esté activo
245                    if (!$oauth->goteoLogin(true)) {
246                        //si no: registrar errores
247                        Message::Error(Text::get($oauth->last_error));
248                    }
249                } elseif ($errors) {
250                    foreach ($errors as $err => $val) {
251                        if ($err != 'email' && $err != 'userid')
252                            Message::Error($val);
253                    }
254                }
255            }
256            return new View(
257                            'view/user/confirm.html.php',
258                            array(
259                                'errors' => $errors,
260                                'oauth' => $oauth
261                            )
262            );
263        }
264
265        /**
266         * Registro de usuario a traves de Oauth (libreria HybridOauth, openid, facebook, twitter, etc).
267         */
268        public function oauth() {
269
270            require_once OAUTH_LIBS;
271
272            $errors = array();
273            if (isset($_GET["provider"]) && $_GET["provider"]) {
274
275                $oauth = new \SocialAuth($_GET["provider"]);
276                if (!$oauth->authenticate()) {
277                    //si falla: error, si no siempre se redirige al proveedor
278                    Message::Error(Text::get($oauth->last_error));
279                }
280            }
281
282            //return from provider authentication
283            if (isset($_GET["return"]) && $_GET["return"]) {
284
285                //check twitter activation
286                $oauth = new \SocialAuth($_GET["return"]);
287
288                if ($oauth->login()) {
289                    //si ok: redireccion de login!
290                    //Message::Info("USER INFO:\n".print_r($oauth->user_data,1));
291                    //si es posible, login en goteo (redirecciona a user/dashboard o a user/confirm)
292                    //y fuerza que pueda logear en caso de que no esté activo
293                    if (!$oauth->goteoLogin()) {
294                        //si falla: error o formulario de confirmación
295                        if ($oauth->last_error == 'oauth-goteo-user-not-exists') {
296                            return new View(
297                                            'view/user/confirm.html.php',
298                                            array(
299                                                'oauth' => $oauth
300                                            )
301                            );
302                        } elseif ($oauth->last_error == 'oauth-goteo-user-password-exists') {
303                            Message::Error(Text::get($oauth->last_error));
304                            return new View(
305                                            'view/user/confirm_account.html.php',
306                                            array(
307                                                'oauth' => $oauth,
308                                                'user' => Model\User::get($oauth->user_data['username'])
309                                            )
310                            );
311                        }
312                        else
313                            Message::Error(Text::get($oauth->last_error));
314                    }
315                }
316                else {
317                    //si falla: error
318                    Message::Error(Text::get($oauth->last_error));
319                }
320            }
321
322            return new View(
323                            'view/user/login.html.php',
324                            array(
325                                'errors' => $errors
326                            )
327            );
328        }
329
330        /**
331         * Modificación perfil de usuario.
332         * Metodo Obsoleto porque esto lo hacen en el dashboard
333         */
334        public function edit() {
335            $user = $_SESSION['user'];
336
337            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
338
339                $errors = array();
340                // E-mail
341                if ($_POST['change_email']) {
342                    if (empty($_POST['user_nemail'])) {
343                        $errors['email'] = Text::get('error-user-email-empty');
344                    } elseif (!\Goteo\Library\Check::mail($_POST['user_nemail'])) {
345                        $errors['email'] = Text::get('error-user-email-invalid');
346                    } elseif (empty($_POST['user_remail'])) {
347                        $errors['email']['retry'] = Text::get('error-user-email-empty');
348                    } elseif (strcmp($_POST['user_nemail'], $_POST['user_remail']) !== 0) {
349                        $errors['email']['retry'] = Text::get('error-user-email-confirm');
350                    } else {
351                        $user->email = $_POST['user_nemail'];
352                    }
353                }
354                // Contraseña
355                if ($_POST['change_password']) {
356                    /*
357                     * Quitamos esta verificacion porque los usuarios que acceden mediante servicio no tienen contraseña
358                     *
359                      if(empty($_POST['user_password'])) {
360                      $errors['password'] = Text::get('error-user-password-empty');
361                      }
362                      else
363                     */
364                    if (!Model\User::login($user->id, $_POST['user_password'])) {
365                        $errors['password'] = Text::get('error-user-wrong-password');
366                    } elseif (empty($_POST['user_npassword'])) {
367                        $errors['password']['new'] = Text::get('error-user-password-empty');
368                    } elseif (!\Goteo\Library\Check::password($_POST['user_npassword'])) {
369                        $errors['password']['new'] = Text::get('error-user-password-invalid');
370                    } elseif (empty($_POST['user_rpassword'])) {
371                        $errors['password']['retry'] = Text::get('error-user-password-empty');
372                    } elseif (strcmp($_POST['user_npassword'], $_POST['user_rpassword']) !== 0) {
373                        $errors['password']['retry'] = Text::get('error-user-password-confirm');
374                    } else {
375                        $user->password = $_POST['user_npassword'];
376                    }
377                }
378                // Avatar
379                if (!empty($_FILES['user_avatar']['name'])) {
380                    $user->avatar = $_FILES['user_avatar'];
381                }
382
383                // tratar si quitan la imagen
384                if (!empty($_POST['avatar-' . $user->avatar->id . '-remove'])) {
385                    $user->avatar->remove('user');
386                    $user->avatar = '';
387                }
388
389                // Perfil público
390                $user->name = $_POST['user_name'];
391                $user->about = $_POST['user_about'];
392                $user->keywords = $_POST['user_keywords'];
393                $user->contribution = $_POST['user_contribution'];
394                $user->twitter = $_POST['user_twitter'];
395                $user->facebook = $_POST['user_facebook'];
396                $user->linkedin = $_POST['user_linkedin'];
397                // Intereses
398                $user->interests = $_POST['user_interests'];
399                // Páginas Web
400                if (!empty($_POST['user_webs']['remove'])) {
401                    $user->webs = array('remove' => $_POST['user_webs']['remove']);
402                } elseif (!empty($_POST['user_webs']['add']) && !empty($_POST['user_webs']['add'][0])) {
403                    $user->webs = array('add' => $_POST['user_webs']['add']);
404                } else {
405                    $user->webs = array('edit', $_POST['user_webs']['edit']);
406                }
407                if ($user->save($errors)) {
408                    // Refresca la sesión.
409                    $user = Model\User::flush();
410                    if (isset($_POST['save'])) {
411                        throw new Redirection('/dashboard');
412                    } else {
413                        throw new Redirection('/user/edit');
414                    }
415                }
416            }
417
418            return new View(
419                            'view/user/edit.html.php',
420                            array(
421                                'user' => $user,
422                                'errors' => $errors
423                            )
424            );
425        }
426
427        /**
428         * Perfil público de usuario.
429         *
430         * @param string $id    Nombre de usuario
431         */
432        public function profile($id, $show = 'profile', $category = null) {
433
434            if (!in_array($show, array('profile', 'investors', 'sharemates', 'message'))) {
435                $show = 'profile';
436            }
437
438            $user = Model\User::get($id, LANG);
439
440            if (!$user instanceof Model\User || $user->hide) {
441                throw new Error('404', Text::html('fatal-error-user'));
442            }
443
444            //--- para usuarios públicos---
445            if (empty($_SESSION['user'])) {
446                // la subpágina de mensaje también está restringida
447                if ($show == 'message') {
448                    $_SESSION['jumpto'] = '/user/profile/' . $id . '/message';
449                    Message::Info(Text::get('user-login-required-to_message'));
450                    throw new Redirection(SEC_URL."/user/login");
451                }
452
453
454                // a menos que este perfil sea de un vip, no pueden verlo
455                if (!isset($user->roles['vip'])) {
456                    $_SESSION['jumpto'] = '/user/profile/' . $id . '/' . $show;
457                    Message::Info(Text::get('user-login-required-to_see'));
458                    throw new Redirection(SEC_URL."/user/login");
459                }
460
461                /*
462                  // subpágina de cofinanciadores
463                  if ($show == 'investors') {
464                  Message::Info(Text::get('user-login-required-to_see-supporters'));
465                  throw new Redirection('/user/profile/' .  $id);
466                  }
467                 */
468            }
469            //--- el resto pueden seguir ---
470            // impulsor y usuario solamente pueden comunicarse si:
471            if ($show == 'message') {
472
473                $is_author   = false; // si es autor de un proyecto publicado
474                $is_investor = false; // si es cofinanciador
475                $is_messeger = false; // si es participante
476
477                // si el usuario logueado es impulsor (autro de proyecto publicado
478                $user_created = Model\Project::ofmine($_SESSION['user']->id, true);
479                if (!empty($user_created)) {
480                    $is_author = true;
481                }
482
483                // si el usuario del perfil es cofin. o partic.
484                // proyectos que es cofinanciador este usuario (el del perfil)
485                $user_invested = Model\User::invested($id, true);
486                foreach ($user_invested as $a_project) {
487                    if ($a_project->owner == $_SESSION['user']->id) {
488                        $is_investor = true;
489                        break;
490                    }
491                }
492
493                // proyectos que es participante este usuario (el del perfil) (que ha enviado algún mensaje)
494                $user_messeged = Model\Message::getMesseged($id, true);
495                foreach ($user_messeged as $a_project) {
496                    if ($a_project->owner == $_SESSION['user']->id) {
497                        $is_messeger = true;
498                        break;
499                    }
500                }
501
502
503                // si el usuario logueado es el usuario cofin./partic.
504                // si el usuario del perfil es impulsor de un proyecto cofinanciado o en el que ha participado
505                // proyectos que es cofinanciador el usuario logueado
506                $user_invested = Model\User::invested($_SESSION['user']->id, true);
507                foreach ($user_invested as $a_project) {
508                    if ($a_project->owner == $id) {
509                        $is_investor = true;
510                        break;
511                    }
512                }
513
514                // proyectos que es participante el usuario logueado (que ha enviado algún mensaje)
515                $user_messeged = Model\Message::getMesseged($_SESSION['user']->id, true);
516                foreach ($user_messeged as $a_project) {
517                    if ($a_project->owner == $id) {
518                        $is_messeger = true;
519                        break;
520                    }
521                }
522
523                if (!$is_investor && !$is_messeger && !$is_author) {
524                    Message::Info(Text::get('user-message-restricted'));
525                    throw new Redirection('/user/profile/' . $id);
526                } else {
527                    $_SESSION['message_autorized'] = true;
528                }
529            }
530
531		// vip profile
532            $viewData = array();
533            $viewData['user'] = $user;
534
535            $projects = Model\Project::ofmine($id, true);
536            $viewData['projects'] = $projects;
537
538            //mis cofinanciadores
539            // array de usuarios con:
540            //  foto, nombre, nivel, cantidad a mis proyectos, fecha ultimo aporte, nº proyectos que cofinancia
541            $investors = array();
542            foreach ($projects as $kay => $project) {
543
544                // quitamos los caducados
545                if ($project->status == 0) {
546                    unset($projects[$kay]);
547                    continue;
548                }
549
550                foreach (Model\Invest::investors($project->id) as $key => $investor) {
551                    // convocadores no, gracias
552                    if (!empty($investor->campaign))
553                        continue;
554
555                    if (\array_key_exists($investor->user, $investors)) {
556                        // ya está en el array, quiere decir que cofinancia este otro proyecto
557                        // , añadir uno, sumar su aporte, actualizar la fecha
558                        ++$investors[$investor->user]->projects;
559                        $investors[$investor->user]->amount += $investor->amount;
560                        $investors[$investor->user]->date = $investor->date;
561                    } else {
562                        $investors[$investor->user] = (object) array(
563                            'user' => $investor->user,
564                            'name' => $investor->name,
565                            'projects' => 1,
566                            'avatar' => $investor->avatar,
567                            'worth' => $investor->worth,
568                            'amount' => $investor->amount,
569                            'date' => $investor->date
570                        );
571                    }
572                }
573            }
574
575            $viewData['investors'] = $investors;
576
577            // comparten intereses
578            $viewData['shares'] = Model\User\Interest::share($id, $category);
579            if ($show == 'sharemates' && empty($viewData['shares'])) {
580                $show = 'profile';
581            }
582
583            if (!empty($category)) {
584                $viewData['category'] = $category;
585            }
586
587            // proyectos que cofinancio
588            $invested = Model\User::invested($id, true);
589
590            // agrupacion de proyectos que cofinancia y proyectos suyos
591            $viewData['lists'] = array();
592            if (!empty($invested)) {
593                $viewData['lists']['invest_on'] = Listing::get($invested, 2);
594            }
595            if (!empty($projects)) {
596                $viewData['lists']['my_projects'] = Listing::get($projects, 2);
597            }
598
599            return new View ('view/user/'.$show.'.html.php', $viewData);
600        }
601
602        /**
603         * Activación usuario.
604         *
605         * @param type string	$token
606         */
607        public function activate($token) {
608            $query = Model\User::query('SELECT id FROM user WHERE token = ?', array($token));
609            if ($id = $query->fetchColumn()) {
610                $user = Model\User::get($id);
611                if (!$user->confirmed) {
612                    $user->confirmed = true;
613                    $user->active = true;
614                    if ($user->save($errors)) {
615                        Message::Info(Text::get('user-activate-success'));
616                        $_SESSION['user'] = $user;
617
618                        // Evento Feed
619                        $log = new Feed();
620                        $log->setTarget($user->id, 'user');
621                        $log->populate('nuevo usuario registrado (confirmado)', '/admin/users', Text::html('feed-new_user', Feed::item('user', $user->name, $user->id)));
622                        $log->doAdmin('user');
623
624                        // evento público
625                        $log->title = $user->name;
626                        $log->url = null;
627                        $log->doPublic('community');
628
629                        unset($log);
630                    } else {
631                        Message::Error($errors);
632                    }
633                } else {
634                    Message::Info(Text::get('user-activate-already-active'));
635                }
636            } else {
637                Message::Error(Text::get('user-activate-fail'));
638            }
639            throw new Redirection('/dashboard');
640        }
641
642        /**
643         * Cambiar dirección de correo.
644         *
645         * @param type string	$token
646         */
647        public function changeemail($token) {
648            $token = base64_decode($token);
649            if (count(explode('¬', $token)) > 1) {
650                $query = Model\User::query('SELECT id FROM user WHERE token = ?', array($token));
651                if ($id = $query->fetchColumn()) {
652                    $user = Model\User::get($id);
653                    $user->email = $token;
654                    $errors = array();
655                    if ($user->save($errors)) {
656                        Message::Info(Text::get('user-changeemail-success'));
657
658                        // Refresca la sesión.
659                        Model\User::flush();
660                    } else {
661                        Message::Error($errors);
662                    }
663                } else {
664                    Message::Error(Text::get('user-changeemail-fail'));
665                }
666            } else {
667                Message::Error(Text::get('user-changeemail-fail'));
668            }
669            throw new Redirection('/dashboard');
670        }
671
672        /**
673         * Recuperacion de contraseña
674         * - Si no llega nada, mostrar formulario para que pongan su username y el email correspondiente
675         * - Si llega post es una peticion, comprobar que el username y el email que han puesto son válidos
676         *      si no lo son, dejarlos en el formulario y mensaje de error
677         *      si son válidos, enviar email con la url y mensaje de ok
678         *
679         * - Si llega un hash, verificar y darle acceso hasta su dashboard /profile/access para que la cambien
680         *
681         * @param string $token     Codigo
682         */
683        public function recover($token = null) {
684
685            // si el token mola, logueo este usuario y lo llevo a su dashboard
686            if (!empty($token)) {
687                $token = base64_decode($token);
688                $parts = explode('¬', $token);
689                if (count($parts) > 1) {
690                    $query = Model\User::query('SELECT id FROM user WHERE email = ? AND token = ?', array($parts[1], $token));
691                    if ($id = $query->fetchColumn()) {
692                        if (!empty($id)) {
693                            // el token coincide con el email y he obtenido una id
694                            Model\User::query('UPDATE user SET active = 1 WHERE id = ?', array($id));
695                            $user = Model\User::get($id);
696                            $_SESSION['user'] = $user;
697                            $_SESSION['recovering'] = $user->id;
698                            throw new Redirection(SEC_URL.'/dashboard/profile/access/recover#password');
699                        }
700                    }
701                }
702
703                $error = Text::get('recover-token-incorrect');
704            }
705
706		// password recovery only by email
707            if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['recover'])) {
708                $email = $_POST['email'];
709                if (!empty($email) && Model\User::recover($email)) {
710                    $message = Text::get('recover-email-sended');
711                    unset($_POST['email']);
712                } else {
713                    $error = Text::get('recover-request-fail');
714                }
715            }
716
717            return new View(
718                            'view/user/recover.html.php',
719                            array(
720                                'error' => $error,
721                                'message' => $message
722                            )
723            );
724        }
725
726        /**
727         * Darse de baja
728         * - Si no llega nada, mostrar formulario para que pongan el email de su cuenta
729         * - Si llega post es una peticion, comprobar que el email que han puesto es válido
730         *      si no es, dejarlos en el formulario y mensaje de error
731         *      si es válido, enviar email con la url y mensaje de ok
732         *
733         * - Si llega un hash, verificar y dar de baja la cuenta (desactivar y ocultar)
734         *
735         * @param string $token     Codigo
736         */
737        public function leave($token = null) {
738
739            // si el token mola, lo doy de baja
740            if (!empty($token)) {
741                $token = base64_decode($token);
742                $parts = explode('¬', $token);
743                if (count($parts) > 1) {
744                    $query = Model\User::query('SELECT id FROM user WHERE email = ? AND token = ?', array($parts[1], $token));
745                    if ($id = $query->fetchColumn()) {
746                        if (!empty($id)) {
747                            // el token coincide con el email y he obtenido una id
748                            if (Model\User::cancel($id)) {
749                                Message::Info(Text::get('leave-process-completed'));
750                                throw new Redirection(SEC_URL.'/user/login');
751                            } else {
752                                Message::Error(Text::get('leave-process-fail'));
753                                throw new Redirection(SEC_URL.'/user/login');
754                            }
755                        }
756                    }
757                }
758
759                $error = Text::get('leave-token-incorrect');
760            }
761
762            if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['leaving'])) {
763                if (Model\User::leaving($_POST['email'], $_POST['reason'])) {
764                    $message = Text::get('leave-email-sended');
765                    unset($_POST['email']);
766                    unset($_POST['reason']);
767                } else {
768                    $error = Text::get('leave-request-fail');
769                }
770            }
771
772            return new View(
773                            'view/user/leave.html.php',
774                            array(
775                                'error' => $error,
776                                'message' => $message
777                            )
778            );
779        }
780
781    }
782
783}