PageRenderTime 64ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/library/oauth/SocialAuth.php

https://github.com/alugo/Goteo
PHP | 619 lines | 391 code | 74 blank | 154 comment | 64 complexity | 4a32712aa363a7ff2ef3752ec7570da0 MD5 | raw file
Possible License(s): AGPL-1.0
  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. //Includes all necessary files for oAuth
  21. $dir = dirname(__FILE__);
  22. include_once("$dir/epioauth/EpiCurl.php");
  23. include_once("$dir/epioauth/EpiOAuth.php");
  24. include_once("$dir/epioauth/EpiTwitter.php");
  25. include_once("$dir/linkedinoauth.php");
  26. include_once("$dir/facebook.class.php");
  27. include_once("$dir/openid.php");
  28. /**
  29. * Suportat:
  30. * OAuth o similar: twitter, facebook, linkedin
  31. * OpenId: google
  32. *
  33. * identities:
  34. * Google : https://www.google.com/accounts/o8/id
  35. * Google profile : http://www.google.com/profiles/~YOURUSERNAME
  36. * Yahoo : https://me.yahoo.com
  37. * AOL : https://www.aol.com
  38. * WordPress : http://YOURBLOG.wordpress.com
  39. * LiveJournal : http://www.livejournal.com/openid/server.bml
  40. * */
  41. class SocialAuth {
  42. public $host;
  43. public $callback_url;
  44. public $provider;
  45. public $original_provider;
  46. public $last_error = '';
  47. //datos que se recopilan
  48. public $user_data = array('username' => null, 'name' => null, 'email' => null, 'profile_image_url' => null, 'website' => null, 'about' => null, 'location'=>null,'twitter'=>null,'facebook'=>null,'google'=>null,'identica'=>null,'linkedin'=>null);
  49. //datos que se importaran (si se puede) a la tabla 'user'
  50. public $import_user_data = array('name', 'about', 'location', 'twitter', 'facebook', 'google', 'identica', 'linkedin');
  51. public $tokens = array('twitter'=>array('token'=>'','secret'=>''), 'facebook'=>array('token'=>'','secret'=>''), 'linkedin'=>array('token'=>'','secret'=>''), 'openid'=>array('token'=>'','secret'=>'')); //secretos generados en el oauth
  52. protected $twitter_id;
  53. protected $twitter_secret;
  54. protected $facebook_id;
  55. protected $facebook_secret;
  56. protected $linkedin_id;
  57. protected $linkedin_secret;
  58. protected $openid_secret;
  59. protected $openid_server;
  60. public $openid_public_servers = array(
  61. "Google" => "https://www.google.com/accounts/o8/id",
  62. "Yahoo" => "https://me.yahoo.com",
  63. "myOpenid" => "http://myopenid.com/",
  64. "AOL" => "https://www.aol.com",
  65. "Ubuntu" => "https://login.ubuntu.com",
  66. "LiveJournal" => "http://www.livejournal.com/openid/server.bml",
  67. );
  68. /**
  69. * @param $provider : 'twitter', 'facebook', 'linkedin', 'any_openid_server'
  70. * */
  71. function __construct($provider='') {
  72. $URL = (NODE_ID != GOTEO_NODE) ? NODE_URL : SITE_URL;
  73. $this->host = $URL;
  74. $this->callback_url = $URL . '/user/oauth?return=' . $provider;
  75. $this->twitter_id = OAUTH_TWITTER_ID;
  76. $this->twitter_secret = OAUTH_TWITTER_SECRET;
  77. $this->facebook_id = OAUTH_FACEBOOK_ID;
  78. $this->facebook_secret = OAUTH_FACEBOOK_SECRET;
  79. $this->linkedin_id = OAUTH_LINKEDIN_ID;
  80. $this->linkedin_secret = OAUTH_LINKEDIN_SECRET;
  81. $this->openid_secret = OAUTH_OPENID_SECRET;
  82. if(in_array($provider,array('twitter', 'facebook', 'linkedin'))) {
  83. $this->provider = $provider;
  84. $this->original_provider = $provider;
  85. }
  86. else {
  87. //OpenId providers
  88. $this->openid_server = $this->openid_public_servers[$provider];
  89. if(empty($this->openid_server)) $this->openid_server = $provider;
  90. $this->original_provider = $provider;
  91. $this->provider = 'openid';
  92. }
  93. }
  94. /**
  95. * conecta con el servicio de oauth, redirecciona a la pagina para la autentificacion
  96. * */
  97. public function authenticate() {
  98. switch ($this->provider) {
  99. case 'twitter':
  100. return $this->authenticateTwitter();
  101. break;
  102. case 'facebook':
  103. return $this->authenticateFacebook();
  104. break;
  105. case 'linkedin':
  106. return $this->authenticateLinkedin();
  107. break;
  108. case 'openid':
  109. return $this->authenticateOpenid();
  110. break;
  111. default:
  112. $this->last_error = 'oauth-unknown-provider';
  113. return false;
  114. }
  115. return true;
  116. }
  117. /**
  118. * Autentica con twitter, redirige a Twitter para que el usuario acepte
  119. * */
  120. public function authenticateOpenid() {
  121. try {
  122. $openid = new \LightOpenID($this->host);
  123. $openid->identity = $this->openid_server;
  124. //standard data provided
  125. $openid->required = array(
  126. 'namePerson/friendly',
  127. 'namePerson',
  128. 'namePerson/first',
  129. 'namePerson/last',
  130. 'contact/email',
  131. 'contact/country/home',
  132. //'pref/language'
  133. );
  134. $openid->returnUrl = $this->callback_url;
  135. $url = $openid->authUrl();
  136. header("Location: $url");
  137. exit;
  138. }
  139. catch(Exception $e){
  140. $this->last_error = $e->getMessage()." 1/ ".get_class($e);
  141. return false;
  142. }
  143. return true;
  144. }
  145. /**
  146. * Autentica con twitter, redirige a Twitter para que el usuario acepte
  147. * */
  148. public function authenticateTwitter() {
  149. try {
  150. $twitterObj = new \EpiTwitter($this->twitter_id, $this->twitter_secret);
  151. $url = $twitterObj->getAuthenticateUrl(null,array('oauth_callback' => $this->callback_url));
  152. header("Location: $url");
  153. exit;
  154. }
  155. catch(Exception $e){
  156. $this->last_error = $e->getMessage()." 1/ ".get_class($e);
  157. return false;
  158. }
  159. return true;
  160. }
  161. /**
  162. * Autentica con Facebook, redirige a Facebook para que el usuario acepte
  163. * */
  164. public function authenticateFacebook() {
  165. try {
  166. $obj = new \Facebook($this->facebook_id, $this->facebook_secret,$this->callback_url);
  167. $url = $obj->start(true,"email"); //Permisos que se solicitan, por ejemplo: user_about_me,email,offline_access
  168. header("Location: $url");
  169. exit;
  170. }
  171. catch(Exception $e){
  172. $this->last_error = $e->getMessage()." 1/ ".get_class($e);
  173. return false;
  174. }
  175. return true;
  176. }
  177. /**
  178. * Autentica con LinkedIn, redirige a LinkedIn para que el usuario acepte
  179. * */
  180. public function authenticateLinkedin() {
  181. try {
  182. //do the authentication:
  183. //get public tokens
  184. $to = new \LinkedInOAuth($this->linkedin_id, $this->linkedin_secret);
  185. // This call can be unreliable for some providers if their servers are under a heavy load, so
  186. // retry it with an increasing amount of back-off if there's a problem.
  187. $maxretrycount = 1;
  188. $retrycount = 0;
  189. while ($retrycount<$maxretrycount) {
  190. $tok = $to->getRequestToken($this->callback_url);
  191. if (isset($tok['oauth_token']) && isset($tok['oauth_token_secret']))
  192. break;
  193. $retrycount += 1;
  194. sleep($retrycount*5);
  195. }
  196. if(empty($tok['oauth_token']) || empty($tok['oauth_token_secret'])) {
  197. $this->last_error = "oauth-token-request-error";
  198. return false;
  199. }
  200. //en linkedin hay que guardar los token de autentificacion para usarlos
  201. //despues para obtener los tokens de acceso,
  202. $_SESSION['linkedin_token'] = $tok;
  203. //set URL
  204. $url = $to->getAuthorizeURL($tok['oauth_token']);
  205. header("Location: $url");
  206. exit;
  207. }
  208. catch(Exception $e){
  209. $this->last_error = $e->getMessage()." 1/ ".get_class($e);
  210. return false;
  211. }
  212. return true;
  213. }
  214. /**
  215. * obtención de datos en los proveedores de oauth mediante login con los tokens que se obtienen al retornar del authenticate
  216. * */
  217. public function login() {
  218. switch ($this->provider) {
  219. case 'twitter':
  220. return $this->loginTwitter();
  221. break;
  222. case 'facebook':
  223. return $this->loginFacebook();
  224. break;
  225. case 'linkedin':
  226. return $this->loginLinkedin();
  227. break;
  228. case 'openid':
  229. return $this->loginOpenid();
  230. break;
  231. }
  232. }
  233. /**
  234. * Login con facebook
  235. * */
  236. public function loginFacebook() {
  237. try {
  238. $obj = new \Facebook($this->facebook_id, $this->facebook_secret,$this->callback_url);
  239. $token = $obj->callback();
  240. if(!$token) {
  241. $this->last_error = "oauth-facebook-access-denied";
  242. return false;
  243. }
  244. $this->tokens['facebook']['token'] = $token;
  245. //print_R($token);
  246. //echo 'facebook_access_token: ' . $token;
  247. //guardar los tokens en la base datos si se quieren usar mas adelante!
  248. //con los tokens podems acceder a la info del user, hay que recrear el objecto con los tokens privados
  249. $res = json_decode($obj->makeRequest($token,"https://graph.facebook.com/me","GET"));
  250. if($res->error) {
  251. $this->last_error = $res->error->message;
  252. return false;
  253. }
  254. //ver todos los datos disponibles:
  255. //print_r($res);die;
  256. $this->user_data['name'] = $res->name;
  257. if($res->username) $this->user_data['username'] = $res->username;
  258. if($res->email) $this->user_data['email'] = $res->email;
  259. if($res->website) $this->user_data['website'] = $res->website; //ojo, pueden ser varias lineas con varias webs
  260. if($res->about) $this->user_data['about'] = $res->about;
  261. if($res->location->name) $this->user_data['location'] = $res->location->name;
  262. if($res->id) $this->user_data['profile_image_url'] = "http://graph.facebook.com/".$res->id."/picture?type=large";
  263. //facebook link
  264. if($res->link) $this->user_data['facebook'] = $res->link;
  265. return true;
  266. }
  267. catch(Exception $e){
  268. $this->last_error = $e->getMessage()." 1/ ".get_class($e);
  269. return false;
  270. }
  271. return true;
  272. }
  273. /**
  274. * Login con linkedin
  275. * */
  276. public function loginLinkedin() {
  277. try {
  278. //recuperar tokens de autentificacion
  279. $tok = $_SESSION['linkedin_token'];
  280. $to = new \LinkedInOAuth($this->linkedin_id, $this->linkedin_secret,$tok['oauth_token'],$tok['oauth_token_secret']);
  281. //obtenemos los tokens de acceso
  282. $tok = $to->getAccessToken($_GET['oauth_verifier']);
  283. //borramos los tokens de autentificacion de la session, ya no nos sirven
  284. //unset($_SESSION['linkedin_token']);
  285. if(empty($tok['oauth_token']) || empty($tok['oauth_token_secret'])) {
  286. $this->last_error = "oauth-linkedin-access-denied";
  287. return false;
  288. }
  289. //guardar los tokens en la base datos si se quieren usar mas adelante!
  290. //con los tokens podems acceder a la info del user, hay que recrear el objecto con los tokens privados
  291. $this->tokens['linkedin']['token'] = $tok['oauth_token'];
  292. $this->tokens['linkedin']['secret'] = $tok['oauth_token_secret'];
  293. $profile_result = $to->oAuthRequest('http://api.linkedin.com/v1/people/~:(id,first-name,last-name,summary,public-profile-url,picture-url,headline,interests,twitter-accounts,member-url-resources:(url),positions:(company),location:(name))');
  294. $profile_data = simplexml_load_string($profile_result);
  295. $this->user_data['name'] = trim($profile_data->{"first-name"} . " " . $profile_data->{"last-name"});
  296. if($profile_data->{"public-profile-url"}) {
  297. //linkedin link
  298. $this->user_data['linkedin'] = current($profile_data->{"public-profile-url"});
  299. //username from url
  300. $this->user_data['username'] = basename($this->user_data['linkedin']);
  301. }
  302. if($profile_data->{"member-url-resources"}->{"member-url"}) {
  303. $urls = array();
  304. foreach($profile_data->{"member-url-resources"}->{"member-url"} as $url) {
  305. $urls[] = current($url->url);
  306. }
  307. $this->user_data['website'] .= implode("\n",$urls);
  308. }
  309. if($profile_data->headline) $this->user_data['about'] = current($profile_data->headline);
  310. if($profile_data->location->name) $this->user_data['location'] = current($profile_data->location->name);
  311. if($profile_data->{"picture-url"}) $this->user_data['profile_image_url'] = current($profile_data->{"picture-url"});
  312. //si el usuario tiene especificada su cuenta twitter
  313. if($profile_data->{"twitter-accounts"}->{"twitter-account"}) $this->user_data['twitter'] = 'http://twitter.com/' . current($profile_data->{"twitter-accounts"}->{"twitter-account"}->{"provider-account-name"});
  314. //ver todos los datos disponibles:
  315. //print_r($profile_data);print_r($this->user_data);die;
  316. return true;
  317. }
  318. catch(Exception $e){
  319. $this->last_error = $e->getMessage()." 1/ ".get_class($e);
  320. return false;
  321. }
  322. return true;
  323. }
  324. /**
  325. * Login con twitter
  326. * */
  327. public function loginTwitter() {
  328. if($_GET['denied']) {
  329. //comprovar si el retorno contiene la variable de denegación
  330. $this->last_error = "oauth-twitter-access-denied";
  331. return false;
  332. }
  333. try {
  334. $twitterObj = new \EpiTwitter($this->twitter_id, $this->twitter_secret);
  335. $twitterObj->setToken($_GET['oauth_token']);
  336. $token = $twitterObj->getAccessToken();
  337. //print_R($token);
  338. //echo 'twitter_oauth_token: ' . $token->oauth_token . ' / twitter_oauth_token_secret: ' . $token->oauth_token_secret;
  339. //guardar los tokens en la base datos si se quieren usar mas adelante!
  340. //con los tokens podems acceder a la info del user, hay que recrear el objecto con los tokens privados
  341. $twitterObj = new \EpiTwitter($this->twitter_id, $this->twitter_secret,$token->oauth_token,$token->oauth_token_secret);
  342. $this->tokens['twitter']['token'] = $token->oauth_token;
  343. $this->tokens['twitter']['secret'] = $token->oauth_token_secret;
  344. $userInfo = $twitterObj->get_accountVerify_credentials();
  345. //Twitter NO RETORNA el email!!!
  346. $this->user_data['username'] = $userInfo->screen_name;
  347. $this->user_data['name'] = $userInfo->name;
  348. $this->user_data['profile_image_url'] = str_replace("_normal","",$userInfo->profile_image_url);
  349. //twitter link
  350. $this->user_data['twitter'] = 'http://twitter.com/'.$userInfo->screen_name;
  351. if($userInfo->url) $this->user_data['website'] = $userInfo->url;
  352. if($userInfo->location) $this->user_data['location'] = $userInfo->location;
  353. if($userInfo->description) $this->user_data['about'] = $userInfo->description;
  354. return true;
  355. }
  356. catch(Exception $e){
  357. $this->last_error = $e->getMessage()." 1/ ".get_class($e);
  358. return false;
  359. }
  360. return true;
  361. }
  362. /**
  363. * Login con openid
  364. * */
  365. public function loginOpenid() {
  366. $openid = new \LightOpenID($this->host);
  367. if($openid->mode) {
  368. if ($openid->mode == 'cancel') {
  369. $this->last_error = "oauth-openid-access-denied";
  370. return false;
  371. } elseif($openid->validate()) {
  372. $data = $openid->getAttributes();
  373. //print_r($data);print_r($openid);print_r($openid->identity);die;
  374. /*
  375. //por seguridad no aceptaremos conexions de OpenID que no nos devuelvan el email
  376. if(!Goteo\Library\Check::mail($data['contact/email'])) {
  377. $this->last_error = "oauth-openid-email-required";
  378. return false;
  379. }*/
  380. $this->user_data['email'] = $data['contact/email'];
  381. $this->user_data['username'] = $data['namePerson/friendly'];
  382. $this->user_data['name'] = $data['namePerson'];
  383. if(empty($this->user_data['name'])) $this->user_data['name'] = trim($data['namePerson/first'] . " " . $data['namePerson/last']);
  384. if($data['contact/country/home']) $this->user_data['location'] = $data['contact/country/home'];
  385. //no se usan tokens para openid, guardamos el servidor como token
  386. $this->tokens['openid']['token'] = $this->openid_server;
  387. //como secreto usaremos un hash basado an algo que sea unico para cada usuario (la identidad openid es una URL única)
  388. //$this->tokens['openid']['secret'] = sha1($this->openid_server.$this->openid_secret.$data['contact/email']);
  389. $this->tokens['openid']['secret'] = $openid->identity;
  390. return true;
  391. }
  392. else {
  393. $this->last_error = "oauth-openid-not-logged";
  394. return false;
  395. }
  396. }
  397. $this->last_error = "oauth-openid-not-logged";
  398. return false;
  399. }
  400. /**
  401. * Hace el login en goteo si es posible (existen tokens o el email es el mismo)
  402. * Guarda los tokens si se encuentra el usuario
  403. *
  404. * @param $force_login logea en goteo sin comprovar que la contraseña esté vacía o que el usuario este activo
  405. * */
  406. public function goteoLogin($force_login = false) {
  407. /*****
  408. * POSIBLE PROBLEMA:
  409. * en caso de que ya se haya dado permiso a la aplicación goteo,
  410. * el token da acceso al login del usuario aunque este haya cambiado el email en goteo.org
  411. * es un problema? o da igual...
  412. *****/
  413. //Comprovar si existe el mail en la base de datos
  414. $username = "";
  415. //comprovar si existen tokens
  416. $query = Goteo\Core\Model::query('SELECT id FROM user WHERE id = (SELECT user FROM user_login WHERE provider = :provider AND oauth_token = :token AND oauth_token_secret = :secret)', array(':provider' => $this->provider, ':token' => $this->tokens[$this->provider]['token'], ':secret' => $this->tokens[$this->provider]['secret']));
  417. $username = $query->fetchColumn();
  418. if(empty($username)) {
  419. //no existen tokens, comprovamos si existe el email
  420. /**
  421. * Problema de seguridad, si el proveedor openid nos indica un mail que no pertenece al usuario
  422. * da un método para acceder a los contenidos de cualquier usuario
  423. * por tanto, en caso de que no existan tokens, se deberá preguntar la contraseña al usuario
  424. * si el usuario no tiene contraseña, podemos permitir el acceso directo o denegarlo (mas seguro)
  425. * */
  426. $query = Goteo\Core\Model::query('SELECT id,password FROM user WHERE email = ?', array($this->user_data['email']));
  427. if($user = $query->fetchObject()) {
  428. $username = $user->id;
  429. //sin no existe contraseña permitimos acceso
  430. //if(!empty($user->password) && !$force_login) {
  431. //No permitimos acceso si no existe contraseña
  432. if(!$force_login) {
  433. //con contraseña lanzamos un error de usuario existente, se usará para mostrar un formulario donde preguntar el password
  434. $this->user_data['username'] = $username;
  435. $this->last_error = "oauth-goteo-user-password-exists";
  436. return false;
  437. }
  438. }
  439. else {
  440. //El usuario no existe
  441. //redirigir a user/confirm para mostrar un formulario para que el usuario compruebe/rellene los datos que faltan
  442. $this->last_error = "oauth-goteo-user-not-exists";
  443. return false;
  444. }
  445. }
  446. //si el usuario existe, actualizar o crear los tokens
  447. $this->saveTokensToUser($username);
  448. //actualizar la imagen de avatar si no tiene!
  449. if($this->user_data['profile_image_url']) {
  450. $query = Goteo\Core\Model::query('SELECT id FROM image WHERE id = (SELECT avatar FROM user WHERE id = ?)', array($username));
  451. if(!($query->fetchColumn())) {
  452. $img = new Goteo\Model\Image($this->user_data['profile_image_url']);
  453. $img->save();
  454. if($img->id) {
  455. Goteo\Core\Model::query("UPDATE user SET avatar = :avatar WHERE id = :user", array(':user'=>$username,':avatar'=>$img->id));
  456. }
  457. }
  458. }
  459. //el usuario existe, creamos el objeto
  460. $user = Goteo\Model\User::get($username);
  461. //actualizar datos de usuario si no existen:
  462. $update = array();
  463. $data = array(':user' => $username);
  464. foreach($this->import_user_data as $key) {
  465. if(empty($user->$key) && $this->user_data[$key]) {
  466. $update[] = "$key = :$key";
  467. $data[":$key"] = $this->user_data[$key];
  468. }
  469. }
  470. if($update) {
  471. Goteo\Core\Model::query("UPDATE user SET ".implode(", ",$update)." WHERE id = :user", $data);
  472. //rebuild user object
  473. $user = Goteo\Model\User::get($username);
  474. }
  475. //actualizar las webs
  476. if($this->user_data['website']) {
  477. $current_webs = array();
  478. if(is_array($user->webs)) {
  479. foreach($user->webs as $k => $v)
  480. $current_webs[] = strtolower($v->url);
  481. }
  482. $webs = array();
  483. preg_match_all("/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/", $this->user_data['website'], $webs);
  484. if($webs[0] && is_array($webs[0])) {
  485. $updated = false;
  486. foreach($webs[0] as $web) {
  487. $web = strtolower($web);
  488. if(!in_array($web,$current_webs)) {
  489. Goteo\Core\Model::query("INSERT user_web (user, url) VALUES (:user, :url)", array(':user' => $username, ':url' => $web));
  490. $updated = true;
  491. }
  492. }
  493. //rebuild user object
  494. if($updated) $user = Goteo\Model\User::get($username);
  495. }
  496. }
  497. //Si no tiene imagen, importar de gravatar.com?
  498. if(!$user->avatar || $user->avatar->id == 1) {
  499. $query = Goteo\Core\Model::query('SELECT id FROM image WHERE id = (SELECT avatar FROM user WHERE id = ?)', array($username));
  500. if(!($query->fetchColumn())) {
  501. $url = "http://www.gravatar.com/avatar/" . md5(strtolower(trim($user->email)));
  502. $url .= "?d=404";
  503. $img = new Goteo\Model\Image( $url );
  504. $img->save();
  505. if($img->id) {
  506. Goteo\Core\Model::query("UPDATE user SET avatar = :avatar WHERE id = :user", array(':user'=>$username,':avatar'=>$img->id));
  507. $user = Goteo\Model\User::get($username);
  508. }
  509. }
  510. }
  511. //CAMBIADO A: siempre login, aunque no esté activo el usuario
  512. //Iniciar sessión i redirigir
  513. $_SESSION['user'] = $user;
  514. //Guardar en una cookie la preferencia de "login with"
  515. //no servira para mostrar al usuario primeramente su opcion preferida
  516. setcookie("goteo_oauth_provider",$this->original_provider,time() + 3600*24*365);
  517. if (!empty($_POST['return'])) {
  518. throw new Goteo\Core\Redirection($_POST['return']);
  519. } elseif (!empty($_SESSION['jumpto'])) {
  520. $jumpto = $_SESSION['jumpto'];
  521. unset($_SESSION['jumpto']);
  522. throw new Goteo\Core\Redirection($jumpto);
  523. } else {
  524. throw new Goteo\Core\Redirection('/dashboard');
  525. }
  526. }
  527. /**
  528. * Guarda los tokens generados en el usuario
  529. * */
  530. public function saveTokensToUser($goteouser) {
  531. $query = Goteo\Core\Model::query('SELECT id FROM user WHERE id = ?', array($goteouser));
  532. if($id = $query->fetchColumn()) {
  533. foreach($this->tokens as $provider => $token) {
  534. if($token['token']) {
  535. $query = Goteo\Core\Model::query("REPLACE user_login (user,provider,oauth_token,oauth_token_secret) VALUES (:user,:provider,:token,:secret)",array(':user'=>$goteouser,':provider'=>$provider,':token'=>$token['token'],':secret'=>$token['secret']));
  536. }
  537. }
  538. }
  539. else {
  540. $this->last_error = "oauth-goteo-user-not-exists";
  541. return false;
  542. }
  543. }
  544. }
  545. ?>