]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Facebook Connect auth finally works with all major browsers!
authorZach Copley <zach@controlyourself.ca>
Thu, 4 Jun 2009 21:33:04 +0000 (21:33 +0000)
committerZach Copley <zach@controlyourself.ca>
Thu, 4 Jun 2009 21:33:04 +0000 (21:33 +0000)
plugins/FBConnect/FBC_XDReceiver.php [new file with mode: 0644]
plugins/FBConnect/FBConnectLogin.php
plugins/FBConnect/FBConnectPlugin.php
plugins/FBConnect/xd_receiver.htm [deleted file]

diff --git a/plugins/FBConnect/FBC_XDReceiver.php b/plugins/FBConnect/FBC_XDReceiver.php
new file mode 100644 (file)
index 0000000..57c98b4
--- /dev/null
@@ -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');
+    }
+
+}
+
index 7989dc854d9469b251c542fa8299631abcc05a71..205086cd8bd4b65fba2ce6384f12781ddc95a5df 100644 (file)
@@ -58,8 +58,6 @@ class FBConnectLoginAction extends Action
     function showContent() {
 
         $this->elementStart('fieldset');
-
-
         $this->element('fb:login-button', array('onlogin' => 'goto_login()',
             'length' => 'long'));
 
index c85ef432d4f07c4131e1e10300195faca0f3f067..a366985be424432c076dadadd8fe54cc922a9088 100644 (file)
@@ -39,6 +39,7 @@ require_once INSTALLDIR . '/plugins/FBConnect/FBConnectLogin.php';
 require_once INSTALLDIR . '/plugins/FBConnect/FBConnectSettings.php';
 require_once INSTALLDIR . '/plugins/FBConnect/FBCLoginGroupNav.php';
 require_once INSTALLDIR . '/plugins/FBConnect/FBCSettingsNav.php';
+require_once INSTALLDIR . '/plugins/FBConnect/FBC_XDReceiver.php';
 
 /**
  * Plugin to enable Facebook Connect
@@ -62,27 +63,19 @@ class FBConnectPlugin extends Plugin
         $m->connect('main/facebookconnect', array('action' => 'FBConnectAuth'));
         $m->connect('main/facebooklogin', array('action' => 'FBConnectLogin'));
         $m->connect('settings/facebook', array('action' => 'FBConnectSettings'));
+        $m->connect('xd_receiver.html', array('action' => 'FBC_XDReceiver'));
      }
 
     // Add in xmlns:fb
     function onStartShowHTML($action)
     {
-        $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ?
-        $_SERVER['HTTP_ACCEPT'] : null;
-
-        // XXX: allow content negotiation for RDF, RSS, or XRDS
-
-        $cp = common_accept_to_prefs($httpaccept);
-        $sp = common_accept_to_prefs(PAGE_TYPE_PREFS);
-
-        $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);
+        // XXX: Horrible hack to make Safari, FF2, and Chrome work with
+        // Facebook Connect. These browser cannot use Facebook's
+        // DOM parsing routines unless the mime type of the page is
+        // text/html even though Facebook Connect uses XHTML.  This is
+        // A bug in Facebook Connect, and this is a temporary solution
+        // until they fix their JavaScript libs.
+        header('Content-Type: text/html');
 
         $action->extraHeaders();
 
@@ -101,20 +94,27 @@ class FBConnectPlugin extends Plugin
         return false;
     }
 
-    function onEndShowLaconicaScripts($action)
-    {
-        $action->element('script',
-            array('type' => 'text/javascript',
-                  'src'  => 'http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php'),
-                  ' ');
+    // Note: this script needs to appear in the <body>
 
+    function onStartShowHeader($action)
+    {
         $apikey = common_config('facebook', 'apikey');
         $plugin_path = common_path('plugins/FBConnect');
 
         $login_url = common_local_url('FBConnectAuth');
         $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() {
                                 window.location = "%s";
@@ -123,11 +123,21 @@ class FBConnectPlugin extends Plugin
                             function goto_logout() {
                                 window.location = "%s";
                             }
+                          </script>', $apikey,
+                              $login_url, $logout_url);
 
-                         </script>', $apikey, $plugin_path, $login_url, $logout_url);
+        $action->raw($html);
+    }
 
+    // Note: this script needs to appear as close as possible to </body>
 
-        $action->raw($html);
+    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)
@@ -143,7 +153,8 @@ class FBConnectPlugin extends Plugin
 
         if ($user) {
 
-            $flink = Foreign_link::getByUserId($user->id, FACEBOOK_CONNECT_SERVICE);
+            $flink = Foreign_link::getByUserId($user->id,
+                FACEBOOK_CONNECT_SERVICE);
             $fbuid = 0;
 
             if ($flink) {
diff --git a/plugins/FBConnect/xd_receiver.htm b/plugins/FBConnect/xd_receiver.htm
deleted file mode 100644 (file)
index 43fb2c4..0000000
+++ /dev/null
@@ -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>