| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2010, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											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/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Pugin | 
					
						
							|  |  |  |  * @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> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @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__); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //common_debug("class = " . $cls);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         switch ($cls) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |         case 'Facebook': // Facebook PHP SDK
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |             include_once $dir . '/extlib/facebook.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         case 'FacebookloginAction': | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         case 'FacebookfinishloginAction': | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |         case 'FacebookadminpanelAction': | 
					
						
							| 
									
										
										
										
											2010-11-02 01:41:31 +00:00
										 |  |  |         case 'FacebooksettingsAction': | 
					
						
							| 
									
										
										
										
											2010-11-10 01:18:06 +00:00
										 |  |  |         case 'FacebookdeauthorizeAction': | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |             include_once $dir . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         case 'Facebookclient': | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         case 'FacebookQueueHandler': | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |             include_once $dir . '/lib/' . strtolower($cls) . '.php'; | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         case 'Notice_to_item': | 
					
						
							|  |  |  |             include_once $dir . '/classes/' . $cls . '.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |         default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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( | 
					
						
							|  |  |  |                 common_local_url('facebooklogin'), | 
					
						
							|  |  |  |                 _m('MENU', 'Facebook'), | 
					
						
							|  |  |  |                 // TRANS: Tooltip for menu item "Facebook".
 | 
					
						
							|  |  |  |                 _m('Login or register using Facebook'), | 
					
						
							|  |  |  |                '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'), | 
					
						
							|  |  |  |                 // TRANS: Menu item.
 | 
					
						
							|  |  |  |                 _m('MENU','Facebook'), | 
					
						
							|  |  |  |                 // TRANS: Tooltip for menu item "Facebook".
 | 
					
						
							|  |  |  |                 _m('Facebook integration configuration'), | 
					
						
							|  |  |  |                 $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'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |             // CurrentUserDesignAction stores the current user in $cur
 | 
					
						
							|  |  |  |             $user = $action->getCurrentUser(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $flink = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($user)) { | 
					
						
							|  |  |  |                 $flink = Foreign_link::getByUserID( | 
					
						
							|  |  |  |                     $user->id, | 
					
						
							|  |  |  |                     FACEBOOK_SERVICE | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($flink)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $action->menuItem( | 
					
						
							|  |  |  |                     common_local_url('facebooksettings'), | 
					
						
							|  |  |  |                     // TRANS: Menu item tab.
 | 
					
						
							|  |  |  |                     _m('MENU','Facebook'), | 
					
						
							|  |  |  |                     // TRANS: Tooltip for menu item "Facebook".
 | 
					
						
							|  |  |  |                     _m('Facebook settings'), | 
					
						
							|  |  |  |                     $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 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | FB.init({appId: %1\$s, session: %2\$s, status: true, cookie: true, xfbml: true}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $('#facebook_button').bind('click', function(event) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     event.preventDefault(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FB.login(function(response) { | 
					
						
							|  |  |  |         if (response.session && response.perms) { | 
					
						
							|  |  |  |             window.location.href = '%3\$s'; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             // NOP (user cancelled login)
 | 
					
						
							| 
									
										
										
										
											2010-10-30 00:44:16 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |     }, {perms:'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( | 
					
						
							|  |  |  |                 sprintf($script, | 
					
						
							|  |  |  |                     json_encode($this->facebook->getAppId()), | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                     json_encode($this->facebook->getSession()), | 
					
						
							|  |  |  |                     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
										 |  |  |      */ | 
					
						
							|  |  |  |     function onEndLogout($action) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-04 00:43:40 +00:00
										 |  |  |         if ($this->hasApplication()) { | 
					
						
							|  |  |  |             $session = $this->facebook->getSession(); | 
					
						
							|  |  |  |             $fbuser  = null; | 
					
						
							|  |  |  |             $fbuid   = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ($session) { | 
					
						
							|  |  |  |                 try { | 
					
						
							|  |  |  |                     $fbuid  = $this->facebook->getUser(); | 
					
						
							|  |  |  |                     $fbuser = $this->facebook->api('/me'); | 
					
						
							|  |  |  |                  } catch (FacebookApiException $e) { | 
					
						
							|  |  |  |                      common_log(LOG_ERROR, $e, __FILE__); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($fbuser)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $logoutUrl = $this->facebook->getLogoutUrl( | 
					
						
							|  |  |  |                     array('next' => common_local_url('public')) | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 common_log( | 
					
						
							|  |  |  |                     LOG_INFO, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							|  |  |  |                         "Logging user out of Facebook (fbuid = %s)", | 
					
						
							|  |  |  |                         $fbuid | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |                 common_debug("LOGOUT URL = $logoutUrl"); | 
					
						
							|  |  |  |                 common_redirect($logoutUrl, 303); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (self::hasApplication() && $notice->isLocal()) { | 
					
						
							|  |  |  |             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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $client = new Facebookclient($notice); | 
					
						
							|  |  |  |         $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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $client = new Facebookclient($notice); | 
					
						
							|  |  |  |         $client->unLike(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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', | 
					
						
							| 
									
										
										
										
											2010-11-02 23:14:45 +00:00
										 |  |  |             'version' => STATUSNET_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' => | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |