| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Plugin to add a StatusNet Facebook application | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Plugin | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2010-03-01 23:31:56 -08:00
										 |  |  |  * @copyright 2009-2010 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | define("FACEBOOK_CONNECT_SERVICE", 3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once INSTALLDIR . '/plugins/Facebook/facebookutil.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2010-03-01 23:31:56 -08:00
										 |  |  |  * Facebook plugin to add a StatusNet Facebook canvas application | 
					
						
							|  |  |  |  * and allow registration and authentication via Facebook Connect | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FacebookPlugin extends Plugin | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 23:31:56 -08:00
										 |  |  |     const VERSION = STATUSNET_VERSION; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Initializer for the plugin. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function initialize() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Allow the key and secret to be passed in
 | 
					
						
							|  |  |  |         // Control panel will override
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($this->apikey)) { | 
					
						
							|  |  |  |             $key = common_config('facebook', 'apikey'); | 
					
						
							|  |  |  |             if (empty($key)) { | 
					
						
							|  |  |  |                 Config::save('facebook', 'apikey', $this->apikey); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($this->secret)) { | 
					
						
							|  |  |  |             $secret = common_config('facebook', 'secret'); | 
					
						
							|  |  |  |             if (empty($secret)) { | 
					
						
							|  |  |  |                 Config::save( | 
					
						
							|  |  |  |                     'facebook', | 
					
						
							|  |  |  |                     'secret', | 
					
						
							|  |  |  |                     $this->secret | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Check to see if there is an API key and secret defined | 
					
						
							|  |  |  |      * for Facebook integration. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean result | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function hasKeys() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $apiKey    = common_config('facebook', 'apikey'); | 
					
						
							|  |  |  |         $apiSecret = common_config('facebook', 'secret'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($apiKey) && !empty($apiSecret)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add Facebook app actions to the router table | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Hook for RouterInitialized event. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Net_URL_Mapper &$m path-to-action mapper | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-20 11:11:18 +00:00
										 |  |  |     function onStartInitializeRouter($m) | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         $m->connect('admin/facebook', array('action' => 'facebookadminpanel')); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         if (self::hasKeys()) { | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             // Facebook App stuff
 | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             $m->connect('facebook/app', array('action' => 'facebookhome')); | 
					
						
							|  |  |  |             $m->connect('facebook/app/index.php', array('action' => 'facebookhome')); | 
					
						
							|  |  |  |             $m->connect('facebook/app/settings.php', | 
					
						
							|  |  |  |                         array('action' => 'facebooksettings')); | 
					
						
							|  |  |  |             $m->connect('facebook/app/invite.php', array('action' => 'facebookinvite')); | 
					
						
							|  |  |  |             $m->connect('facebook/app/remove', array('action' => 'facebookremove')); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             // Facebook Connect stuff
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $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')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Automatically load the actions and libraries used by the Facebook app | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Class $cls the class | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |     function onAutoload($cls) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch ($cls) { | 
					
						
							|  |  |  |         case 'FacebookAction': | 
					
						
							|  |  |  |         case 'FacebookhomeAction': | 
					
						
							|  |  |  |         case 'FacebookinviteAction': | 
					
						
							|  |  |  |         case 'FacebookremoveAction': | 
					
						
							|  |  |  |         case 'FacebooksettingsAction': | 
					
						
							| 
									
										
										
										
											2010-03-01 23:31:56 -08:00
										 |  |  |         case 'FacebookadminpanelAction': | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |             include_once INSTALLDIR . '/plugins/Facebook/' . | 
					
						
							|  |  |  |               strtolower(mb_substr($cls, 0, -6)) . '.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2009-10-21 22:02:10 +00:00
										 |  |  |         case 'FBConnectAuthAction': | 
					
						
							|  |  |  |         case 'FBConnectLoginAction': | 
					
						
							|  |  |  |         case 'FBConnectSettingsAction': | 
					
						
							|  |  |  |         case 'FBC_XDReceiverAction': | 
					
						
							|  |  |  |             include_once INSTALLDIR . '/plugins/Facebook/' . | 
					
						
							|  |  |  |               mb_substr($cls, 0, -6) . '.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         case 'FBCLoginGroupNav': | 
					
						
							|  |  |  |             include_once INSTALLDIR . '/plugins/Facebook/FBCLoginGroupNav.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         case 'FBCSettingsNav': | 
					
						
							|  |  |  |             include_once INSTALLDIR . '/plugins/Facebook/FBCSettingsNav.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |         case 'FacebookQueueHandler': | 
					
						
							|  |  |  |             include_once INSTALLDIR . '/plugins/Facebook/facebookqueuehandler.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |         default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 23:31:56 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add a Facebook tab to the admin panels | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Widget $nav Admin panel nav | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onEndAdminPanelNav($nav) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (AdminPanelAction::canAdmin('facebook')) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $action_name = $nav->action->trimmed('action'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $nav->out->menuItem( | 
					
						
							|  |  |  |                 common_local_url('facebookadminpanel'), | 
					
						
							|  |  |  |                 _m('Facebook'), | 
					
						
							|  |  |  |                 _m('Facebook integration configuration'), | 
					
						
							|  |  |  |                 $action_name == 'facebookadminpanel', | 
					
						
							|  |  |  |                 'nav_facebook_admin_panel' | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Override normal HTML output to force the content type to | 
					
						
							|  |  |  |      * text/html and add in xmlns:fb | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |     function onStartShowHTML($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($this->reqFbScripts($action)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // 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.
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |             header('Content-Type: text/html'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $action->extraHeaders(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $action->startXML('html'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $language = $action->getLanguage(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $action->elementStart('html', | 
					
						
							|  |  |  |                 array('xmlns'  => 'http://www.w3.org/1999/xhtml', | 
					
						
							|  |  |  |                       'xmlns:fb' => 'http://www.facebook.com/2008/fbml', | 
					
						
							|  |  |  |                       'xml:lang' => $language, | 
					
						
							|  |  |  |                       'lang'     => $language)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add in the Facebook Connect JavaScript stuff | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Note: this script needs to appear in the <body> | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function onEndShowScripts($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($this->reqFbScripts($action)) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |             $apikey      = common_config('facebook', 'apikey'); | 
					
						
							| 
									
										
										
										
											2010-02-17 12:03:14 -05:00
										 |  |  |             $plugin_path = 'plugins/Facebook'; | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |             $login_url  = common_local_url('FBConnectAuth'); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |             $logout_url = common_local_url('logout'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-09 20:01:46 +01:00
										 |  |  |             // XXX: Facebook says we don't need this FB_RequireFeatures(),
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |             // but we actually do, for IE and Safari. Gar.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $js .= '    $(document).ready(function () {'; | 
					
						
							|  |  |  |             $js .= '         FB_RequireFeatures('; | 
					
						
							|  |  |  |             $js .= '             ["XFBML"], function() {'; | 
					
						
							|  |  |  |             $js .= '                 FB.init("%1$s", "../xd_receiver.html");'; | 
					
						
							|  |  |  |             $js .= '             }'; | 
					
						
							|  |  |  |             $js .= '         );'; | 
					
						
							|  |  |  |             $js .= '    });'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $js .= '    function goto_login() {'; | 
					
						
							|  |  |  |             $js .= '        window.location = "%2$s";'; | 
					
						
							|  |  |  |             $js .= '    }'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // The below function alters the logout link so that it logs the user out
 | 
					
						
							|  |  |  |             // of Facebook Connect as well as the site.  However, for some pages
 | 
					
						
							|  |  |  |             // (FB Connect Settings) we need to output the FB Connect scripts (to
 | 
					
						
							| 
									
										
										
										
											2009-11-09 20:01:46 +01:00
										 |  |  |             // show an existing FB connection even if the user isn't authenticated
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |             // with Facebook connect) but NOT alter the logout link. And the only
 | 
					
						
							|  |  |  |             // way to reliably do that is with the FB Connect .js libs.  Crazy.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $js .= '    FB.ensureInit(function() {'; | 
					
						
							|  |  |  |             $js .= '        FB.Connect.ifUserConnected('; | 
					
						
							|  |  |  |             $js .= '            function() { '; | 
					
						
							|  |  |  |             $js .= '                $(\'#nav_logout a\').attr(\'href\', \'#\');'; | 
					
						
							|  |  |  |             $js .= '                $(\'#nav_logout a\').click(function() {'; | 
					
						
							|  |  |  |             $js .= '                   FB.Connect.logoutAndRedirect(\'%3$s\');'; | 
					
						
							|  |  |  |             $js .= '                   return false;'; | 
					
						
							|  |  |  |             $js .= '                })'; | 
					
						
							|  |  |  |             $js .= '            },'; | 
					
						
							|  |  |  |             $js .= '            function() {'; | 
					
						
							|  |  |  |             $js .= '                return false;'; | 
					
						
							|  |  |  |             $js .= '            }'; | 
					
						
							|  |  |  |             $js .= '        );'; | 
					
						
							|  |  |  |             $js .= '     });'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $js = sprintf($js, $apikey, $login_url, $logout_url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Compress the bugger down a bit
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |             $js = str_replace('  ', '', $js); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-04 19:41:51 -05:00
										 |  |  |             $action->inlineScript($js); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add in an additional Facebook Connect script that's supposed to | 
					
						
							|  |  |  |      * appear as close as possible to </body> | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function onEndShowFooter($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($this->reqFbScripts($action)) { | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |             $action->script('http://static.ak.connect.facebook.com' . | 
					
						
							|  |  |  |                             '/js/api_lib/v0.4/FeatureLoader.js.php'); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Output Facebook Connect specific CSS link | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |     function onEndShowStatusNetStyles($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($this->reqFbScripts($action)) { | 
					
						
							|  |  |  |             $action->cssLink('plugins/Facebook/FBConnect.css'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 22:02:10 +00:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |      * Does the Action we're plugged into require the FB Scripts?  We only | 
					
						
							|  |  |  |      * want to output FB namespace, scripts, CSS, etc. on the pages that | 
					
						
							|  |  |  |      * really need them. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |      * @param Action $action the current action | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean true | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     function reqFbScripts($action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         if (!self::hasKeys()) { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // If you're logged in w/FB Connect, you always need the FB stuff
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fbuid = $this->loggedIn(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($fbuid)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // List of actions that require FB stuff
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $needy = array('FBConnectLoginAction', | 
					
						
							|  |  |  |                        'FBConnectauthAction', | 
					
						
							|  |  |  |                        'FBConnectSettingsAction'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (in_array(get_class($action), $needy)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Is the user currently logged in with FB Connect? | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed $fbuid the Facebook ID of the logged in user, or null | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function loggedIn() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $user = common_current_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($user)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $flink = Foreign_link::getByUserId($user->id, | 
					
						
							|  |  |  |                 FACEBOOK_CONNECT_SERVICE); | 
					
						
							|  |  |  |             $fbuid = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($flink)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 try { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $facebook = getFacebook(); | 
					
						
							|  |  |  |                     $fbuid    = $facebook->get_loggedin_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 } catch (Exception $e) { | 
					
						
							|  |  |  |                     common_log(LOG_WARNING, 'Facebook Connect Plugin - ' . | 
					
						
							|  |  |  |                         'Problem getting Facebook user: ' . | 
					
						
							|  |  |  |                             $e->getMessage()); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if ($fbuid > 0) { | 
					
						
							|  |  |  |                     return $fbuid; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add in a Facebook Connect avatar to the primary nav menu | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |     function onStartPrimaryNav($action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         if (self::hasKeys()) { | 
					
						
							|  |  |  |             $user = common_current_user(); | 
					
						
							|  |  |  |             if (!empty($user)) { | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                 $fbuid = $this->loggedIn(); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                 if (!empty($fbuid)) { | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                     /* Default FB silhouette pic for FB users who haven't | 
					
						
							|  |  |  |                        uploaded a profile pic yet. */ | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                     $silhouetteUrl = | 
					
						
							|  |  |  |                         'http://static.ak.fbcdn.net/pics/q_silhouette.gif'; | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                     $url = $this->getProfilePicURL($fbuid); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                     $action->elementStart('li', array('id' => 'nav_fb')); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                     $action->element('img', array('id' => 'fbc_profile-pic', | 
					
						
							|  |  |  |                         'src' => (!empty($url)) ? $url : $silhouetteUrl, | 
					
						
							|  |  |  |                         'alt' => 'Facebook Connect User', | 
					
						
							|  |  |  |                         'width' => '16'), ''); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                     $iconurl =  common_path('plugins/Facebook/fbfavicon.ico'); | 
					
						
							|  |  |  |                     $action->element('img', array('id' => 'fb_favicon', | 
					
						
							|  |  |  |                         'src' => $iconurl)); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |                     $action->elementEnd('li'); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 00:43:20 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Add a login tab for Facebook Connect | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2009-11-25 00:43:20 +00:00
										 |  |  |      * @param Action &action the current action | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 00:43:20 +00:00
										 |  |  |     function onEndLoginGroupNav(&$action) | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         if (self::hasKeys()) { | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             $action_name = $action->trimmed('action'); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             $action->menuItem(common_local_url('FBConnectLogin'), | 
					
						
							|  |  |  |                                                _m('Facebook'), | 
					
						
							|  |  |  |                                                _m('Login or register using Facebook'), | 
					
						
							|  |  |  |                                                'FBConnectLogin' === $action_name); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-11-25 00:43:20 +00:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-25 00:43:20 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Add a tab for managing Facebook Connect settings | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action &action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onEndConnectSettingsNav(&$action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         if (self::hasKeys()) { | 
					
						
							| 
									
										
										
										
											2009-11-25 00:43:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             $action_name = $action->trimmed('action'); | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             $action->menuItem(common_local_url('FBConnectSettings'), | 
					
						
							|  |  |  |                               _m('Facebook'), | 
					
						
							|  |  |  |                               _m('Facebook Connect Settings'), | 
					
						
							|  |  |  |                               $action_name === 'FBConnectSettings'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Have the logout process do some Facebook Connect cookie cleanup | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |     function onStartLogout($action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         if (self::hasKeys()) { | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             $action->logout(); | 
					
						
							|  |  |  |             $fbuid = $this->loggedIn(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($fbuid)) { | 
					
						
							|  |  |  |                 try { | 
					
						
							|  |  |  |                     $facebook = getFacebook(); | 
					
						
							|  |  |  |                     $facebook->expire_session(); | 
					
						
							|  |  |  |                 } catch (Exception $e) { | 
					
						
							|  |  |  |                     common_log(LOG_WARNING, 'Facebook Connect Plugin - ' . | 
					
						
							|  |  |  |                                'Could\'t logout of Facebook: ' . | 
					
						
							|  |  |  |                                $e->getMessage()); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the URL of the user's Facebook avatar | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param int $fbuid the Facebook user ID | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string $url the url for the user's Facebook avatar | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |     function getProfilePicURL($fbuid) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $facebook = getFacebook(); | 
					
						
							|  |  |  |         $url      = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $fqry = 'SELECT pic_square FROM user WHERE uid = %s'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $result = $facebook->api_client->fql_query(sprintf($fqry, $fbuid)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($result)) { | 
					
						
							|  |  |  |                 $url = $result[0]['pic_square']; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             common_log(LOG_WARNING, 'Facebook Connect Plugin - ' . | 
					
						
							|  |  |  |                        "Facebook client failure requesting profile pic!"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  |         return $url; | 
					
						
							| 
									
										
										
										
											2009-10-21 01:17:31 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add a Facebook queue item for each notice | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice      the notice | 
					
						
							|  |  |  |      * @param array  &$transports the list of transports (queues) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2009-10-23 23:05:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |     function onStartEnqueueNotice($notice, &$transports) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-06-03 16:58:45 -07:00
										 |  |  |         if (self::hasKeys() && $notice->isLocal()) { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |             array_push($transports, 'facebook'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |      * Register Facebook notice queue handler | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |      * @param QueueManager $manager | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-01-12 19:57:15 -08:00
										 |  |  |     function onEndInitializeQueueManager($manager) | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-02 18:27:37 -08:00
										 |  |  |         if (self::hasKeys()) { | 
					
						
							|  |  |  |             $manager->connect('facebook', 'FacebookQueueHandler'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-10-20 16:32:30 -07:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 00:09:23 -08:00
										 |  |  |     function onPluginVersion(&$versions) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-01 23:31:56 -08:00
										 |  |  |         $versions[] = array( | 
					
						
							|  |  |  |             'name' => 'Facebook', | 
					
						
							|  |  |  |             'version' => self::VERSION, | 
					
						
							|  |  |  |             'author' => 'Zach Copley', | 
					
						
							|  |  |  |             'homepage' => 'http://status.net/wiki/Plugin:Facebook', | 
					
						
							|  |  |  |             'rawdescription' => _m( | 
					
						
							|  |  |  |                 'The Facebook plugin allows you to integrate ' . | 
					
						
							|  |  |  |                 'your StatusNet instance with ' . | 
					
						
							|  |  |  |                 '<a href="http://facebook.com/">Facebook</a> ' . | 
					
						
							|  |  |  |                 'and Facebook Connect.' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-01-08 00:09:23 -08:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-21 22:02:10 +00:00
										 |  |  | } |