Files
server/usr/share/psa-horde/lib/Prefs/Special/Facebook.php
2026-01-07 20:52:11 +01:00

171 lines
7.2 KiB
PHP

<?php
/**
* Special prefs handling for the 'facebookmanagement' preference.
*
* Copyright 2012-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/lgpl LGPL
* @package Horde
*/
class Horde_Prefs_Special_Facebook implements Horde_Core_Prefs_Ui_Special
{
/**
*/
public function init(Horde_Core_Prefs_Ui $ui)
{
}
/**
*/
public function display(Horde_Core_Prefs_Ui $ui)
{
global $injector, $notification, $page_output, $prefs, $registry;
try {
$facebook = $injector->getInstance('Horde_Service_Facebook');
} catch (Horde_Exception $e) {
return $e->getMessage();
}
$page_output->addThemeStylesheet('facebook.css');
$view = new Horde_View(array(
'templatePath' => HORDE_TEMPLATES . '/prefs'
));
$view->app_name = $registry->get('name', 'horde');
// Ensure we have authorized horde.
try {
$session_uid = $facebook->auth->getLoggedInUser();
$fbp = unserialize($prefs->getValue('facebook'));
$uid = $fbp['uid'];
// Verify the userid matches the one we expect for the session
if ($fbp['uid'] != $session_uid) {
$haveSession = false;
} else {
$haveSession = true;
}
} catch (Horde_Service_Facebook_Exception $e) {
Horde::log($e->getMessage(), 'ERR');
$haveSession = false;
$prefs->setValue('facebook', serialize(array('uid' => '', 'sid' => 0)));
}
// Get a token generator
$token = $injector->getInstance('Horde_Token');
// We have a session, build the template.
if (!empty($haveSession)) {
try {
$perms = $facebook->users->getAppPermissions();
$view->have_publish = !empty($perms[Horde_Service_Facebook_Auth::EXTEND_PERMS_PUBLISHSTREAM]);
$view->have_read = !empty($perms[Horde_Service_Facebook_Auth::EXTEND_PERMS_READSTREAM]);
$view->have_friends = !empty($perms[Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_ABOUT]);
} catch (Horde_Service_Facebook_Exception $e) {
$notification->push($e->getMessage(), 'horde.error');
}
// Get user info. FB recommends using the FB photo and styling.
$fql = 'SELECT first_name, last_name, status, pic_with_logo, current_location FROM user WHERE uid IN (' . $uid . ')';
try {
$user_info = $facebook->fql->run($fql);
} catch (Horde_Service_Facebook_Exception $e) {
$notification->push(_("Temporarily unable to connect with Facebook, Please try again."), 'horde.alert');
}
// Get a state token.
$state = $token->get();
// FB Perms links
$cburl = Horde::url('services/facebook', true);
$view->have_session = true;
$view->user_pic_url = $user_info[0]['pic_with_logo'];
$view->user_name = $user_info[0]['first_name'] . ' ' . $user_info[0]['last_name'];
$url = $facebook->auth->getOAuthUrl($cburl, array(Horde_Service_Facebook_Auth::EXTEND_PERMS_PUBLISHSTREAM));
$view->publish_url = $url;
// User read perms
$url = $facebook->auth->getOAuthUrl($cburl, array(
Horde_Service_Facebook_Auth::EXTEND_PERMS_READSTREAM,
Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_ABOUT,
Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_BIRTHDAY,
Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_EVENTS,
Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_HOMETOWN,
Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_LOCATION,
Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_PHOTOS), $state);
$view->read_url = Horde::signQueryString($url);
// Friend read perms
$url = $facebook->auth->getOAuthUrl($cburl, array(
Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_ABOUT,
Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_BIRTHDAY,
Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_HOMETOWN,
Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_LOCATION,
Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_PHOTOS), $state);
$view->friends_url = Horde::signQueryString($url);
} else {
/* No existing session */
$state = $token->get();
$view->authUrl = $facebook->auth->getOAuthUrl(Horde::url('services/facebook', true), array(), $state);
}
return $view->render('facebook');
}
/**
*/
public function update(Horde_Core_Prefs_Ui $ui)
{
global $injector, $notification, $prefs;
try {
$facebook = $injector->getInstance('Horde_Service_Facebook');
} catch (Horde_Exception $e) {
return $e->getMessage();
}
try {
switch ($ui->vars->fbactionID) {
case 'revokeApplication':
$prefs->setValue(
'facebook',
array('uid' => '', 'sid' => ''));
break;
case 'revokePublish':
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_PUBLISHSTREAM);
break;
case 'revokeRead':
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_READSTREAM);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_ABOUT);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_HOMETOWN);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_LOCATION);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_PHOTOS);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_BIRTHDAY);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_USER_EVENTS);
break;
case 'revokeFriends':
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_ABOUT);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_BIRTHDAY);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_HOMETOWN);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_LOCATION);
$facebook->auth->revokeExtendedPermission(Horde_Service_Facebook_Auth::EXTEND_PERMS_FRIENDS_PHOTOS);
break;
}
} catch (Horde_Service_Facebook_Exception $e) {
$notification->push($e->getMessage(), 'horde.error');
}
return false;
}
}