hybridauth.module in HybridAuth Social Login 6.2
Same filename and directory in other branches
Main file for the HybridAuth module.
File
hybridauth.moduleView source
<?php
/**
* @file
* Main file for the HybridAuth module.
*/
define('HYBRIDAUTH_HASH_SALT', 'hybridauth_hash_salt');
if (module_exists('token')) {
include_once drupal_get_path('module', 'hybridauth') . '/hybridauth.tokens.inc';
}
/**
* Implements hook_perm().
*/
function hybridauth_perm() {
return array(
'use hybridauth',
);
}
/**
* Implements hook_menu().
*/
function hybridauth_menu() {
$items = array();
$items['admin/user/hybridauth'] = array(
'title' => 'HybridAuth',
'description' => 'Manage HybridAuth social sign-on settings.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'hybridauth_admin_settings',
),
'access arguments' => array(
'administer site configuration',
),
'file' => 'hybridauth.admin.inc',
);
$items['admin/user/hybridauth/provider/%hybridauth_provider'] = array(
'title callback' => 'hybridauth_get_provider_name',
'title arguments' => array(
4,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'hybridauth_admin_provider_settings',
4,
),
'access arguments' => array(
'administer site configuration',
),
'file' => 'hybridauth.admin.inc',
);
$items['admin/reports/hybridauth'] = array(
'title' => 'HybridAuth identities',
'description' => 'View HybridAuth identities counts grouped by authentication provider.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'hybridauth_report',
),
'access arguments' => array(
'access site reports',
),
'file' => 'hybridauth.admin.inc',
'type' => MENU_NORMAL_ITEM,
);
$items['hybridauth/endpoint'] = array(
'page callback' => 'hybridauth_endpoint',
'access callback' => TRUE,
'file' => 'hybridauth.pages.inc',
'type' => MENU_CALLBACK,
);
$items['hybridauth/window/%hybridauth_provider'] = array(
'page callback' => 'hybridauth_window_start',
'page arguments' => array(
2,
),
'access callback' => TRUE,
'file' => 'hybridauth.pages.inc',
'type' => MENU_CALLBACK,
);
$items['hybridauth/providers/%ctools_js'] = array(
'page callback' => 'hybridauth_providers',
'page arguments' => array(
2,
),
'access callback' => TRUE,
'file' => 'hybridauth.pages.inc',
'type' => MENU_CALLBACK,
);
$items['user/%user/hybridauth'] = array(
'title' => 'HybridAuth',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'hybridauth_user_identity',
1,
),
'access callback' => 'user_edit_access',
'access arguments' => array(
1,
),
'file' => 'hybridauth.pages.inc',
'type' => MENU_LOCAL_TASK,
);
$items['user/%user/hybridauth/delete'] = array(
'title' => 'Delete HybridAuth identity',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'hybridauth_user_identity_delete',
1,
4,
),
'access callback' => 'user_edit_access',
'access arguments' => array(
1,
),
'file' => 'hybridauth.pages.inc',
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Menu argument loader.
*/
function hybridauth_provider_load($requested_provider_id) {
foreach (array_keys(hybridauth_providers_list()) as $provider_id) {
if (strtolower($requested_provider_id) === strtolower($provider_id)) {
return $provider_id;
}
}
return $requested_provider_id;
}
/**
* Implements hook_block.
*/
function hybridauth_block($op = 'list', $delta = 0, $edit = array()) {
if ($op == 'list') {
return array(
'hybridauth' => array(
'info' => t('User login - HybridAuth widget only'),
// Shouldn't be cached.
'cache' => BLOCK_NO_CACHE,
),
);
}
elseif ($op == 'view' && $delta == 'hybridauth' && !user_is_logged_in()) {
$block = array();
$block['subject'] = t('User login');
$element['#type'] = 'hybridauth_widget';
$block['content'] = drupal_render($element);
return $block;
}
}
/**
* Implements hook_user().
*/
function hybridauth_user($op, &$edit, &$account, $category = NULL) {
if ($op == 'login') {
_hybridauth_session_sync_data($account->uid);
}
elseif ($op == 'logout') {
//session is already destroyed - so no sense to check anything here
}
elseif ($op == 'delete') {
_hybridauth_identity_delete_by_uid($account->uid);
_hybridauth_session_delete_by_uid($account->uid);
}
}
/**
* Implements hook_form_alter().
*/
function hybridauth_form_alter(&$form, &$form_state, $form_id) {
_hybridauth_form_alter($form, $form_state, $form_id);
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function hybridauth_form_comment_form_alter(&$form, &$form_state) {
_hybridauth_form_alter($form, $form_state, 'comment_form');
}
function _hybridauth_form_alter(&$form, &$form_state, $form_id) {
if (user_access('use hybridauth') && user_is_anonymous() && in_array($form_id, array_filter(variable_get('hybridauth_forms', array(
'user_login',
'user_login_block',
))))) {
$form['hybridauth'] = array(
'#type' => 'hybridauth_widget',
'#weight' => variable_get('hybridauth_widget_weight', 100),
);
}
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function hybridauth_form_user_profile_form_alter(&$form, &$form_state) {
if (!empty($form['_account']['#value']->hybridauth)) {
if (variable_get('hybridauth_disable_username_change', 1)) {
$form['account']['name']['#access'] = FALSE;
}
if (variable_get('hybridauth_remove_password_fields', 1)) {
unset($form['account']['pass']);
}
}
}
/**
* Implements hook_elements().
*/
function hybridauth_elements() {
$types = array();
$types['hybridauth_widget'] = array(
'#input' => FALSE,
'#theme' => 'hybridauth_widget',
// '#theme_wrappers' => array('form_element'),
'#hybridauth_id' => 'hybridauth',
'#title' => variable_get('hybridauth_widget_title', 'Or log in with...'),
// Setting weight here doesn't work in Drupal 6.
// '#weight' => variable_get('hybridauth_widget_weight', 100),
'#hybridauth_window_type' => variable_get('hybridauth_window_type', 'popup'),
'#hybridauth_widget_type' => variable_get('hybridauth_widget_type', 'list'),
'#hybridauth_widget_use_overlay' => variable_get('hybridauth_widget_use_overlay', 1),
'#hybridauth_widget_link_text' => variable_get('hybridauth_widget_link_text', 'Social network account'),
'#hybridauth_widget_link_title' => variable_get('hybridauth_widget_link_title', 'Social network account'),
'#hybridauth_widget_icon_pack' => variable_get('hybridauth_widget_icon_pack', 'hybridauth_32'),
'#hybridauth_widget_hide_links' => variable_get('hybridauth_widget_hide_links', 0),
'#hybridauth_destination' => variable_get('hybridauth_destination', ''),
);
return $types;
}
/**
* Implements hook_theme().
*/
function hybridauth_theme($existing, $type, $theme, $path) {
return array(
'hybridauth_admin_settings_providers_table' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'hybridauth.admin.inc',
),
'hybridauth_widget' => array(
'arguments' => array(
'element' => NULL,
),
'template' => 'templates/hybridauth_widget',
'file' => 'hybridauth.theme.inc',
),
'hybridauth_provider_icon' => array(
'arguments' => array(
'icon_pack' => 'hybridauth_32',
'provider_id' => NULL,
'provider_name' => NULL,
),
'template' => 'templates/hybridauth_provider_icon',
'file' => 'hybridauth.theme.inc',
),
'hybridauth_close_page' => array(
'arguments' => array(
'redirect' => TRUE,
'destination' => NULL,
),
'template' => 'templates/hybridauth_close_page',
),
);
}
/**
* Implements hook_username_alter().
*/
/*function hybridauth_username_alter(&$name, $account) {
// Don't alter anonymous users or objects that do not have any user ID.
if (empty($account->uid)) {
return;
}
$account2 = user_load($account->uid);
if (!empty($account2->data['hybridauth']) && !module_exists('realname')) {
$hybridauth_pattern = variable_get('hybridauth_display_name', '[hybridauth_firstName] [hybridauth_lastName]');
$pattern = str_replace('[user:name]', $account2->name, $hybridauth_pattern);
$hybridauth_name = token_replace($pattern, array('user' => $account2), array('clear' => TRUE));
$name = trim(strip_tags($hybridauth_name));
}
}*/
/**
* Implements hook_realname_alter().
*/
/*function hybridauth_realname_alter(&$realname, $account) {
if (!empty($account->data['hybridauth']) && variable_get('hybridauth_override_realname', 0)) {
$hybridauth_pattern = variable_get('hybridauth_display_name', '[hybridauth_firstName] [hybridauth_lastName]');
$pattern = str_replace('[user:name]', $realname, $hybridauth_pattern);
$hybridauth_name = token_replace($pattern, array('user' => $account), array('clear' => TRUE));
$realname = trim(strip_tags($hybridauth_name));
}
}*/
/**
* Implements hook_ctools_plugin_TYPE().
*/
function hybridauth_ctools_plugin_icon_pack() {
return array(
'load themes' => TRUE,
);
}
/**
* Load metadata for a single icon pack without loading all icon packs.
*/
function hybridauth_get_icon_pack($name) {
ctools_include('plugins');
return ctools_get_plugins('hybridauth', 'icon_pack', $name);
}
/**
* Load metadata for all icon packs
*/
function hybridauth_get_icon_packs() {
ctools_include('plugins');
return ctools_get_plugins('hybridauth', 'icon_pack');
}
/**
* Implements hook_ctools_plugin_directory().
*/
function hybridauth_ctools_plugin_directory($module, $type) {
if ($module == 'hybridauth' && $type == 'icon_pack') {
return 'plugins/icon_pack';
}
}
/**
* Implements hook_email_registration_name().
*/
function hybridauth_email_registration_name($edit, $account) {
global $hybridauth_data;
if (!empty($hybridauth_data) || !empty($account->hybridauth)) {
return $account->name;
}
return NULL;
}
/**
* Implements hook_robotstxt().
*/
function hybridauth_robotstxt() {
return array(
'#HybridAuth paths',
'Disallow: /hybridauth/',
'Disallow: /?q=hybridauth/',
);
}
/**
* Internal functions.
*/
function hybridauth_providers_list() {
static $providers;
if (!isset($providers)) {
$raw_providers = array(
//core providers
'AOL' => t('AOL'),
'Facebook' => t('Facebook'),
'Foursquare' => t('Foursquare'),
'Google' => t('Google'),
'LinkedIn' => t('LinkedIn'),
'Live' => t('Windows Live'),
'MySpace' => t('MySpace'),
'OpenID' => t('OpenID'),
'Twitter' => t('Twitter'),
'Yahoo' => t('Yahoo'),
//additional providers
'px500' => t('500px'),
'Disqus' => t('Disqus'),
'FamilySearch' => t('FamilySearch'),
'Geni' => t('Geni'),
'GitHub' => t('GitHub'),
'Goodreads' => t('Goodreads'),
//'Gowalla' => t('Gowalla'), //RIP
'Identica' => t('Identica'),
'Instagram' => t('Instagram'),
'LastFM' => t('LastFM'),
'Mailru' => t('Mail.ru'),
'Murmur' => t('Murmur'),
'MyHeritage' => t('MyHeritage'),
'Odnoklassniki' => t('Odnoklassniki'),
'Pixnet' => t('Pixnet'),
'Plurk' => t('Plurk'),
'QQ' => t('QQ'),
'Sina' => t('Sina'),
'Skyrock' => t('Skyrock'),
'Steam' => t('Steam'),
'Tumblr' => t('Tumblr'),
'TwitchTV' => t('Twitch.tv'),
'Viadeo' => t('Viadeo'),
'Vimeo' => t('Vimeo'),
'Vkontakte' => t('VKontakte'),
'Yandex' => t('Yandex'),
);
foreach (hybridauth_providers_files() as $name => $file) {
if (!array_key_exists($name, $raw_providers)) {
$raw_providers[$name] = $name;
}
}
$providers = array();
$weights = array();
foreach ($raw_providers as $provider_id => $provider_name) {
$weights[$provider_id] = variable_get('hybridauth_provider_' . $provider_id . '_weight', 0);
}
asort($weights);
foreach ($weights as $provider_id => $weight) {
$providers[$provider_id] = $raw_providers[$provider_id];
}
}
return $providers;
}
/**
* Returns available providers files, keyed by filename without extension.
*/
function hybridauth_providers_files() {
$cache = cache_get('hybridauth_providers_files');
if (!empty($cache->data)) {
$files = $cache->data;
}
else {
$files = file_scan_directory(_hybridauth_library_path() . '/Hybrid/Providers', '\\.php$', array(
'.',
'..',
'CVS',
), 0, TRUE, 'name');
cache_set('hybridauth_providers_files', $files, 'cache', CACHE_TEMPORARY);
}
return $files;
}
function hybridauth_fields_list() {
return array(
'provider' => t('Authentication provider'),
'identifier' => t('UID'),
'profileURL' => t('Profile URL'),
'webSiteURL' => t('Website URL'),
'photoURL' => t('Photo URL'),
'displayName' => t('Nickname'),
'description' => t('Short bio or about me'),
'firstName' => t('First name'),
'lastName' => t('Last name'),
'gender' => t('Gender'),
'language' => t('Language'),
'age' => t('Age'),
'birthDay' => t('Birth day'),
'birthMonth' => t('Birth month'),
'birthYear' => t('Birth year'),
'email' => t('E-mail address'),
'emailVerified' => t('Verified email address'),
'phone' => t('Phone number'),
'address' => t('Address'),
'country' => t('Country'),
'region' => t('State or region'),
'city' => t('City'),
'zip' => t('Postal code or zipcode'),
);
}
/**
* Returns auth provider name by provider ID.
*/
function hybridauth_get_provider_name($provider_id) {
$providers = hybridauth_providers_list();
return isset($providers[$provider_id]) ? $providers[$provider_id] : NULL;
}
function hybridauth_get_enabled_providers() {
static $providers;
if (!isset($providers)) {
$providers = array();
foreach (hybridauth_providers_list() as $provider_id => $provider_name) {
if ($provider_config = hybridauth_get_provider_config($provider_id)) {
$providers[$provider_id] = $provider_name;
}
}
}
return $providers;
}
function hybridauth_get_instance() {
static $controller;
if (!isset($controller)) {
$controller = FALSE;
if ($lib_path = _hybridauth_library_path()) {
try {
require_once $lib_path . '/Hybrid/Auth.php';
$config = hybridauth_get_config();
$controller = new Hybrid_Auth($config);
} catch (Exception $e) {
//watchdog_exception('hybridauth', $e);
watchdog('hybridauth', $e
->getMessage(), array(), WATCHDOG_ERROR);
}
}
}
return $controller;
}
function hybridauth_get_config() {
static $config;
if (!isset($config)) {
if (variable_get('hybridauth_debug', FALSE) && !file_exists(file_directory_temp() . '/hybridauth.debug.log')) {
file_put_contents(file_directory_temp() . '/hybridauth.debug.log', '');
}
$config = array(
'base_url' => url('hybridauth/endpoint', array(
'absolute' => TRUE,
)),
'providers' => array(),
'debug_mode' => variable_get('hybridauth_debug', FALSE),
'debug_file' => file_directory_temp() . '/hybridauth.debug.log',
);
foreach (hybridauth_providers_list() as $provider_id => $provider_name) {
if ($provider_config = hybridauth_get_provider_config($provider_id)) {
$config['providers'][$provider_id] = $provider_config;
}
}
}
return $config;
}
/**
* Returns provider config.
*/
function hybridauth_get_provider_config($provider_id, $enabled_only = TRUE) {
$config = NULL;
$enabled = variable_get('hybridauth_provider_' . $provider_id . '_enabled', 0);
if (!$enabled_only || $enabled) {
$config = array(
'enabled' => $enabled,
'keys' => array(
'id' => trim(variable_get('hybridauth_provider_' . $provider_id . '_keys_id', '')),
'key' => trim(variable_get('hybridauth_provider_' . $provider_id . '_keys_key', '')),
'secret' => trim(variable_get('hybridauth_provider_' . $provider_id . '_keys_secret', '')),
),
'scope' => variable_get('hybridauth_provider_' . $provider_id . '_scope', ''),
'display' => variable_get('hybridauth_provider_' . $provider_id . '_display', 'popup'),
'hauth_return_to' => url('hybridauth/endpoint'),
);
if (is_array($config['scope'])) {
$config['scope'] = array_filter($config['scope']);
}
}
return $config;
}
/**
* Returns connected providers for the current user.
*/
function hybridauth_get_connected_providers() {
$connected_providers = array();
if (user_is_logged_in() && ($hybridauth = hybridauth_get_instance())) {
try {
foreach ($hybridauth
->getConnectedProviders() as $provider_id) {
$connected_providers[$provider_id] = hybridauth_get_provider_name($provider_id);
}
} catch (Exception $e) {
//watchdog_exception('hybridauth', $e);
watchdog('hybridauth', $e
->getMessage(), array(), WATCHDOG_ERROR);
}
}
return $connected_providers;
}
/**
* Returns the path to the HybridAuth library.
*/
function _hybridauth_library_path() {
static $library_path;
if (!isset($library_path)) {
$library_path = variable_get('hybridauth_library_path', module_exists('libraries') ? libraries_get_path('hybridauth') : 'sites/all/libraries/hybridauth');
if (file_exists($library_path . '/Hybrid/Auth.php')) {
//return $library_path;
}
elseif (file_exists($library_path . '/hybridauth/Hybrid/Auth.php')) {
$library_path .= '/hybridauth';
}
else {
watchdog('hybridauth', 'HybridAuth library is missing.', array(), WATCHDOG_ERROR);
return FALSE;
}
}
return $library_path;
}
function _hybridauth_add_icon_pack_files($name) {
static $done;
if (!isset($done[$name])) {
$done[$name] = TRUE;
$icon_pack = hybridauth_get_icon_pack($name);
if (!empty($icon_pack['css'])) {
drupal_add_css($icon_pack['path'] . '/' . $icon_pack['css']);
}
if (!empty($icon_pack['js'])) {
drupal_add_js($icon_pack['path'] . '/' . $icon_pack['js']);
}
}
}
function _hybridauth_make_username($data) {
if (empty($data['username'])) {
$pattern = variable_get('hybridauth_username', '[firstName] [lastName]');
$hybridauth_name = $desired_name = trim(token_replace($pattern, 'hybridauth', $data, '[', ']', array(
'clear' => TRUE,
)));
}
else {
$hybridauth_name = $desired_name = trim($data['username']);
}
$counter = 0;
while (user_load(array(
'name' => $hybridauth_name,
))) {
$counter++;
$hybridauth_name = $desired_name . ' ' . $counter;
}
$name = $hybridauth_name;
drupal_alter('hybridauth_username', $name, $data);
//check that the altered username is unique
if ($name == $hybridauth_name || user_load(array(
'name' => $name,
))) {
return $hybridauth_name;
}
else {
return $name;
}
}
function _hybridauth_user_is_blocked_by_uid($uid) {
return db_fetch_object(db_query("SELECT name FROM {users} WHERE status = 0 AND uid = %d", $uid));
}
function _hybridauth_user_login_access_by_uid($uid) {
$login = db_result(db_query("SELECT login FROM {users} WHERE uid = %d", $uid));
return !($login == 280281600);
//Dries birthday timestamp, Nov 19, 1978 :)
}
function _hybridauth_provider_identifier($identifier) {
$provider_identifier = strlen($identifier) > 32 ? md5($identifier . HYBRIDAUTH_HASH_SALT) : $identifier;
return $provider_identifier;
}
function _hybridauth_identity_save($data, $uid = NULL) {
global $user;
$uid = $uid ? $uid : $user->uid;
//check if this identity is already registered - this might not be needed
//db_result(db_query("SELECT uid FROM {hybridauth_identity} WHERE provider = '%s' AND provider_identifier = '%s'",
// $data['provider'], $data['identifier']));
//TODO: use drupal_write_record()?
db_query("INSERT INTO {hybridauth_identity} (uid, provider, provider_identifier, data) VALUES (%d, '%s', '%s', '%s')", $uid, $data['provider'], _hybridauth_provider_identifier($data['identifier']), serialize($data));
_hybridauth_session_sync_data($uid);
}
function _hybridauth_identity_load($data) {
$result = db_query("SELECT * FROM {hybridauth_identity} WHERE provider = '%s' AND provider_identifier = '%s'", $data['provider'], _hybridauth_provider_identifier($data['identifier']));
return db_fetch_array($result);
}
function _hybridauth_identity_load_by_uid($uid) {
$result = db_query("SELECT * FROM {hybridauth_identity} WHERE uid = %d", $uid);
$identities = array();
while ($identity = db_fetch_array($result)) {
$identities[$identity['id']] = $identity;
}
return $identities;
}
function _hybridauth_identity_load_by_id($id) {
$result = db_query("SELECT * FROM {hybridauth_identity} WHERE id = %d", $id);
return db_fetch_array($result);
}
function _hybridauth_identity_delete_by_uid($uid) {
$result = db_query("DELETE FROM {hybridauth_identity} WHERE uid = %d", $uid);
return $result;
}
function _hybridauth_identity_delete_by_id($id) {
$result = db_query("DELETE FROM {hybridauth_identity} WHERE id = %d", $id);
return $result;
}
function _hybridauth_session_save($data, $uid = NULL) {
global $user;
$uid = $uid ? $uid : $user->uid;
_hybridauth_session_delete_by_uid($uid);
//TODO: use drupal_write_record()?
db_query("INSERT INTO {hybridauth_session} (uid, data, updated) VALUES (%d, '%s', %d)", $uid, $data, time());
}
function _hybridauth_session_load_by_uid($uid) {
$result = db_query("SELECT * FROM {hybridauth_session} WHERE uid = %d", $uid);
return db_fetch_array($result);
}
function _hybridauth_session_delete_by_uid($uid) {
$result = db_query("DELETE FROM {hybridauth_session} WHERE uid = %d", $uid);
return $result;
}
function _hybridauth_session_sync_data($uid) {
if ($hybridauth = hybridauth_get_instance()) {
$hybridauth_session_data_current = unserialize($hybridauth
->getSessionData());
if (is_array($hybridauth_session_data_current)) {
if ($hybridauth_session = _hybridauth_session_load_by_uid($uid)) {
$hybridauth_session_data_ser = $hybridauth_session['data'];
$hybridauth_session_data_ser = serialize(array_merge(unserialize($hybridauth_session_data_ser), $hybridauth_session_data_current));
// Call Hybrid_Auth::restoreSessionData() to set stored data.
$hybridauth
->restoreSessionData($hybridauth_session_data_ser);
_hybridauth_session_save($hybridauth_session_data_ser, $uid);
}
else {
_hybridauth_session_save(serialize($hybridauth_session_data_current), $uid);
}
}
elseif ($hybridauth_session = _hybridauth_session_load_by_uid($uid)) {
// Call Hybrid_Auth::restoreSessionData() to set stored data.
$hybridauth
->restoreSessionData($hybridauth_session['data']);
}
}
}
Functions
Constants
Name | Description |
---|---|
HYBRIDAUTH_HASH_SALT | @file Main file for the HybridAuth module. |