View source
<?php
namespace Drupal\simple_fb_connect\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\simple_fb_connect\SimpleFbConnectFbManager;
use Drupal\simple_fb_connect\SimpleFbConnectUserManager;
use Drupal\simple_fb_connect\SimpleFbConnectPostLoginManager;
use Drupal\simple_fb_connect\SimpleFbConnectPersistentDataHandler;
use Drupal\simple_fb_connect\SimpleFbConnectFbFactory;
class SimpleFbConnectController extends ControllerBase {
protected $fbManager;
protected $userManager;
protected $postLoginManager;
protected $persistentDataHandler;
protected $fbFactory;
public function __construct(SimpleFbConnectFbManager $fb_manager, SimpleFbConnectUserManager $user_manager, SimpleFbConnectPostLoginManager $post_login_manager, SimpleFbConnectPersistentDataHandler $persistent_data_handler, SimpleFbConnectFbFactory $fb_factory) {
$this->fbManager = $fb_manager;
$this->userManager = $user_manager;
$this->postLoginManager = $post_login_manager;
$this->persistentDataHandler = $persistent_data_handler;
$this->fbFactory = $fb_factory;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('simple_fb_connect.fb_manager'), $container
->get('simple_fb_connect.user_manager'), $container
->get('simple_fb_connect.post_login_manager'), $container
->get('simple_fb_connect.persistent_data_handler'), $container
->get('simple_fb_connect.fb_factory'));
}
public function redirectToFb() {
if (!($facebook = $this->fbFactory
->getFbService())) {
drupal_set_message($this
->t('Simple FB Connect is not configured properly. Please contact site administrator.'), 'error');
return $this
->redirect('user.login');
}
$this->fbManager
->setFacebookService($facebook);
if ($post_login_path = $this->postLoginManager
->getPostLoginPathFromRequest()) {
$this->postLoginManager
->savePostLoginPath($post_login_path);
}
$fb_login_url = $this->fbManager
->getFbLoginUrl();
if ($this->persistentDataHandler
->get('reprompt')) {
$fb_login_url = $this->fbManager
->getFbReRequestUrl();
}
return new TrustedRedirectResponse($fb_login_url);
}
public function returnFromFb() {
if (!($facebook = $this->fbFactory
->getFbService())) {
drupal_set_message($this
->t('Simple FB Connect is not configured properly. Please contact site administrator.'), 'error');
return $this
->redirect('user.login');
}
$this->fbManager
->setFacebookService($facebook);
if (!($access_token = $this->fbManager
->getAccessTokenFromFb())) {
drupal_set_message($this
->t('Facebook login failed.'), 'error');
return $this
->redirect('user.login');
}
if (!$this->fbManager
->checkPermission('email')) {
if ($site_name = $this
->config('system.site')
->get('name')) {
drupal_set_message($this
->t('Facebook login failed. @site_name requires permission to get your email address from Facebook. Please try again and give the permission.', [
'@site_name' => $site_name,
]), 'error');
}
else {
drupal_set_message($this
->t('Facebook login failed. This site requires permission to get your email address from Facebook. Please try again and give the permission.'), 'error');
}
$this->persistentDataHandler
->set('reprompt', TRUE);
return $this
->redirect('user.login');
}
if (!($fb_profile = $this->fbManager
->getFbProfile())) {
drupal_set_message($this
->t('Facebook login failed, Facebook profile could not be loaded. Please contact site administrator.'), 'error');
return $this
->redirect('user.login');
}
if (!($email = $this->fbManager
->getEmail($fb_profile))) {
drupal_set_message($this
->t('Facebook login failed. This site requires an email address. Please add one in your Facebook profile and try again.'), 'error');
return $this
->redirect('user.login');
}
$this->persistentDataHandler
->set('access_token', $access_token);
if ($drupal_user = $this->userManager
->loadUserByProperty('mail', $email)) {
if ($this->userManager
->loginUser($drupal_user)) {
return new RedirectResponse($this->postLoginManager
->getPostLoginPath());
}
else {
$this->persistentDataHandler
->set('access_token', NULL);
return $this
->redirect('user.login');
}
}
$fbid = $fb_profile
->getField('id');
$fb_profile_pic = $this->fbManager
->getFbProfilePic();
if ($drupal_user = $this->userManager
->createUser($fb_profile
->getField('name'), $email, $fbid, $fb_profile_pic)) {
if ($this->userManager
->loginUser($drupal_user)) {
if ($this->postLoginManager
->getRedirectNewUsersToUserFormSetting()) {
drupal_set_message($this
->t("Please take a moment to confirm your account details. Since you logged in with Facebook, you don't need to update your password."));
return new RedirectResponse($this->postLoginManager
->getPathToUserForm($drupal_user));
}
return new RedirectResponse($this->postLoginManager
->getPostLoginPath());
}
else {
$this->persistentDataHandler
->set('access_token', NULL);
drupal_set_message($this
->t('You will receive an email when a site administrator activates your account.'), 'warning');
return $this
->redirect('user.login');
}
}
else {
$this->persistentDataHandler
->set('access_token', NULL);
return $this
->redirect('user.login');
}
$this->persistentDataHandler
->set('access_token', NULL);
throw new AccessDeniedHttpException();
}
}