View source
<?php
namespace Drupal\simple_fb_connect;
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookRequestException;
use Facebook\GraphObject;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Routing\UrlGeneratorInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
class SimpleFbConnectFbManager {
protected $configFactory;
protected $loggerFactory;
protected $session;
protected $eventDispatcher;
protected $entityFieldManager;
protected $urlGenerator;
protected $scope;
protected $returnUrl;
public function __construct(ConfigFactoryInterface $config_factory, LoggerChannelFactoryInterface $logger_factory, SessionInterface $session, EventDispatcherInterface $event_dispatcher, EntityFieldManagerInterface $entity_field_manager, UrlGeneratorInterface $url_generator) {
$this->configFactory = $config_factory;
$this->loggerFactory = $logger_factory;
$this->session = $session;
$this->eventDispatcher = $event_dispatcher;
$this->entityFieldManager = $entity_field_manager;
$this->urlGenerator = $url_generator;
$this->scope = array(
'email',
);
$this->returnUrl = $this->urlGenerator
->generateFromRoute('simple_fb_connect.return_from_fb', array(), array(
'absolute' => TRUE,
));
$this
->initializeApp();
}
public function initializeApp() {
if ($this
->validateConfig()) {
FacebookSession::setDefaultApplication($this
->getAppId(), $this
->getAppSecret());
return TRUE;
}
return FALSE;
}
public function validateConfig() {
$app_id = $this
->getAppId();
$app_secret = $this
->getAppSecret();
if (!$app_id || !$app_secret) {
$this->loggerFactory
->get('simple_fb_connect')
->error('Define App ID and App Secret on module settings.');
return FALSE;
}
return TRUE;
}
public function getFbLoginUrl() {
$login_helper = new FacebookRedirectLoginHelper($this->returnUrl);
$login_helper
->disableSessionStatusCheck();
$e = new GenericEvent($this->scope, [
'scope' => $this->scope,
]);
$event = $this->eventDispatcher
->dispatch('simple_fb_connect.scope', $e);
$final_scope = $event
->getArgument('scope');
return $login_helper
->getLoginUrl($final_scope);
}
public function getReturnUrl() {
return $this->returnUrl;
}
public function startFbSession(FacebookRedirectLoginHelper $login_helper) {
try {
$fb_session = $login_helper
->getSessionFromRedirect();
if ($fb_session) {
$this->session
->set('simple_fb_connect_user_token', $fb_session
->getToken());
return TRUE;
}
else {
$this->loggerFactory
->get('simple_fb_connect')
->error('Could not start Facebook session. User cancelled the dialog in Facebook or return URL was not valid.');
return FALSE;
}
} catch (FacebookRequestException $ex) {
$this->loggerFactory
->get('simple_fb_connect')
->error('Could not start Facebook session. FacebookRequestException: @message', array(
'@message' => json_encode($ex
->getResponse()),
));
} catch (\Exception $ex) {
$this->loggerFactory
->get('simple_fb_connect')
->error('Could not start Facebook session. Exception: @message', array(
'@message' => $ex
->getMessage(),
));
}
return FALSE;
}
public function getFbSession() {
try {
$user_token = $this->session
->get('simple_fb_connect_user_token');
$fb_session = new FacebookSession($user_token);
$fb_session
->validate();
return $fb_session;
} catch (\Exception $ex) {
$this->loggerFactory
->get('simple_fb_connect')
->error('FacebookSession validation failed. Exception: @message', array(
'@message' => $ex
->getMessage(),
));
}
return FALSE;
}
public function getFbProfile(FacebookSession $fb_session) {
try {
$request = new FacebookRequest($fb_session, 'GET', '/me?fields=id,name,email');
$graph_object = $request
->execute()
->getGraphObject();
return $graph_object;
} catch (FacebookRequestException $ex) {
$this->loggerFactory
->get('simple_fb_connect')
->error('Could not load Facebook user profile: FacebookRequestException. Error details: @message', array(
'@message' => json_encode($ex
->getResponse()),
));
} catch (\Exception $ex) {
$this->loggerFactory
->get('simple_fb_connect')
->error('Could not load Facebook user profile: Unhandled exception. Error details: @message', array(
'@message' => $ex
->getMessage(),
));
}
return FALSE;
}
public function getFbProfilePicUrl(FacebookSession $fb_session) {
$resolution = $this
->getPreferredResolution();
$query = '/me/picture?redirect=false';
if (is_array($resolution)) {
$query .= '&width=' . $resolution['width'] . '&height=' . $resolution['height'];
}
try {
$request = new FacebookRequest($fb_session, 'GET', $query);
$url = $request
->execute()
->getGraphObject()
->getProperty('url');
return $url;
} catch (FacebookRequestException $ex) {
$this->loggerFactory
->get('simple_fb_connect')
->error('Could not load Facebook profile picture URL. FacebookRequestException: @message', array(
'@message' => json_encode($ex
->getResponse()),
));
} catch (\Exception $ex) {
$this->loggerFactory
->get('simple_fb_connect')
->error('Could not load Facebook profile picture URL. Unhandled exception. Error details: @message', array(
'@message' => $ex
->getMessage(),
));
}
return FALSE;
}
public function getEmail(GraphObject $fb_profile) {
if ($email = $fb_profile
->getProperty('email')) {
return $email;
}
$this->loggerFactory
->get('simple_fb_connect')
->error('No email address in Facebook user profile');
return FALSE;
}
protected function getAppId() {
$app_id = $this->configFactory
->get('simple_fb_connect.settings')
->get('app_id');
return $app_id;
}
protected function getAppSecret() {
$app_secret = $this->configFactory
->get('simple_fb_connect.settings')
->get('app_secret');
return $app_secret;
}
protected function getPreferredResolution() {
$field_definitions = $this->entityFieldManager
->getFieldDefinitions('user', 'user');
if (!isset($field_definitions['user_picture'])) {
return FALSE;
}
$max_resolution = $field_definitions['user_picture']
->getSetting('max_resolution');
$min_resolution = $field_definitions['user_picture']
->getSetting('min_resolution');
if ($max_resolution) {
$resolution = $max_resolution;
}
elseif ($min_resolution) {
$resolution = $min_resolution;
}
else {
return FALSE;
}
$dimensions = explode('x', $resolution);
return array(
'width' => $dimensions[0],
'height' => $dimensions[1],
);
}
}