| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |  * Copyright (C) 2010-2011, StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |  * A plugin for integrating Facebook with StatusNet. Includes single-sign-on | 
					
						
							|  |  |  |  * and publishing notices to Facebook using Facebook's Graph API. | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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/>. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |  * @category  Plugin | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2011-02-09 04:49:39 +00:00
										 |  |  |  * @copyright 2011 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 01:41:31 +00:00
										 |  |  | define("FACEBOOK_SERVICE", 2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2010-11-18 13:28:49 -08:00
										 |  |  |  * Main class for Facebook Bridge plugin | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @category  Plugin | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |  * @copyright 2010-2011 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  | class FacebookBridgePlugin extends Plugin | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-02-09 04:49:39 +00:00
										 |  |  |     public $appId;  // Facebook application ID
 | 
					
						
							|  |  |  |     public $secret; // Facebook application secret
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     public $facebook = null; // Facebook application instance
 | 
					
						
							| 
									
										
										
										
											2010-11-18 13:28:49 -08:00
										 |  |  |     public $dir      = null; // Facebook plugin dir
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Initializer for this plugin | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |      * Gets an instance of the Facebook API client object | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function initialize() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-02-09 04:49:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Allow the id and key to be passed in
 | 
					
						
							|  |  |  |         // Control panel will override
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($this->appId)) { | 
					
						
							|  |  |  |             $appId = common_config('facebook', 'appid'); | 
					
						
							|  |  |  |             if (empty($appId)) { | 
					
						
							|  |  |  |                 Config::save( | 
					
						
							|  |  |  |                     'facebook', | 
					
						
							|  |  |  |                     'appid', | 
					
						
							|  |  |  |                     $this->appId | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (isset($this->secret)) { | 
					
						
							|  |  |  |             $secret = common_config('facebook', 'secret'); | 
					
						
							|  |  |  |             if (empty($secret)) { | 
					
						
							|  |  |  |                 Config::save('facebook', 'secret', $this->secret); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |         $this->facebook = Facebookclient::getFacebook( | 
					
						
							|  |  |  |             $this->appId, | 
					
						
							|  |  |  |             $this->secret | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Load related modules when needed | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $cls Name of the class to be loaded | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onAutoload($cls) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $dir = dirname(__FILE__); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         switch ($cls) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |         case 'Facebook': // Facebook PHP SDK
 | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |             include_once $dir . '/extlib/base_facebook.php'; | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |             include_once $dir . '/extlib/facebook.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return parent::onAutoload($cls); | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Database schema setup | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * We maintain a table mapping StatusNet notices to Facebook items | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @see Schema | 
					
						
							|  |  |  |      * @see ColumnDef | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onCheckSchema() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $schema = Schema::get(); | 
					
						
							|  |  |  |         $schema->ensureTable('notice_to_item', Notice_to_item::schemaDef()); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Does this $action need the Facebook JavaScripts? | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function needsScripts($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         static $needy = array( | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |             'FacebookloginAction', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             'FacebookfinishloginAction', | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |             'FacebookadminpanelAction', | 
					
						
							|  |  |  |             'FacebooksettingsAction' | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (in_array(get_class($action), $needy)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Map URLs to actions | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Net_URL_Mapper $m path-to-action mapper | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onRouterInitialized($m) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Always add the admin panel route
 | 
					
						
							| 
									
										
										
										
											2011-01-23 10:18:35 -05:00
										 |  |  |         $m->connect('panel/facebook', array('action' => 'facebookadminpanel')); | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 13:57:21 -08:00
										 |  |  |         $m->connect( | 
					
						
							|  |  |  |             'main/facebooklogin', | 
					
						
							|  |  |  |             array('action' => 'facebooklogin') | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         $m->connect( | 
					
						
							|  |  |  |             'main/facebookfinishlogin', | 
					
						
							|  |  |  |             array('action' => 'facebookfinishlogin') | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         $m->connect( | 
					
						
							|  |  |  |             'settings/facebook', | 
					
						
							|  |  |  |             array('action' => 'facebooksettings') | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         $m->connect( | 
					
						
							|  |  |  |             'facebook/deauthorize', | 
					
						
							|  |  |  |             array('action' => 'facebookdeauthorize') | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Add a login tab for Facebook, but only if there's a Facebook | 
					
						
							|  |  |  |      * application defined for the plugin to use. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2011-01-18 12:34:27 -08:00
										 |  |  |      * @param Action $action the current action | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2011-01-18 12:34:27 -08:00
										 |  |  |     function onEndLoginGroupNav($action) | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $action_name = $action->trimmed('action'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($this->hasApplication()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $action->menuItem( | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |                 // TRANS: Menu item for "Facebook" login.
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |                 common_local_url('facebooklogin'), | 
					
						
							|  |  |  |                 _m('MENU', 'Facebook'), | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |                 // TRANS: Menu title for "Facebook" login.
 | 
					
						
							|  |  |  |                 _m('Login or register using Facebook.'), | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |                'facebooklogin' === $action_name | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-18 21:55:43 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * If the plugin's installed, this should be accessible to admins | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onAdminPanelCheck($name, &$isOK) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($name == 'facebook') { | 
					
						
							|  |  |  |             $isOK = true; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00: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'), | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |                 // TRANS: Menu item for "Facebook" in administration panel.
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |                 _m('MENU','Facebook'), | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |                 // TRANS: Menu title for "Facebook" in administration panel.
 | 
					
						
							|  |  |  |                 _m('Facebook integration configuration.'), | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |                 $action_name == 'facebookadminpanel', | 
					
						
							|  |  |  |                 'nav_facebook_admin_panel' | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 01:41:31 +00:00
										 |  |  |     /* | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |      * Add a tab for user-level Facebook settings if the user | 
					
						
							|  |  |  |      * has a link to Facebook | 
					
						
							| 
									
										
										
										
											2010-11-02 01:41:31 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2011-01-18 12:34:27 -08:00
										 |  |  |      * @param Action $action the current action | 
					
						
							| 
									
										
										
										
											2010-11-02 01:41:31 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2011-01-18 12:34:27 -08:00
										 |  |  |     function onEndConnectSettingsNav($action) | 
					
						
							| 
									
										
										
										
											2010-11-02 01:41:31 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         if ($this->hasApplication()) { | 
					
						
							|  |  |  |             $action_name = $action->trimmed('action'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-09 16:20:19 -04:00
										 |  |  |             $user = common_current_user(); | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $flink = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($user)) { | 
					
						
							|  |  |  |                 $flink = Foreign_link::getByUserID( | 
					
						
							|  |  |  |                     $user->id, | 
					
						
							|  |  |  |                     FACEBOOK_SERVICE | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($flink)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $action->menuItem( | 
					
						
							|  |  |  |                     common_local_url('facebooksettings'), | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |                     // TRANS: Menu item for "Facebook" in user settings.
 | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     _m('MENU','Facebook'), | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |                     // TRANS: Menu title for "Facebook" in user settings.
 | 
					
						
							|  |  |  |                     _m('Facebook settings.'), | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     $action_name === 'facebooksettings' | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-11-02 01:41:31 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Is there a Facebook application for the plugin to use? | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * Checks to see if a Facebook application ID and secret | 
					
						
							|  |  |  |      * have been configured and a valid Facebook API client | 
					
						
							|  |  |  |      * object exists. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     function hasApplication() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |         if (!empty($this->facebook)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $appId  = $this->facebook->getAppId(); | 
					
						
							|  |  |  |             $secret = $this->facebook->getApiSecret(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($appId) && !empty($secret)) { | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Output a Facebook div for the Facebook JavaSsript SDK to use | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     function onStartShowHeader($action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         // output <div id="fb-root"></div> as close to <body> as possible
 | 
					
						
							|  |  |  |         $action->element('div', array('id' => 'fb-root')); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Load the Facebook JavaScript SDK on pages that need them. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action the current action | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     function onEndShowScripts($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($this->needsScripts($action)) { | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             $action->script('https://connect.facebook.net/en_US/all.js'); | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $script = <<<ENDOFSCRIPT | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  | function setCookie(name, value) { | 
					
						
							|  |  |  |     var date = new Date(); | 
					
						
							|  |  |  |     date.setTime(date.getTime() + (5 * 60 * 1000)); // 5 mins
 | 
					
						
							|  |  |  |     var expires = "; expires=" + date.toGMTString(); | 
					
						
							|  |  |  |     document.cookie = name + "=" + value + expires + "; path=/"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  | FB.init({appId: %1\$s, status: true, cookie: true, xfbml: true, oauth: true}); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | $('#facebook_button').bind('click', function(event) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     event.preventDefault(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FB.login(function(response) { | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |         if (response.authResponse) { | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |             // put the access token in a cookie for the next step
 | 
					
						
							|  |  |  |             setCookie('fb_access_token', response.authResponse.accessToken); | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |             window.location.href = '%2\$s'; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             // NOP (user cancelled login)
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |     }, {scope:'read_stream,publish_stream,offline_access,user_status,user_location,user_website,email'}); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | ENDOFSCRIPT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |             $action->inlineScript( | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |                 sprintf( | 
					
						
							|  |  |  |                     $script, | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |                     json_encode($this->facebook->getAppId()), | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                     common_local_url('facebookfinishlogin') | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |                 ) | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Log the user out of Facebook, per the Facebook authentication guide | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |      * @param Action action the current action | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |     function onStartLogout($action) | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |         if ($this->hasApplication()) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |             $cur = common_current_user(); | 
					
						
							|  |  |  |             $flink = Foreign_link::getByUserID($cur->id, FACEBOOK_SERVICE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($flink)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $this->facebook->setAccessToken($flink->credentials); | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |                 if (common_config('singleuser', 'enabled')) { | 
					
						
							|  |  |  |                     $user = User::singleUser(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $destination = common_local_url( | 
					
						
							|  |  |  |                         'showstream', | 
					
						
							|  |  |  |                         array('nickname' => $user->nickname) | 
					
						
							|  |  |  |                     ); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     $destination = common_local_url('public'); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 $logoutUrl = $this->facebook->getLogoutUrl( | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |                     array('next' => $destination) | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |                 ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 common_log( | 
					
						
							|  |  |  |                     LOG_INFO, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							|  |  |  |                         "Logging user out of Facebook (fbuid = %s)", | 
					
						
							|  |  |  |                         $fbuid | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 $action->logout(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |                 common_redirect($logoutUrl, 303); | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |                 return false; // probably never get here, but hey
 | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             return true; | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |      * Add fbml namespace to our HTML, so Facebook's JavaScript SDK can parse | 
					
						
							|  |  |  |      * and render XFBML tags | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |      * @param Action    $action   the current action | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |      * @param array     $attrs    array of attributes for the HTML tag | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return nothing | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     function onStartHtmlElement($action, $attrs) { | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($this->needsScripts($action)) { | 
					
						
							|  |  |  |             $attrs = array_merge( | 
					
						
							|  |  |  |                 $attrs, | 
					
						
							|  |  |  |                 array('xmlns:fb' => 'http://www.facebook.com/2008/fbml') | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00: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 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onStartEnqueueNotice($notice, &$transports) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-03-28 16:10:24 -04:00
										 |  |  |         if (self::hasApplication() && $notice->isLocal() && $notice->inScope(null)) { | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |             array_push($transports, 'facebook'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Register Facebook notice queue handler | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param QueueManager $manager | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onEndInitializeQueueManager($manager) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (self::hasApplication()) { | 
					
						
							|  |  |  |             $manager->connect('facebook', 'FacebookQueueHandler'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Use SSL for Facebook stuff | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $action name | 
					
						
							|  |  |  |      * @param boolean $ssl outval to force SSL | 
					
						
							|  |  |  |      * @return mixed hook return value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onSensitiveAction($action, &$ssl) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $sensitive = array( | 
					
						
							|  |  |  |             'facebookadminpanel', | 
					
						
							|  |  |  |             'facebooksettings', | 
					
						
							|  |  |  |             'facebooklogin', | 
					
						
							|  |  |  |             'facebookfinishlogin' | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (in_array($action, $sensitive)) { | 
					
						
							|  |  |  |             $ssl = true; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * If a notice gets deleted, remove the Notice_to_item mapping and | 
					
						
							|  |  |  |      * delete the item on Facebook | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param User   $user   The user doing the deleting | 
					
						
							|  |  |  |      * @param Notice $notice The notice getting deleted | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onStartDeleteOwnNotice(User $user, Notice $notice) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $client = new Facebookclient($notice); | 
					
						
							|  |  |  |         $client->streamRemove(); | 
					
						
							| 
									
										
										
										
											2010-11-18 21:55:43 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Notify remote users when their notices get favorited. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Profile or User $profile of local user doing the faving | 
					
						
							|  |  |  |      * @param Notice $notice being favored | 
					
						
							|  |  |  |      * @return hook return value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onEndFavorNotice(Profile $profile, Notice $notice) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-03-30 17:01:06 -07:00
										 |  |  |         $client = new Facebookclient($notice, $profile); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         $client->like(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Notify remote users when their notices get de-favorited. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Profile $profile Profile person doing the de-faving | 
					
						
							|  |  |  |      * @param Notice  $notice  Notice being favored | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return hook return value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onEndDisfavorNotice(Profile $profile, Notice $notice) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-03-30 17:01:06 -07:00
										 |  |  |         $client = new Facebookclient($notice, $profile); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         $client->unLike(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 12:55:05 -04:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add links in the user's profile block to their Facebook profile URL. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Profile $profile The profile being shown | 
					
						
							|  |  |  |      * @param Array   &$links  Writeable array of arrays (href, text, image). | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value (true) | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onOtherAccountProfiles($profile, &$links) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $fuser = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $flink = Foreign_link::getByUserID($profile->id, FACEBOOK_SERVICE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($flink)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $fuser = $this->getFacebookUser($flink->foreign_id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($fuser)) { | 
					
						
							|  |  |  |                 $links[] = array("href" => $fuser->link, | 
					
						
							| 
									
										
										
										
											2012-07-09 13:57:51 -04:00
										 |  |  |                                  "text" => sprintf(_("%s on Facebook"), $fuser->name), | 
					
						
							| 
									
										
										
										
											2012-07-09 12:55:05 -04:00
										 |  |  |                                  "image" => $this->path("images/f_logo.png")); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function getFacebookUser($id) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 13:37:33 -04:00
										 |  |  |         $key = Cache::key(sprintf("FacebookBridgePlugin:userdata:%s", $id)); | 
					
						
							| 
									
										
										
										
											2012-07-09 12:55:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $c = Cache::instance(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($c) { | 
					
						
							|  |  |  |             $obj = $c->get($key); | 
					
						
							|  |  |  |             if ($obj) { | 
					
						
							|  |  |  |                 return $obj; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $url = sprintf("https://graph.facebook.com/%s", $id); | 
					
						
							| 
									
										
										
										
											2012-07-09 13:37:33 -04:00
										 |  |  |         $client = new HTTPClient(); | 
					
						
							| 
									
										
										
										
											2012-07-09 12:55:05 -04:00
										 |  |  |         $resp = $client->get($url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$resp->isOK()) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $user = json_decode($resp->getBody()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($user->error) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($c) { | 
					
						
							|  |  |  |             $c->set($key, $user); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $user; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Add version info for this plugin | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array &$versions    plugin version descriptions | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |     function onPluginVersion(&$versions) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |         $versions[] = array( | 
					
						
							| 
									
										
										
										
											2010-11-18 13:28:49 -08:00
										 |  |  |             'name' => 'Facebook Bridge', | 
					
						
							| 
									
										
										
										
											2013-11-01 13:51:41 +01:00
										 |  |  |             'version' => GNUSOCIAL_VERSION, | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |             'author' => 'Craig Andrews, Zach Copley', | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |             'homepage' => 'http://status.net/wiki/Plugin:FacebookBridge', | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |             'rawdescription' => | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |              // TRANS: Plugin description.
 | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |             _m('A plugin for integrating StatusNet with Facebook.') | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |