session_id()))->fetchField();
if ($session) {
// Overwrite $_SESSION with the data.
session_decode($session);
// Remove the duplicate session from the database.
db_delete('sessions')->condition('sid', session_id())->execute();
}
}
}
/**
* Returns HybridAuth widget with list of providers icons.
*/
function hybridauth_providers($js, $icon_pack) {
$build = array(
'#type' => 'hybridauth_widget',
'#title' => '',
'#hybridauth_widget_type' => 'list',
'#hybridauth_widget_icon_pack' => $icon_pack,
);
if ($js) {
ctools_include('modal');
ctools_modal_render(t('Log in using your account with'), $build);
}
else {
$build['#title'] = t('Log in using your account with');
return $build;
}
}
function hybridauth_window_start($provider_id) {
// If provider is OpenID, but we don't have the openid_identifier.
if ($provider_id == 'OpenID' && !isset($_GET['openid_identifier'])) {
$form = drupal_get_form('hybridauth_openid_form');
return _hybridauth_window_render_form($form, $provider_id);
}
// Make sure the session is started, HybridAuth library needs it.
hybridauth_session_start();
// Try to get HybridAuth instance.
if ($hybridauth = hybridauth_get_instance()) {
return _hybridauth_window_auth($hybridauth, $provider_id);
}
else {
drupal_set_message(t('There was an error processing your request.'), 'error');
_hybridauth_window_close(FALSE);
}
}
/**
* Close the popup (if used) and redirect if there was no error.
*/
function _hybridauth_window_close($redirect = TRUE) {
global $user;
// Prevent devel module from spewing.
$GLOBALS['devel_shutdown'] = FALSE;
$destination = drupal_get_destination();
$destination = $destination['destination'];
// Check if token replacements are allowed for the destination string.
if (_hybridauth_allow_token_replace($destination)) {
$destination = token_replace($destination, array('user' => $user), array('clear' => TRUE));
}
$destination_error = !empty($_GET['destination_error']) ? $_GET['destination_error'] : variable_get('hybridauth_destination_error', '');
$base_options = array(
'absolute' => TRUE,
// The redirect target must never be an external URL to prevent open
// redirect vulnerabilities.
'external' => FALSE,
);
$destination_options = drupal_parse_url($destination) + $base_options;
$destination_error_options = drupal_parse_url($destination_error) + $base_options;
drupal_alter('hybridauth_destination_options', $destination_options);
drupal_alter('hybridauth_destination_error_options', $destination_error_options);
$destination = url($destination_options['path'], $destination_options);
$destination_error = url($destination_error_options['path'], $destination_error_options);
drupal_add_js(array(
'hybridauth'=> array(
'redirect' => $redirect ? 1 : 0,
'destination' => $destination,
'destination_error' => $destination_error,
)
), 'setting');
drupal_add_js(drupal_get_path('module', 'hybridauth') . '/js/hybridauth.close.js');
// Make sure that we send the correct content type with charset, otherwise
// Firefox might repeat the GET request.
// @see https://www.drupal.org/node/2648912
drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
$page = element_info('page');
// Don't show messages on this closing page, show them later.
$page['#show_messages'] = FALSE;
$page['#children'] = t('Closing...');
print theme('html', array('page' => $page));
drupal_exit();
}
function _hybridauth_window_auth($hybridauth, $provider_id) {
$error_code = NULL;
if (is_object($hybridauth)) {
$params = array(
'hauth_return_to' => url('hybridauth/window/' . $provider_id, array('absolute' => TRUE, 'query' => drupal_get_query_parameters())),
);
if (isset($_GET['openid_identifier'])) {
$params['openid_identifier'] = $_GET['openid_identifier'];
}
try {
$adapter = $hybridauth->authenticate($provider_id, $params);
$profile = (array) ($adapter->getUserProfile());
}
catch(Exception $e) {
watchdog_exception('hybridauth', $e);
$error_code = $e->getCode();
}
}
else {
$error_code = $hybridauth;
}
if (!is_null($error_code)) {
// Destroy the session started in hybridauth_window_start() if user is not
// logged in.
if (!user_is_logged_in()) {
// Delete session only if it contains just HybridAuth data.
$delete_session = TRUE;
foreach ($_SESSION as $key => $value) {
if (substr($key, 0, 4) != 'HA::') {
$delete_session = FALSE;
}
}
if ($delete_session) {
session_destroy();
}
}
switch ($error_code) {
case 5:
// Authentication failed. The user has canceled the authentication or
// the provider refused the connection.
break;
case 0:
// Unspecified error.
case 1:
// Hybridauth configuration error.
case 2:
// Provider not properly configured.
case 3:
// Unknown or disabled provider.
case 4:
// Missing provider application credentials (your application id, key
// or secret).
case 6:
// User profile request failed.
case 7:
// User not connected to the provider.
case 8:
// Provider does not support this feature.
default:
// Report the error - this message is not shown to anonymous users as
// we destroy the session - see below.
drupal_set_message(t('There was an error processing your request.'), 'error');
}
_hybridauth_window_close(FALSE);
}
$profile['provider'] = $provider_id;
// Invoke hook_hybridauth_profile_alter().
drupal_alter('hybridauth_profile', $profile);
// Process Drupal authentication.
return _hybridauth_window_process_auth($profile);
}
/**
* Handle the Drupal authentication.
*/
function _hybridauth_window_process_auth($data) {
global $user;
// User is already logged in, tries to add new identity.
if (user_is_logged_in()) {
// Identity is already registered.
if ($identity = _hybridauth_identity_load($data)) {
// Registered to this user.
if ($user->uid == $identity['uid']) {
drupal_set_message(t('You have already registered this identity.'));
_hybridauth_window_close();
}
// Registered to another user.
else {
drupal_set_message(t('This identity is registered to another user.'), 'error');
_hybridauth_window_close();
}
}
// Identity is not registered - add it to the logged in user.
else {
_hybridauth_identity_save($data);
drupal_set_message(t('New identity added.'));
_hybridauth_invoke_hooks('hybridauth_identity_added', $user, $data);
_hybridauth_window_close();
}
}
if ($identity = _hybridauth_identity_load($data)) {
// Check if user is blocked.
if ($account = _hybridauth_user_is_blocked_by_uid($identity['uid'])) {
$account = user_load($identity['uid']);
module_invoke_all('hybridauth_user_blocked', $account, $data);
drupal_set_message(t('The username %name has not been activated or is blocked.', array('%name' => $account->name)), 'error');
}
// Check for email verification timestamp.
elseif (!_hybridauth_user_login_access_by_uid($identity['uid'])) {
$data = unserialize($identity['data']);
drupal_set_message(t('You need to verify your e-mail address - !email.', array('!email' => $data['email'])), 'error');
drupal_set_message(t('A welcome message with further instructions has been sent to your e-mail address.'));
_hybridauth_mail_notify('hybridauth_email_verification', user_load($identity['uid']));
}
else {
$form_state['uid'] = $identity['uid'];
user_login_submit(array(), $form_state);
_hybridauth_invoke_hooks('hybridauth_user_login', $user, $data);
}
}
// Handle duplicate email addresses.
elseif (variable_get('hybridauth_duplicate_emails', 1) && !empty($data['email']) && $account = user_load_by_mail($data['email'])) {
// Add identity to existing account, only if emailVerified.
if (variable_get('hybridauth_duplicate_emails', 1) == 2 && $data['email'] == $data['emailVerified']) {
_hybridauth_identity_save($data, $account->uid);
drupal_set_message(t('New identity added.'));
_hybridauth_invoke_hooks('hybridauth_identity_added', $account, $data);
$form_state['uid'] = $account->uid;
user_login_submit(array(), $form_state);
_hybridauth_invoke_hooks('hybridauth_user_login', $user, $data);
}
// Block registration - if (variable_get('hybridauth_duplicate_emails', 1) == 1) or
// (variable_get('hybridauth_duplicate_emails', 1) == 2 && $data['email'] != $data['emailVerified'])
else {
drupal_set_message(t('You are trying to login with email address of another user.'), 'error');
if (!empty($account->data['hybridauth'])) {
$providers = hybridauth_providers_list();
drupal_set_message(t('If you are completely sure it is your email address, try to login through %provider.',
array('%provider' => $providers[$account->data['hybridauth']['provider']])), 'status');
}
else {
drupal_set_message(t('If you are completely sure it is your email address, try to login using your username and password on this site. If you don\'t remember your password - request new password.',
array('@password' => url('user/password'))));
}
}
}
// Check if other modules want to block this registration.
elseif ($message = _hybridauth_registration_block($data)) {
// Destroy the session with the blocked authorized identity.
session_destroy();
if (is_string($message)) {
drupal_set_message($message, 'error');
}
}
// Create new user account.
else {
// Visitors can create accounts.
if ((variable_get('hybridauth_register', 0) == 0 && variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL))
|| variable_get('hybridauth_register', 0) == 1 || variable_get('hybridauth_register', 0) == 2) {
_hybridauth_invoke_hooks('hybridauth_user_preinsert', $user, $data);
// Check profile information for required fields.
if ($additional_info = _hybridauth_check_additional_info($data)) {
return $additional_info;
}
// As we have already checked for the additional info we can unset the plaintext $data['pass'] here.
if (isset($data['pass'])) {
$user_password = $data['pass'];
unset($data['pass']);
}
// TODO: remove this global if possible.
global $_hybridauth_data;
$_hybridauth_data = $data;
// Register this new user.
$name = _hybridauth_make_username($data);
$userinfo = array(
'name' => $name,
'pass' => empty($user_password) ? user_password() : $user_password,
'init' => $data['email'],
'status' => 1,
'access' => REQUEST_TIME,
'mail' => $data['email'],
'data' => array('hybridauth' => $data),
);
// Invoke hook_hybridauth_userinfo_alter().
drupal_alter('hybridauth_userinfo', $userinfo, $data);
$admin_approval_required = FALSE;
// Admin approval is required.
if ((variable_get('hybridauth_register', 0) == 0 && variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) == USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)
|| variable_get('hybridauth_register', 0) == 2) {
$userinfo['status'] = 0;
$admin_approval_required = TRUE;
}
$account = user_save(drupal_anonymous_user(), $userinfo);
// Terminate if an error occurred during user_save().
if (!$account) {
drupal_set_message(t('Error saving user account.'), 'error');
_hybridauth_window_close();
}
_hybridauth_invoke_hooks('hybridauth_user_insert', $account, $data);
_hybridauth_identity_save($data, $account->uid);
_hybridauth_invoke_hooks('hybridauth_identity_added', $account, $data);
$user_save_trigger = FALSE;
$user_email_verify_trigger = FALSE;
$user_login_trigger = TRUE;
// Save user picture.
if (variable_get('user_pictures', 0) && variable_get('hybridauth_pictures', 1)) {
$photo_url = $data['photoURL'];
if (valid_url($photo_url)) {
$photo = drupal_http_request($photo_url);
if (isset($photo->error)) {
watchdog('hybridauth', 'Error while executing drupal_http_request() to %url: %error.', array('%url' => $photo_url, '%error' => $photo->error), WATCHDOG_ERROR);
}
else {
if ($file = file_save_data($photo->data)) {
// To make user_save() to process the file and move it.
$file->status = 0;
$edit['picture'] = $file;
$user_save_trigger = TRUE;
}
else {
watchdog('hybridauth', 'Failed to save user image from url %url.', array('%url' => $photo_url), WATCHDOG_ERROR);
}
}
}
}
// Admin approval is required.
if ($admin_approval_required) {
$user_login_trigger = FALSE;
_user_mail_notify('register_pending_approval', $account);
drupal_set_message(t('Thank you for applying for an account. Your account is currently pending approval by the site administrator.
In the meantime, a welcome message with further instructions has been sent to your e-mail address.'));
}
// Email verification is required.
elseif (!empty($data['email']) && $data['email'] != $data['emailVerified']
&& ((!variable_get('hybridauth_email_verification', 0) && variable_get('user_email_verification', TRUE)) || variable_get('hybridauth_email_verification', 0) == 1)) {
$user_login_trigger = FALSE;
// Dries birthday timestamp, Nov 19, 1978 = 280281600 :).
$edit['login'] = 280281600;
$user_save_trigger = TRUE;
$user_email_verify_trigger = TRUE;
}
if ($user_save_trigger) {
// Hack to remove one notice from Legal module.
if (module_exists('legal')) {
$edit['legal_accept'] = NULL;
}
$account = user_save($account, $edit);
}
if ($user_email_verify_trigger) {
_hybridauth_mail_notify('hybridauth_email_verification', $account);
drupal_set_message(t('A welcome message with further instructions has been sent to your e-mail address.'));
}
// Log user in.
if ($user_login_trigger) {
$form_state['uid'] = $account->uid;
user_login_submit(array(), $form_state);
_hybridauth_invoke_hooks('hybridauth_user_login', $user, $data);
}
}
// Visitors can't register accounts through HybridAuth.
elseif (variable_get('hybridauth_register', 0) == 3) {
if (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)) {
$message = t('Sorry, you are not allowed to login. Please, create a new account.', array('@register' => url('user/register')));
}
else {
$message = t('New account registration is not allowed.');
}
drupal_set_message($message, 'error');
_hybridauth_window_close(FALSE);
}
// Only admin can create accounts.
else {
drupal_set_message(t('Only site administrators can create new user accounts.'), 'error');
_hybridauth_window_close(FALSE);
}
}
_hybridauth_window_close();
}
function _hybridauth_check_additional_info($data) {
$show_form = FALSE;
if (empty($data['username']) && variable_get('hybridauth_registration_username_change', 0)) {
$show_form = TRUE;
}
if (empty($data['pass']) && variable_get('hybridauth_registration_password', 0)) {
$show_form = TRUE;
}
$required_fields = array_filter(variable_get('hybridauth_required_fields', array('email' => 'email')));
foreach ($required_fields as $key => $value) {
if (empty($data[$key]) && !($data[$key] === 0)) {
$show_form = TRUE;
break;
}
}
// Allow other modules to show pre-registration form.
// Invoke hook_hybridauth_registration_form().
foreach (module_invoke_all('hybridauth_registration_form', $data) as $value) {
if ($value) {
$show_form = TRUE;
}
}
if ($show_form) {
$form = drupal_get_form('hybridauth_additional_info_form', $data);
return _hybridauth_window_render_form($form, $data['provider']);
}
}
function _hybridauth_window_render_form($form, $provider_id) {
$window_type = variable_get('hybridauth_provider_' . $provider_id . '_window_type', 'current');
if ($window_type == 'current') {
return $form;
}
else { // 'popup' or modal ('colorbox', 'shadowbox', 'fancybox', 'lightbox2')
$page = element_info('page');
$page['#children'] = theme('status_messages') . drupal_render($form);
print theme('html', array('page' => $page));
}
drupal_exit();
}
function hybridauth_additional_info_form($form, &$form_state, $data) {
$form['data'] = array(
'#type' => 'value',
'#value' => $data,
);
$form['fset'] = array(
'#type' => 'fieldset',
'#title' => t('Required information'),
'#description' => t('Please fill in additional information to complete your registration.'),
);
if (variable_get('hybridauth_registration_username_change', 0)) {
$form['fset']['username'] = array(
'#type' => 'textfield',
'#title' => t('Username'),
'#maxlength' => USERNAME_MAX_LENGTH,
'#required' => TRUE,
'#attributes' => array('class' => array('username')),
'#default_value' => _hybridauth_make_username($data, TRUE),
'#description' => t('Choose your username.') . ' '
. t('Spaces are allowed; punctuation is not allowed except for periods, hyphens, apostrophes, and underscores.'),
);
if (module_exists('username_check')) {
_username_check_load_resources('auto');
$form['fset']['username']['#field_suffix'] = ' ';
$form['fset']['username']['#suffix'] = '