* @category Plugin
* @package StatusNet
* @author Zach Copley <zach@status.net>
- * @copyright 2009 StatusNet, Inc.
+ * @copyright 2009-2010 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
require_once INSTALLDIR . '/plugins/Facebook/facebookutil.php';
/**
- * Facebook plugin to add a StatusNet Facebook application
+ * Facebook plugin to add a StatusNet Facebook canvas application
+ * and allow registration and authentication via Facebook Connect
*
* @category Plugin
* @package StatusNet
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
-
class FacebookPlugin extends Plugin
{
+ const VERSION = STATUSNET_VERSION;
+
+ /**
+ * Initializer for the plugin.
+ */
+
+ function initialize()
+ {
+ // Allow the key and secret to be passed in
+ // Control panel will override
+ if (isset($this->apikey)) {
+ $key = common_config('facebook', 'apikey');
+ if (empty($key)) {
+ Config::save('facebook', 'apikey', $this->apikey);
+ }
+ }
+
+ if (isset($this->secret)) {
+ $secret = common_config('facebook', 'secret');
+ if (empty($secret)) {
+ Config::save(
+ 'facebook',
+ 'secret',
+ $this->secret
+ );
+ }
+ }
+ }
+
+ /**
+ * Check to see if there is an API key and secret defined
+ * for Facebook integration.
+ *
+ * @return boolean result
+ */
+ static function hasKeys()
+ {
+ $apiKey = common_config('facebook', 'apikey');
+ $apiSecret = common_config('facebook', 'secret');
+
+ if (!empty($apiKey) && !empty($apiSecret)) {
+ return true;
+ }
+
+ return false;
+ }
/**
* Add Facebook app actions to the router table
*
* @return boolean hook return
*/
-
function onStartInitializeRouter($m)
{
+ $m->connect('admin/facebook', array('action' => 'facebookadminpanel'));
- // Facebook App stuff
+ if (self::hasKeys()) {
+ // Facebook App stuff
- $m->connect('facebook/app', array('action' => 'facebookhome'));
- $m->connect('facebook/app/index.php', array('action' => 'facebookhome'));
- $m->connect('facebook/app/settings.php',
- array('action' => 'facebooksettings'));
- $m->connect('facebook/app/invite.php', array('action' => 'facebookinvite'));
- $m->connect('facebook/app/remove', array('action' => 'facebookremove'));
+ $m->connect('facebook/app', array('action' => 'facebookhome'));
+ $m->connect('facebook/app/index.php', array('action' => 'facebookhome'));
+ $m->connect('facebook/app/settings.php',
+ array('action' => 'facebooksettings'));
+ $m->connect('facebook/app/invite.php', array('action' => 'facebookinvite'));
+ $m->connect('facebook/app/remove', array('action' => 'facebookremove'));
- // Facebook Connect stuff
+ // Facebook Connect stuff
- $m->connect('main/facebookconnect', array('action' => 'FBConnectAuth'));
- $m->connect('main/facebooklogin', array('action' => 'FBConnectLogin'));
- $m->connect('settings/facebook', array('action' => 'FBConnectSettings'));
- $m->connect('xd_receiver.html', array('action' => 'FBC_XDReceiver'));
+ $m->connect('main/facebookconnect', array('action' => 'FBConnectAuth'));
+ $m->connect('main/facebooklogin', array('action' => 'FBConnectLogin'));
+ $m->connect('settings/facebook', array('action' => 'FBConnectSettings'));
+ $m->connect('xd_receiver.html', array('action' => 'FBC_XDReceiver'));
+ }
return true;
}
* @return boolean hook return
*
*/
-
function onAutoload($cls)
{
switch ($cls) {
case 'FacebookinviteAction':
case 'FacebookremoveAction':
case 'FacebooksettingsAction':
+ case 'FacebookadminpanelAction':
include_once INSTALLDIR . '/plugins/Facebook/' .
strtolower(mb_substr($cls, 0, -6)) . '.php';
return false;
case 'FBCSettingsNav':
include_once INSTALLDIR . '/plugins/Facebook/FBCSettingsNav.php';
return false;
+ case 'FacebookQueueHandler':
+ include_once INSTALLDIR . '/plugins/Facebook/facebookqueuehandler.php';
+ return false;
default:
return true;
}
}
+ /**
+ * 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;
+ }
+
/**
* Override normal HTML output to force the content type to
* text/html and add in xmlns:fb
*
* @return void
*/
-
function onStartShowHTML($action)
{
-
if ($this->reqFbScripts($action)) {
-
// XXX: Horrible hack to make Safari, FF2, and Chrome work with
// Facebook Connect. These browser cannot use Facebook's
// DOM parsing routines unless the mime type of the page is
'lang' => $language));
return false;
-
} else {
-
return true;
}
}
* @return void
*
*/
-
function onEndShowScripts($action)
{
if ($this->reqFbScripts($action)) {
$apikey = common_config('facebook', 'apikey');
- $plugin_path = common_path('plugins/Facebook');
+ $plugin_path = 'plugins/Facebook';
$login_url = common_local_url('FBConnectAuth');
$logout_url = common_local_url('logout');
// XXX: Facebook says we don't need this FB_RequireFeatures(),
// but we actually do, for IE and Safari. Gar.
- $js = '<script type="text/javascript">';
$js .= ' $(document).ready(function () {';
$js .= ' FB_RequireFeatures(';
$js .= ' ["XFBML"], function() {';
$js .= ' }';
$js .= ' );';
$js .= ' });';
- $js .= '</script>';
$js = sprintf($js, $apikey, $login_url, $logout_url);
// Compress the bugger down a bit
-
$js = str_replace(' ', '', $js);
- $action->raw(" $js"); // leading two spaces to make it line up
+ $action->inlineScript($js);
}
-
}
/**
* @return void
*
*/
-
function onEndShowFooter($action)
{
if ($this->reqFbScripts($action)) {
* @return void
*
*/
-
function onEndShowStatusNetStyles($action)
{
if ($this->reqFbScripts($action)) {
*
* @return boolean true
*/
-
function reqFbScripts($action)
{
+ if (!self::hasKeys()) {
+ return false;
+ }
// If you're logged in w/FB Connect, you always need the FB stuff
-
$fbuid = $this->loggedIn();
if (!empty($fbuid)) {
}
// List of actions that require FB stuff
-
$needy = array('FBConnectLoginAction',
'FBConnectauthAction',
'FBConnectSettingsAction');
}
return false;
-
}
/**
*
* @return mixed $fbuid the Facebook ID of the logged in user, or null
*/
-
function loggedIn()
{
$user = common_current_user();
$fbuid = 0;
if (!empty($flink)) {
-
try {
-
$facebook = getFacebook();
$fbuid = $facebook->get_loggedin_user();
-
} catch (Exception $e) {
common_log(LOG_WARNING, 'Facebook Connect Plugin - ' .
'Problem getting Facebook user: ' .
* @return void
*
*/
-
function onStartPrimaryNav($action)
{
- $user = common_current_user();
+ if (self::hasKeys()) {
+ $user = common_current_user();
+ if (!empty($user)) {
+ $fbuid = $this->loggedIn();
- $connect = 'FBConnectSettings';
- if (common_config('xmpp', 'enabled')) {
- $connect = 'imsettings';
- } else if (common_config('sms', 'enabled')) {
- $connect = 'smssettings';
- } else if (common_config('twitter', 'enabled')) {
- $connect = 'twittersettings';
- }
-
- if (!empty($user)) {
-
- $fbuid = $this->loggedIn();
-
- if (!empty($fbuid)) {
-
- /* Default FB silhouette pic for FB users who haven't
- uploaded a profile pic yet. */
+ if (!empty($fbuid)) {
+ /* Default FB silhouette pic for FB users who haven't
+ uploaded a profile pic yet. */
- $silhouetteUrl =
- 'http://static.ak.fbcdn.net/pics/q_silhouette.gif';
+ $silhouetteUrl =
+ 'http://static.ak.fbcdn.net/pics/q_silhouette.gif';
- $url = $this->getProfilePicURL($fbuid);
+ $url = $this->getProfilePicURL($fbuid);
- $action->elementStart('li', array('id' => 'nav_fb'));
+ $action->elementStart('li', array('id' => 'nav_fb'));
- $action->element('img', array('id' => 'fbc_profile-pic',
- 'src' => (!empty($url)) ? $url : $silhouetteUrl,
- 'alt' => 'Facebook Connect User',
- 'width' => '16'), '');
+ $action->element('img', array('id' => 'fbc_profile-pic',
+ 'src' => (!empty($url)) ? $url : $silhouetteUrl,
+ 'alt' => _m('Facebook Connect User'),
+ 'width' => '16'), '');
- $iconurl = common_path('plugins/Facebook/fbfavicon.ico');
- $action->element('img', array('id' => 'fb_favicon',
- 'src' => $iconurl));
-
- $action->elementEnd('li');
+ $iconurl = common_path('plugins/Facebook/fbfavicon.ico');
+ $action->element('img', array('id' => 'fb_favicon',
+ 'src' => $iconurl));
+ $action->elementEnd('li');
+ }
}
}
return true;
}
- /**
- * Alter the local nav menu to have a Facebook Connect login and
- * settings pages
+ /*
+ * Add a login tab for Facebook Connect
*
- * @param Action $action the current action
+ * @param Action &action the current action
*
* @return void
- *
*/
-
- function onStartShowLocalNavBlock($action)
+ function onEndLoginGroupNav(&$action)
{
- $action_name = get_class($action);
-
- $login_actions = array('LoginAction', 'RegisterAction',
- 'OpenidloginAction', 'FBConnectLoginAction');
-
- if (in_array($action_name, $login_actions)) {
- $nav = new FBCLoginGroupNav($action);
- $nav->show();
- return false;
+ if (self::hasKeys()) {
+ $action_name = $action->trimmed('action');
+
+ $action->menuItem(common_local_url('FBConnectLogin'),
+ // @todo CHECKME: Should be 'Facebook Login'?
+ // TRANS: Menu item.
+ _m('MENU','Facebook'),
+ // TRANS: Tooltip for menu item "Facebook".
+ _m('Login or register using Facebook'),
+ 'FBConnectLogin' === $action_name);
}
- $connect_actions = array('SmssettingsAction', 'ImsettingsAction',
- 'TwittersettingsAction', 'FBConnectSettingsAction');
+ return true;
+ }
- if (in_array($action_name, $connect_actions)) {
- $nav = new FBCSettingsNav($action);
- $nav->show();
- return false;
+ /*
+ * Add a tab for managing Facebook Connect settings
+ *
+ * @param Action &action the current action
+ *
+ * @return void
+ */
+ function onEndConnectSettingsNav(&$action)
+ {
+ if (self::hasKeys()) {
+ $action_name = $action->trimmed('action');
+
+ $action->menuItem(common_local_url('FBConnectSettings'),
+ // @todo CHECKME: Should be 'Facebook Connect'?
+ // TRANS: Menu item tab.
+ _m('MENU','Facebook'),
+ // TRANS: Tooltip for menu item "Facebook".
+ _m('Facebook Connect Settings'),
+ $action_name === 'FBConnectSettings');
}
return true;
*
* @return void
*/
-
function onStartLogout($action)
{
- $action->logout();
- $fbuid = $this->loggedIn();
+ if (self::hasKeys()) {
- if (!empty($fbuid)) {
- try {
- $facebook = getFacebook();
- $facebook->expire_session();
- } catch (Exception $e) {
- common_log(LOG_WARNING, 'Facebook Connect Plugin - ' .
- 'Could\'t logout of Facebook: ' .
- $e->getMessage());
+ $action->logout();
+ $fbuid = $this->loggedIn();
+
+ if (!empty($fbuid)) {
+ try {
+ $facebook = getFacebook();
+ $facebook->expire_session();
+ } catch (Exception $e) {
+ common_log(LOG_WARNING, 'Facebook Connect Plugin - ' .
+ 'Could\'t logout of Facebook: ' .
+ $e->getMessage());
+ }
}
}
-
return true;
}
*
* @return string $url the url for the user's Facebook avatar
*/
-
function getProfilePicURL($fbuid)
{
$facebook = getFacebook();
$url = null;
try {
-
$fqry = 'SELECT pic_square FROM user WHERE uid = %s';
$result = $facebook->api_client->fql_query(sprintf($fqry, $fbuid));
*
* @return boolean hook return
*/
-
function onStartEnqueueNotice($notice, &$transports)
{
- array_push($transports, 'facebook');
+ if (self::hasKeys() && $notice->isLocal()) {
+ array_push($transports, 'facebook');
+ }
return true;
}
/**
- * broadcast the message when not using queuehandler
+ * Register Facebook notice queue handler
*
- * @param Notice &$notice the notice
- * @param array $queue destination queue
+ * @param QueueManager $manager
*
* @return boolean hook return
*/
-
- function onUnqueueHandleNotice(&$notice, $queue)
+ function onEndInitializeQueueManager($manager)
{
- if (($queue == 'facebook') && ($this->_isLocal($notice))) {
- facebookBroadcastNotice($notice);
- return false;
+ if (self::hasKeys()) {
+ $manager->connect('facebook', 'FacebookQueueHandler');
}
return true;
}
- /**
- * Determine whether the notice was locally created
- *
- * @param Notice $notice the notice
- *
- * @return boolean locality
- */
-
- function _isLocal($notice)
- {
- return ($notice->is_local == Notice::LOCAL_PUBLIC ||
- $notice->is_local == Notice::LOCAL_NONPUBLIC);
- }
-
- /**
- * Add Facebook queuehandler to the list of daemons to start
- *
- * @param array $daemons the list fo daemons to run
- *
- * @return boolean hook return
- *
- */
-
- function onGetValidDaemons($daemons)
+ function onPluginVersion(&$versions)
{
- array_push($daemons, INSTALLDIR .
- '/plugins/Facebook/facebookqueuehandler.php');
+ $versions[] = array(
+ 'name' => 'Facebook',
+ 'version' => self::VERSION,
+ 'author' => 'Zach Copley',
+ 'homepage' => 'http://status.net/wiki/Plugin:Facebook',
+ // TRANS: Plugin description.
+ 'rawdescription' => _m(
+ 'The Facebook plugin allows integrating ' .
+ 'StatusNet instances with ' .
+ '<a href="http://facebook.com/">Facebook</a> ' .
+ 'and Facebook Connect.'
+ )
+ );
return true;
}
-
}