Facebook Connect auth finally works with all major browsers!

This commit is contained in:
Zach Copley 2009-06-04 21:33:04 +00:00
parent fe38827a76
commit 4f5630099f
4 changed files with 111 additions and 39 deletions

View File

@ -0,0 +1,73 @@
<?php
if (!defined('LACONICA')) {
exit(1);
}
/*
* Generates the cross domain communication channel file
* (xd_receiver.html). By generating it we can add some caching
* instructions.
*
* See: http://wiki.developers.facebook.com/index.php/Cross_Domain_Communication_Channel
*/
class FBC_XDReceiverAction extends Action
{
/**
* Do we need to write to the database?
*
* @return boolean true
*/
function isReadonly()
{
return true;
}
/**
* Handle a request
*
* @param array $args Arguments from $_REQUEST
*
* @return void
*/
function handle($args)
{
// Parent handling, including cache check
parent::handle($args);
$this->showPage();
}
function showPage()
{
// cache the xd_receiver
header('Cache-Control: max-age=225065900');
header('Expires:');
header('Pragma:');
$this->startXML('html',
'-//W3C//DTD XHTML 1.0 Strict//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
$language = $this->getLanguage();
$this->elementStart('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
'xml:lang' => $language,
'lang' => $language));
$this->elementStart('head');
$this->element('title', null, 'cross domain receiver page');
$this->element('script',
array('src' =>
'http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.debug.js',
'type' => 'text/javascript'), '');
$this->elementEnd('head');
$this->elementStart('body');
$this->elementEnd('body');
$this->elementEnd('html');
}
}

View File

@ -58,8 +58,6 @@ class FBConnectLoginAction extends Action
function showContent() { function showContent() {
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->element('fb:login-button', array('onlogin' => 'goto_login()', $this->element('fb:login-button', array('onlogin' => 'goto_login()',
'length' => 'long')); 'length' => 'long'));

View File

@ -39,6 +39,7 @@ require_once INSTALLDIR . '/plugins/FBConnect/FBConnectLogin.php';
require_once INSTALLDIR . '/plugins/FBConnect/FBConnectSettings.php'; require_once INSTALLDIR . '/plugins/FBConnect/FBConnectSettings.php';
require_once INSTALLDIR . '/plugins/FBConnect/FBCLoginGroupNav.php'; require_once INSTALLDIR . '/plugins/FBConnect/FBCLoginGroupNav.php';
require_once INSTALLDIR . '/plugins/FBConnect/FBCSettingsNav.php'; require_once INSTALLDIR . '/plugins/FBConnect/FBCSettingsNav.php';
require_once INSTALLDIR . '/plugins/FBConnect/FBC_XDReceiver.php';
/** /**
* Plugin to enable Facebook Connect * Plugin to enable Facebook Connect
@ -62,27 +63,19 @@ class FBConnectPlugin extends Plugin
$m->connect('main/facebookconnect', array('action' => 'FBConnectAuth')); $m->connect('main/facebookconnect', array('action' => 'FBConnectAuth'));
$m->connect('main/facebooklogin', array('action' => 'FBConnectLogin')); $m->connect('main/facebooklogin', array('action' => 'FBConnectLogin'));
$m->connect('settings/facebook', array('action' => 'FBConnectSettings')); $m->connect('settings/facebook', array('action' => 'FBConnectSettings'));
$m->connect('xd_receiver.html', array('action' => 'FBC_XDReceiver'));
} }
// Add in xmlns:fb // Add in xmlns:fb
function onStartShowHTML($action) function onStartShowHTML($action)
{ {
$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? // XXX: Horrible hack to make Safari, FF2, and Chrome work with
$_SERVER['HTTP_ACCEPT'] : null; // Facebook Connect. These browser cannot use Facebook's
// DOM parsing routines unless the mime type of the page is
// XXX: allow content negotiation for RDF, RSS, or XRDS // text/html even though Facebook Connect uses XHTML. This is
// A bug in Facebook Connect, and this is a temporary solution
$cp = common_accept_to_prefs($httpaccept); // until they fix their JavaScript libs.
$sp = common_accept_to_prefs(PAGE_TYPE_PREFS); header('Content-Type: text/html');
$type = common_negotiate_type($cp, $sp);
if (!$type) {
throw new ClientException(_('This page is not available in a '.
'media type you accept'), 406);
}
header('Content-Type: '.$type);
$action->extraHeaders(); $action->extraHeaders();
@ -101,20 +94,27 @@ class FBConnectPlugin extends Plugin
return false; return false;
} }
function onEndShowLaconicaScripts($action) // Note: this script needs to appear in the <body>
{
$action->element('script',
array('type' => 'text/javascript',
'src' => 'http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php'),
' ');
function onStartShowHeader($action)
{
$apikey = common_config('facebook', 'apikey'); $apikey = common_config('facebook', 'apikey');
$plugin_path = common_path('plugins/FBConnect'); $plugin_path = common_path('plugins/FBConnect');
$login_url = common_local_url('FBConnectAuth'); $login_url = common_local_url('FBConnectAuth');
$logout_url = common_local_url('logout'); $logout_url = common_local_url('logout');
$html = sprintf('<script type="text/javascript">FB.init("%s", "%s/xd_receiver.htm"); // XXX: Facebook says we don't need this FB_RequireFeatures(),
// but we actually do, for IE and Safari. Gar.
$html = sprintf('<script type="text/javascript">
window.onload = function () {
FB_RequireFeatures(
["XFBML"],
function() {
FB.Facebook.init("%s", "../xd_receiver.html");
}
); }
function goto_login() { function goto_login() {
window.location = "%s"; window.location = "%s";
@ -123,13 +123,23 @@ class FBConnectPlugin extends Plugin
function goto_logout() { function goto_logout() {
window.location = "%s"; window.location = "%s";
} }
</script>', $apikey,
</script>', $apikey, $plugin_path, $login_url, $logout_url); $login_url, $logout_url);
$action->raw($html); $action->raw($html);
} }
// Note: this script needs to appear as close as possible to </body>
function onEndShowFooter($action)
{
$action->element('script',
array('type' => 'text/javascript',
'src' => 'http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php'),
'');
}
function onEndShowLaconicaStyles($action) function onEndShowLaconicaStyles($action)
{ {
$action->element('link', array('rel' => 'stylesheet', $action->element('link', array('rel' => 'stylesheet',
@ -143,7 +153,8 @@ class FBConnectPlugin extends Plugin
if ($user) { if ($user) {
$flink = Foreign_link::getByUserId($user->id, FACEBOOK_CONNECT_SERVICE); $flink = Foreign_link::getByUserId($user->id,
FACEBOOK_CONNECT_SERVICE);
$fbuid = 0; $fbuid = 0;
if ($flink) { if ($flink) {

View File

@ -1,10 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>cross domain receiver page</title>
</head>
<body>
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.debug.js" type="text/javascript"></script>
</body>
</html>