View source
<?php
function fboauth_menu() {
$items['fboauth/%fboauth_action'] = array(
'title' => 'Facebook connect',
'page callback' => 'fboauth_action_page',
'page arguments' => array(
1,
),
'access callback' => TRUE,
'file' => 'includes/fboauth.fboauth.inc',
'type' => MENU_CALLBACK,
);
$items['fboauth/deauthorize'] = array(
'title' => 'Facebook deauthorize',
'page callback' => 'fboauth_deauthorize',
'access callback' => TRUE,
'file' => 'includes/fboauth.fboauth.inc',
'type' => MENU_CALLBACK,
);
$items['admin/settings/fboauth'] = array(
'title' => t('Facebook OAuth settings'),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'fboauth_settings_form',
),
'access arguments' => array(
'administer users',
),
'file' => 'includes/fboauth.pages.inc',
'description' => 'Configure site for Facebook Connect and map Facebook information to user profiles.',
'type' => MENU_NORMAL_ITEM,
);
$items['user/%user/fboauth'] = array(
'title' => t('Facebook settings'),
'page callback' => 'fboauth_user_form',
'page arguments' => array(
1,
),
'access callback' => 'user_edit_access',
'access arguments' => array(
1,
),
'file' => 'includes/fboauth.pages.inc',
);
return $items;
}
function fboauth_theme() {
return array(
'fboauth_action' => array(
'pattern' => 'fboauth_action__[a-z0-9_]+',
'arguments' => array(
'action' => NULL,
'properties' => NULL,
),
),
'fboauth_action__connect' => array(
'arguments' => array(
'action' => NULL,
'properties' => NULL,
),
),
'fboauth_user_form_connect' => array(
'arguments' => array(
'uid' => NULL,
'fbid' => NULL,
),
),
'fboauth_user_info' => array(
'arguments' => array(
'account' => NULL,
),
'file' => 'includes/fboauth.pages.inc',
),
);
}
function fboauth_block($op = 'list', $delta = '', $edit = array()) {
switch ($op) {
case 'list':
return fboauth_block_info();
case 'view':
return fboauth_block_view($delta);
}
}
function fboauth_block_info() {
$blocks['login'] = array(
'info' => t('Facebook login'),
);
return $blocks;
}
function fboauth_block_view($delta) {
$block = array();
if (variable_get('fboauth_id', '') && !fboauth_fbid_load()) {
$redirect = arg(0) === 'user' && (arg(1) === 'login' || arg(1) == '') ? NULL : $_GET['q'];
$block['content'] = fboauth_action_display('connect', $redirect);
}
return $block;
}
function fboauth_user($op, &$edit, &$account, $category = NULL) {
switch ($op) {
case 'insert':
fboauth_user_insert($edit, $account, $category);
break;
case 'update':
fboauth_user_update($edit, $account, $category);
break;
case 'delete':
fboauth_user_delete($account);
break;
}
}
function fboauth_user_insert(&$edit, &$account, $category) {
if (isset($edit['fboauth_fbid'])) {
fboauth_save($account->uid, $edit['fboauth_fbid']);
}
}
function fboauth_user_update(&$edit, &$account, $category) {
if (isset($edit['fboauth_fbid'])) {
fboauth_save($account->uid, $edit['fboauth_fbid']);
}
}
function fboauth_user_delete($account) {
fboauth_save($account->uid, NULL);
}
function fboauth_form_user_profile_form_alter(&$form, &$form_state) {
$uid = $form['#uid'];
$fbid = fboauth_fbid_load($uid);
$fboauth_form = array(
'#type' => 'item',
'#title' => t('Facebook connect'),
'#children' => theme('fboauth_user_form_connect', $uid, $fbid),
);
$account_form = isset($form['account']) ? $form['account'] : $form;
$temp_form = array();
foreach (element_children($account_form) as $child) {
$temp_form[$child] = $account_form[$child];
if ($child == 'mail') {
if (isset($temp_form[$child]['#weight'])) {
$fboauth_form['#weight'] = $temp_form[$child]['#weight'];
}
$temp_form['fboauth'] = $fboauth_form;
}
unset($account_form[$child]);
}
$account_form += $temp_form;
if (isset($form['account'])) {
$form['account'] = $account_form;
}
else {
$form = $account_form;
}
}
function fboauth_fboauth_actions() {
$actions = array();
$actions['connect'] = array(
'title' => t('Connect'),
'file' => 'includes/fboauth.fboauth.inc',
'callback' => 'fboauth_action_connect',
'permissions' => array_keys(fboauth_user_connect_permissions()),
);
$actions['deauth'] = array(
'title' => t('Deauthorize'),
'file' => 'includes/fboauth.fboauth.inc',
'callback' => 'fboauth_action_deauth',
);
return $actions;
}
function fboauth_action_load($action_name) {
static $actions;
if (!isset($actions)) {
$actions = array();
module_load_include('inc', 'fboauth', 'includes/fboauth.fboauth');
foreach (module_implements('fboauth_actions') as $module) {
if ($module_actions = module_invoke($module, 'fboauth_actions')) {
foreach ($module_actions as $module_action_name => $module_action) {
$module_action['name'] = $module_action_name;
$module_action['module'] = $module;
$module_action['file path'] = isset($module_action['file path']) ? $module_action['file path'] : drupal_get_path('module', $module);
$module_action['properties'] = isset($module_action['properties']) ? $module_action['properties'] : array();
$module_action['connections'] = isset($module_action['connections']) ? $module_action['connections'] : array();
$module_action['permissions'] = isset($module_action['permissions']) ? $module_action['permissions'] : array();
$actions[$module_action_name] = $module_action;
}
}
}
drupal_alter('fboauth_actions', $actions);
}
$action = isset($actions[$action_name]) ? $actions[$action_name] : FALSE;
if ($action) {
if (isset($action['file'])) {
$file = './' . $action['file path'] . '/' . $action['file'];
if (file_exists($file)) {
include_once $file;
}
}
}
return $action;
}
function fboauth_fbid_load($uid = NULL) {
$uid = isset($uid) ? $uid : $GLOBALS['user']->uid;
$result = db_query("SELECT fbid FROM {fboauth_users} WHERE uid = %d", $uid);
$fbid = db_result($result);
return $fbid ? $fbid : FALSE;
}
function fboauth_uid_load($fbid) {
$result = db_query("SELECT uid FROM {fboauth_users} WHERE fbid = %d", $fbid);
$uid = db_result($result);
return $uid ? (int) $uid : FALSE;
}
function fboauth_save($uid, $fbid) {
$delete_query = 'DELETE FROM {fboauth_users} WHERE uid = %d';
$delete_arguments = array(
$uid,
);
if (isset($fbid)) {
$delete_query .= ' OR fbid = %d';
$delete_arguments[] = $fbid;
}
db_query($delete_query, $delete_arguments);
if (!empty($fbid)) {
db_query('INSERT INTO {fboauth_users} (uid, fbid) VALUES (%d, %d)', $uid, $fbid);
}
}
function fboauth_action_display($action_name, $redirect = NULL, $app_id = NULL) {
$app_id = isset($app_id) ? $app_id : variable_get('fboauth_id', '');
$action = fboauth_action_load($action_name);
$link = fboauth_action_link_properties($action_name, $redirect, $app_id);
$theme = isset($action['theme']) ? $action['theme'] : array(
'fboauth_action__' . $action_name,
'fboauth_action',
);
return theme($theme, $action, $link);
}
function fboauth_action_link_properties($action_name, $redirect = NULL, $app_id = NULL) {
$app_id = isset($app_id) ? $app_id : variable_get('fboauth_id', '');
$action = fboauth_action_load($action_name);
if (!empty($action['permissions'])) {
$permissions = $action['permissions'];
}
elseif (!empty($action['properties']) || !empty($action['connections'])) {
$properties = $action['properties'];
$connections = $action['connections'];
$permissions = array_keys(fboauth_user_permissions(array_merge($properties, $connections)));
}
else {
$permissions = array();
}
$query = array();
if (isset($redirect)) {
$query['destination'] = $redirect;
}
elseif (!empty($_GET['destination'])) {
$query['destination'] = $_GET['destination'];
}
if (isset($query['destination']) && $query['destination'] === variable_get('site_frontpage', 'node')) {
unset($query['destination']);
}
$return = array(
'query' => array(
'client_id' => $app_id,
'redirect_uri' => fboauth_action_url('fboauth/' . $action_name, array(
'absolute' => TRUE,
'query' => $query,
)),
),
'href' => 'https://www.facebook.com/dialog/oauth',
);
if ($permissions) {
$return['query']['scope'] = implode(',', $permissions);
}
return $return;
}
function fboauth_action_url($path = NULL, array $options = array()) {
$url = url($path, $options);
$query_pos = strpos($url, '?');
if ($query_pos !== FALSE) {
$url_string = substr($url, 0, $query_pos);
$query_string = substr($url, $query_pos);
$url = $url_string . str_replace('/', '%2F', $query_string);
}
return $url;
}
function theme_fboauth_action($action, $link) {
$link['attributes']['class'] = isset($link['attributes']['class']) ? $link['attributes']['class'] : 'form-button facebook-button facebook-action-' . str_replace('_', '-', $action['name']);
$link['attributes']['name'] = isset($link['attributes']['name']) ? $link['attributes']['name'] : 'facebook_action_' . $action['name'];
$link['attributes']['type'] = 'button';
$attributes = drupal_attributes($link['attributes']);
$url = url($link['href'], array(
'query' => $link['query'],
));
$content = '<button ' . $attributes . ' onclick="window.location = \'' . $url . '\'; return false;">' . check_plain($action['title']) . '</button>';
return $content;
}
function theme_fboauth_action__connect($action, $link) {
$url = url($link['href'], array(
'query' => $link['query'],
));
$link['attributes']['class'] = isset($link['attributes']['class']) ? $link['attributes']['class'] : 'facebook-action-connect';
$link['attributes']['rel'] = 'nofollow';
$attributes = isset($link['attributes']) ? drupal_attributes($link['attributes']) : '';
$title = isset($link['title']) ? check_plain($link['title']) : '';
$src = (empty($_SERVER['HTTPS']) ? 'http' : 'https') . '://www.facebook.com/images/fbconnect/login-buttons/connect_light_medium_short.gif';
return '<a ' . $attributes . ' href="' . $url . '"><img src="' . $src . '" alt="' . $title . '" /></a>';
}
function theme_fboauth_user_form_connect($uid, $fbid) {
if ($fbid) {
$output = t('Your account is connected with Facebook. (<a href="!url">More info</a>)', array(
'!url' => url('user/' . $uid . '/fboauth', array(
'query' => drupal_get_destination(),
)),
));
}
else {
$output = fboauth_action_display('connect', $_GET['q']);
$output .= '<div class="description">' . t('Connect with Facebook to login with your Facebook account instead of a password.') . '</div>';
}
return $output;
}