Guest User

Untitled

a guest
Jul 29th, 2022
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.58 KB | None | 0 0
  1. <?php
  2.  
  3. /* --------------------------------------------------------------------
  4.  
  5. Chevereto
  6. https://chevereto.com/
  7.  
  8. @author Rodolfo Berrios A. <http://rodolfoberrios.com/>
  9.  
  10. Copyright (C) Rodolfo Berrios A. All rights reserved.
  11.  
  12. BY USING THIS SOFTWARE YOU DECLARE TO ACCEPT THE CHEVERETO EULA
  13. https://chevereto.com/license
  14.  
  15. --------------------------------------------------------------------- */
  16.  
  17. use Abraham\TwitterOAuth\TwitterOAuth;
  18.  
  19. $route = function ($handler) {
  20. if (!CHV\Login::isPi()) {
  21. echo 'Route not available until the system update gets installed.';
  22. die();
  23. }
  24.  
  25. $doing = $handler->request[0];
  26.  
  27. if (!in_array($doing, ['google', 'facebook', 'twitter', 'vk'])) {
  28. return $handler->issue404();
  29. }
  30.  
  31. $logged_user = CHV\Login::getUser();
  32.  
  33. // User status override redirect
  34. CHV\User::statusRedirect($logged_user['status'] ?? null);
  35.  
  36. // Detect return _REQUEST
  37. if ($_REQUEST['return']) {
  38. $_SESSION['connect_return'] = $_REQUEST['return'];
  39. }
  40.  
  41. // Forbidden connection
  42. if (!CHV\getSetting($doing)) {
  43. return $handler->issue404();
  44. }
  45.  
  46. $cookieName = CHV\Login::getSocialCookieName($doing);
  47.  
  48. if ($logged_user) {
  49. $validate = CHV\Login::validateCookie($cookieName);
  50. $login_cookies = CHV\Login::getSession()['login_cookies'];
  51. if (
  52. isset($logged_user['login']['cookie_' . $doing])
  53. && $validate['valid']
  54. && in_array($validate['login_id'], $login_cookies)
  55. ) {
  56. G\redirect($logged_user['url'] . '?conn');
  57. return;
  58. }
  59. $logged_doing = $logged_user['login'][$doing][0] ?? null;
  60. $token = $logged_doing['token_hash'] ?? null;
  61. $secret = $logged_doing['secret'] ?? null;
  62. }
  63.  
  64. /**
  65. * @var bool TRUE to INSERT a new login $doing
  66. */
  67. $do_insert = false;
  68.  
  69. /**
  70. * @var bool TRUE to INSERT a new cookie_$doing
  71. */
  72. $do_cookie = false;
  73.  
  74. /**
  75. * @var bool TRUE to attempt /connect redirection process
  76. */
  77. $redirCallback = true;
  78.  
  79. switch ($doing) {
  80. case 'facebook':
  81. // Redirect to home on error
  82. if (isset($_REQUEST['state'], $_REQUEST['error'])) {
  83. G\redirect();
  84. }
  85. $facebook = new Facebook\Facebook([
  86. 'app_id' => CHV\getSetting('facebook_app_id'),
  87. 'app_secret' => CHV\getSetting('facebook_app_secret'),
  88. 'default_graph_version' => 'v2.8',
  89. ]);
  90. $connectURL = G\get_base_url('connect/facebook');
  91. $helper = $facebook->getRedirectLoginHelper();
  92. $accessToken = $helper->getAccessToken($connectURL);
  93. if (isset($accessToken)) {
  94. $redirCallback = false;
  95. $response = $facebook->get('/me?fields=id,name,cover,link,picture.type(large)', $accessToken);
  96. $get_user = $response->getGraphUser();
  97. $do_cookie = true;
  98. $do_insert = true;
  99. } elseif (isset($logged_doing)) {
  100. try {
  101. $response = $facebook->get('/me?fields=id,name,cover,link,picture.type(large)', $token);
  102. $get_user = $response->getGraphUser();
  103. $redirCallback = false;
  104. $do_cookie = true;
  105. } catch (Exception $e) {
  106. $redirCallback = true;
  107. $error = 'Google connect error: bad stored credentials';
  108. }
  109. }
  110. if ($redirCallback !== false) {
  111. $loginUrl = $helper->getLoginUrl($connectURL);
  112. G\redirect($loginUrl);
  113. }
  114. if (isset($error)) {
  115. unset($_SESSION['facebook']);
  116. throw new Exception($error, 400);
  117. }
  118. $social_pictures = [
  119. 'avatar' => $get_user['picture']['url'],
  120. 'background' => $get_user['cover']['source']
  121. ];
  122. $connect_user = [
  123. 'id' => $get_user['id'],
  124. 'username' => G\sanitize_string(G\unaccent_string($get_user['name']), true, true),
  125. 'name' => $get_user['name'],
  126. 'avatar' => $social_pictures['avatar'],
  127. 'url' => $get_user['link'],
  128. 'website' => null
  129. ];
  130. $connect_tokens = [
  131. 'secret' => null,
  132. 'token_hash' => $accessToken
  133. ];
  134.  
  135. break;
  136.  
  137. case 'twitter':
  138. if (isset($_REQUEST['denied'])) {
  139. G\redirect();
  140. }
  141. $twitter = [
  142. 'key' => CHV\getSetting('twitter_api_key'),
  143. 'secret' => CHV\getSetting('twitter_api_secret')
  144. ];
  145. $error = null;
  146. if (isset($_REQUEST['oauth_verifier'], $_SESSION['twitter']['token'], $_SESSION['twitter']['token_secret'])) {
  147. $redirCallback = false;
  148. $twitteroauth = new TwitterOAuth($twitter['key'], $twitter['secret'], $_SESSION['twitter']['token'], $_SESSION['twitter']['token_secret']);
  149. $access_token = $twitteroauth->oauth("oauth/access_token", [
  150. 'oauth_verifier' => $_REQUEST['oauth_verifier'],
  151. ]);
  152. $twitteroauth = new TwitterOAuth($twitter['key'], $twitter['secret'], $access_token['oauth_token'], $access_token['oauth_token_secret']);
  153. $get_user = $twitteroauth->get('account/verify_credentials');
  154. if ($get_user->errors) {
  155. $error = 'Twitter connect error: bad credentials or tokens';
  156. } else {
  157. $do_insert = true;
  158. $do_cookie = true;
  159. }
  160. } elseif (isset($logged_doing)) {
  161. $twitteroauth = new TwitterOAuth($twitter['key'], $twitter['secret'], $token, $secret);
  162. $get_user = $twitteroauth->get('account/verify_credentials');
  163. if ($get_user->errors) {
  164. $redirCallback = true;
  165. $error = 'Twitter connect error: bad stored credentials';
  166. } else {
  167. $redirCallback = false;
  168. $do_cookie = true;
  169. }
  170. }
  171. if ($redirCallback !== false) {
  172. try {
  173. $twitteroauth = new TwitterOAuth($twitter['key'], $twitter['secret']);
  174. $request_token = $twitteroauth->oauth("oauth/request_token", ["oauth_callback" => G\get_base_url('connect/twitter')]);
  175. if (($request_token['oauth_callback_confirmed'] ?? false) == true) {
  176. $url = $twitteroauth->url("oauth/authorize", ["oauth_token" => $request_token['oauth_token']]);
  177. $_SESSION['twitter']['token'] = $request_token['oauth_token'];
  178. $_SESSION['twitter']['token_secret'] = $request_token['oauth_token_secret'];
  179. G\redirect($url);
  180. } else {
  181. throw new Exception('Twitter connect error: oauth callback not confirmed', 400);
  182. }
  183. } catch (Exception $e) {
  184. $error = $e->getMessage();
  185. }
  186. }
  187. if (isset($error)) {
  188. unset($_SESSION['twitter']);
  189. throw new Exception($error, 400);
  190. }
  191. $social_pictures = [
  192. 'avatar' => str_replace('_normal.', '.', $get_user->profile_image_url_https),
  193. 'background' => $get_user->profile_background_image_url
  194. ];
  195. $connect_user = [
  196. 'id' => $get_user->id,
  197. 'username' => $get_user->screen_name,
  198. 'name' => $get_user->name,
  199. 'avatar' => $social_pictures['avatar'],
  200. 'url' => 'http://twitter.com/' . $get_user->screen_name,
  201. 'website' => $get_user->entities->url ? $get_user->entities->url->urls[0]->expanded_url : null
  202. ];
  203. $connect_tokens = [
  204. 'secret' => $access_token['oauth_token_secret'],
  205. 'token_hash' => $access_token['oauth_token']
  206. ];
  207. break;
  208.  
  209. case 'google':
  210. $google = [
  211. 'id' => CHV\getSetting('google_client_id'),
  212. 'secret' => CHV\getSetting('google_client_secret')
  213. ];
  214. if (isset($_REQUEST['state'], $_SESSION['google']['state']) && $_SESSION['google']['state'] !== $_REQUEST['state']) {
  215. G\set_status_header(403);
  216. $handler->template = 'request-denied';
  217. return;
  218. } else {
  219. $_SESSION['google']['state'] = md5(uniqid(mt_rand(), true));
  220. }
  221. if (($_REQUEST['error'] ?? null) == 'access_denied') {
  222. G\redirect('login');
  223. }
  224. $client = new Google\Client();
  225. $client->setApplicationName(CHV\getSetting('website_name') . ' connect');
  226. $client->setClientId($google['id']);
  227. $client->setClientSecret($google['secret']);
  228. $client->setRedirectUri(G\get_base_url('connect/google'));
  229. if ($_SESSION['google']['state']) {
  230. $client->setState($_SESSION['google']['state']);
  231. }
  232. $client->setScopes([Google\Service\Oauth2::USERINFO_PROFILE]);
  233. $oauth2Service = new Google\Service\Oauth2($client);
  234. if (isset($_GET['code'])) {
  235. $client->fetchAccessTokenWithAuthCode($_GET['code']);
  236. $access_token = $client->getAccessToken();
  237. $redirCallback = false;
  238. $client->setAccessToken($access_token);
  239. $get_user = $oauth2Service->userinfo->get();
  240. if (!$get_user) {
  241. $error = 'Google connect error: bad credentials or tokens';
  242. } else {
  243. $do_insert = true;
  244. $do_cookie = true;
  245. }
  246. } elseif (isset($logged_doing)) {
  247. try {
  248. $client->setAccessToken($token);
  249. $get_user = $oauth2Service->userinfo->get();
  250. $redirCallback = false;
  251. $do_cookie = true;
  252. } catch (Exception $e) {
  253. $redirCallback = true;
  254. $error = 'Google connect error: bad stored credentials';
  255. }
  256. }
  257. if ($redirCallback !== false) {
  258. G\redirect($client->createAuthUrl());
  259. }
  260. if (isset($error)) {
  261. unset($_SESSION['google']);
  262. throw new Exception($error, 400);
  263. }
  264. $social_pictures = [
  265. 'avatar' => $get_user->getPicture(),
  266. 'background' => null
  267. ];
  268. $connect_user = [
  269. 'id' => $get_user->getId(),
  270. 'username' => G\sanitize_string(G\unaccent_string($get_user->getName()), true, true),
  271. 'name' => $get_user->getName(),
  272. 'avatar' => $get_user->getPicture(),
  273. 'url' => $get_user->getLink(),
  274. ];
  275. $connect_tokens = [
  276. 'secret' => null,
  277. 'token_hash' => json_encode($client->getAccessToken())
  278. ];
  279. break;
  280.  
  281. case 'vk':
  282. $vk = [
  283. 'client_id' => CHV\getSetting('vk_client_id'),
  284. 'client_secret' => CHV\getSetting('vk_client_secret'),
  285. 'redirect_uri' => G\get_base_url('connect/vk')
  286. ];
  287. $error = null;
  288. $client = new \BW\Vkontakte($vk);
  289. if (isset($_GET['code'])) {
  290. $redirCallback = false;
  291. $client->authenticate();
  292. $access_token = $client->getAccessToken();
  293. $redirCallback = false;
  294. $client->setAccessToken($access_token);
  295. $query = [
  296. 'user_id' => $client->getUserId(),
  297. 'fields' => ['photo_200', 'site', 'domain']
  298. ];
  299. $get_user = $client->api('users.get', $query)[0] ?? null;
  300. if (empty($get_user)) {
  301. $error = 'VK connect error: bad credentials or tokens';
  302. } else {
  303. $do_insert = true;
  304. $do_cookie = true;
  305. }
  306. } elseif (isset($logged_doing)) {
  307. $client->setAccessToken($token);
  308. $query = [
  309. 'user_id' => $client->getUserId(),
  310. 'fields' => ['photo_200', 'site', 'domain']
  311. ];
  312. $get_user = $client->api('users.get', $query)[0] ?? null;
  313. if (empty($get_user)) {
  314. $redirCallback = true;
  315. $error = 'VK connect error: bad stored credentials';
  316. } else {
  317. $redirCallback = false;
  318. $do_cookie = true;
  319. }
  320. }
  321. if ($redirCallback !== false) {
  322. G\redirect($client->getLoginUrl());
  323. }
  324. if (isset($error)) {
  325. unset($_SESSION['vk']);
  326. throw new Exception($error, 400);
  327. }
  328. $social_pictures = [
  329. 'avatar' => $get_user['photo_200'],
  330. 'background' => null
  331. ];
  332. $connect_user = [
  333. 'id' => $get_user['id'] ?: $get_user['uid'],
  334. 'username' => G\sanitize_string(G\unaccent_string($get_user['first_name'] . $get_user['last_name']), true, true),
  335. 'name' => trim($get_user['first_name'] . ' ' . $get_user['last_name']),
  336. 'avatar' => $get_user['photo_200'],
  337. 'url' => 'http://vk.com/' . $get_user['domain'],
  338. 'website' => $get_user['site']
  339. ];
  340. $connect_tokens = [
  341. 'secret' => null,
  342. 'token_hash' => json_encode($client->getAccessToken())
  343. ];
  344. break;
  345. }
  346.  
  347. if (!empty($logged_user)) {
  348. $user = $logged_user;
  349. }
  350.  
  351. if ($do_insert) {
  352. $login = CHV\Login::get(['type' => $doing, 'resource_id' => $connect_user['id']]);
  353. if (count($login) > 1) {
  354. foreach ($login as $v) {
  355. $isUser = CHV\User::getSingle($v['user_id']);
  356. if (!$isUser) {
  357. CHV\Login::delete(['id' => $v['id']]);
  358. } else {
  359. $login = $v;
  360. break;
  361. }
  362. }
  363. } else {
  364. $login = $login[0];
  365. }
  366. if ($login && !$user) {
  367. $user = CHV\User::getSingle($login['user_id']);
  368. }
  369. if (!$user) {
  370. if (!CHV\Settings::get('enable_signups')) {
  371. _se('Signup is disabled');
  372. die();
  373. }
  374. // Create user (bound to social network login)
  375. $username = '';
  376. preg_match_all('/[\w]/', $connect_user['username'], $user_matches);
  377. foreach ($user_matches[0] as $match) {
  378. $username .= $match;
  379. }
  380. $baseUsername = substr(strtolower($username), 0, CHV\getSetting('username_max_length'));
  381. $username = $baseUsername;
  382. $j = 1;
  383. while (!CHV\User::isValidUsername($username)) {
  384. if(strlen($username) > CHV\getSetting('username_max_length')) {
  385. $username = substr($baseUsername, 0, -strlen($j)) . $j;
  386. } else {
  387. $username .= $j;
  388. }
  389. $j++;
  390. }
  391. $i = 1;
  392. while (CHV\User::getSingle($username, 'username', false)) {
  393. if(strlen($username) > CHV\getSetting('username_max_length')) {
  394. $username = substr($baseUsername, 0, -strlen($i)) . $i;
  395. } else {
  396. $username .= $i;
  397. }
  398. $i++;
  399. }
  400. $insert_user_values = [
  401. 'username' => $username,
  402. 'name' => $connect_user['name'],
  403. 'status' => CHV\getSetting('require_user_email_social_signup') ? 'awaiting-email' : 'valid',
  404. 'website' => $connect_user['website'],
  405. 'timezone' => CHV\getSetting('default_timezone'),
  406. 'language' => CHV\L10n::getLocale(),
  407. ];
  408.  
  409. if (in_array($doing, ['twitter', 'facebook'])) {
  410. $insert_user_values[$doing . '_username'] = $connect_user['username'];
  411. }
  412. $inserted_user = CHV\User::insert($insert_user_values);
  413. $user = CHV\User::getSingle($inserted_user, 'id', true);
  414. }
  415. $login_array = [
  416. 'user_id' => $user['id'],
  417. 'type' => $doing,
  418. 'resource_id' => $connect_user['id']
  419. ];
  420. CHV\Login::delete($login_array);
  421. $login_array = array_merge($login_array, $connect_tokens);
  422. $login_array = array_merge($login_array, [
  423. 'resource_name' => $connect_user['name'],
  424. 'resource_avatar' => $connect_user['avatar'],
  425. 'resource_url' => $connect_user['url'],
  426. ]);
  427. CHV\Login::insert($login_array);
  428. }
  429.  
  430. if ($do_cookie) {
  431. // Insert 'cookie_twitter', checks $_COOKIE due to redirects
  432. if (!isset($_COOKIE[$cookieName])) {
  433. CHV\Login::insert([
  434. 'user_id' => $user['id'],
  435. 'type' => 'cookie_' . $doing,
  436. ]);
  437. }
  438. }
  439.  
  440. if ($user) {
  441. if ($connect_user) {
  442. if ($doing == 'twitter') {
  443. $user_array[$doing . '_username'] = $connect_user['username'];
  444. }
  445. if (is_array($user_array) && count($user_array) > 0) {
  446. CHV\User::update($user['id'], $user_array);
  447. }
  448. }
  449. if ($social_pictures) {
  450. // Fetch the social network images
  451. if (!$user['avatar']['filename'] or !$user['background']['filename']) {
  452. $avatar_needed = !$user ? true : !$user['avatar']['filename'];
  453. $background_needed = !$user ? true : !$user['background']['filename'];
  454. try {
  455. if ($avatar_needed and $social_pictures['avatar']) {
  456. CHV\User::uploadPicture($user, 'avatar', $social_pictures['avatar']);
  457. }
  458. if ($background_needed and $social_pictures['background']) {
  459. CHV\User::uploadPicture($user, 'background', $social_pictures['background']);
  460. }
  461. } catch (Exception $e) {
  462. } // Silence
  463. }
  464. }
  465. }
  466.  
  467. if ($do_insert || $do_cookie) {
  468. $redirect_to = $_SESSION['connect_return'] ? urldecode($_SESSION['connect_return']) : $logged_user['url'];
  469. unset($_SESSION['connect_return'], $_SESSION[$doing]);
  470. if ($_SESSION['last_url']) {
  471. $redirect_to = $_SESSION['last_url'];
  472. }
  473. G\redirect($redirect_to);
  474. }
  475.  
  476. die();
  477. };
  478.  
Advertisement
Add Comment
Please, Sign In to add comment