use Bitrix\Main\Web\Json;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\Localization\Loc;
IncludeModuleLangFile(__FILE__);
class CSocServFacebook extends CSocServAuth
{
const ID = "Facebook";
const CONTROLLER_URL = "https://www.bitrix24.ru/controller";
const LOGIN_PREFIX = "FB_";
protected $entityOAuth = null;
/**
* @param string $code =false
* @return CFacebookInterface
*/
public function getEntityOAuth($code = false)
{
if(!$this->entityOAuth)
{
$this->entityOAuth = new CFacebookInterface();
}
if($code !== false)
{
$this->entityOAuth->setCode($code);
}
return $this->entityOAuth;
}
/**
* @return array
*/
public function GetSettings(): array
{
$urlPreviewEnable = Option::get('main', 'url_preview_enable', 'Y');
$result = [
['facebook_appid', Loc::getMessage('socserv_fb_id'), '', ['text', 40]],
['facebook_appsecret', Loc::getMessage('socserv_fb_secret'), '', ['text', 40]],
['note' => Loc::getMessage('socserv_fb_sett_note1', ['#URL#'=>$this->getEntityOAuth()->GetRedirectURI()])],
];
if($urlPreviewEnable === 'Y')
{
$result[] = ['facebook_instagram_url_preview_enable', Loc::getMessage('socserv_fb_instagram_url_preview'), '', ['checkbox']];
$result[] = ['note' => Loc::getMessage('socserv_fb_sett_note_oembed_2')];
}
return $result;
}
public function GetFormHtml($arParams)
{
$url = $this->getUrl($arParams);
$phrase = ($arParams["FOR_INTRANET"])
? GetMessage("socserv_fb_note_intranet")
: GetMessage("socserv_fb_note");
return $arParams["FOR_INTRANET"]
? array("ON_CLICK" => 'onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 580, 400)"')
: ''.$phrase.'';
}
public function GetOnClickJs($arParams)
{
$url = $this->getUrl($arParams);
return "BX.util.popup('".CUtil::JSEscape($url)."', 680, 600)";
}
public function getUrl($arParams)
{
global $APPLICATION;
if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
{
$redirect_uri = static::CONTROLLER_URL."/redirect.php";
$state = $this->getEntityOAuth()->GetRedirectURI()."?check_key=".\CSocServAuthManager::getUniqueKey()."&state=";
$backurl = $APPLICATION->GetCurPageParam('', array("logout", "auth_service_error", "auth_service_id", "backurl"));
$state .= urlencode("state=".urlencode("backurl=".urlencode($backurl).(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '')));
}
else
{
$state = 'site_id='.SITE_ID.'&backurl='.urlencode($APPLICATION->GetCurPageParam('check_key='.\CSocServAuthManager::getUniqueKey(), array("logout", "auth_service_error", "auth_service_id", "backurl"))).(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '');
$redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
}
return $this->getEntityOAuth()->GetAuthUrl($redirect_uri, $state);
}
public function addScope($scope)
{
return $this->getEntityOAuth()->addScope($scope);
}
public function prepareUser($arFBUser, $short = false)
{
$arFields = array(
'EXTERNAL_AUTH_ID' => self::ID,
'XML_ID' => $arFBUser["id"],
'LOGIN' => static::LOGIN_PREFIX.$arFBUser["id"],
'EMAIL' => ($arFBUser["email"] != '') ? $arFBUser["email"] : '',
'NAME'=> $arFBUser["first_name"],
'LAST_NAME'=> $arFBUser["last_name"],
'OATOKEN' => $this->entityOAuth->getToken(),
'OATOKEN_EXPIRES' => $this->entityOAuth->getAccessTokenExpires(),
);
if(!$short && isset($arFBUser['picture']['data']['url']) && !$arFBUser['picture']['data']['is_silhouette'])
{
$picture_url = CFacebookInterface::GRAPH_URL.'/'.$arFBUser['id'].'/picture?type=large';
$temp_path = CFile::GetTempName('', 'picture.jpg');
$ob = new HttpClient(array(
"redirect" => true
));
$ob->download($picture_url, $temp_path);
$arPic = CFile::MakeFileArray($temp_path);
if($arPic)
{
$arFields["PERSONAL_PHOTO"] = $arPic;
}
}
if(isset($arFBUser['birthday']))
{
if($date = MakeTimeStamp($arFBUser['birthday'], "MM/DD/YYYY"))
{
$arFields["PERSONAL_BIRTHDAY"] = ConvertTimeStamp($date);
}
}
if(isset($arFBUser['gender']) && $arFBUser['gender'] != '')
{
if($arFBUser['gender'] == 'male')
{
$arFields["PERSONAL_GENDER"] = 'M';
}
elseif($arFBUser['gender'] == 'female')
{
$arFields["PERSONAL_GENDER"] = 'F';
}
}
$arFields["PERSONAL_WWW"] = $this->getProfileUrl($arFBUser['id']);
if(SITE_ID <> '')
{
$arFields["SITE_ID"] = SITE_ID;
}
return $arFields;
}
public function Authorize()
{
global $APPLICATION;
$APPLICATION->RestartBuffer();
$authError = SOCSERV_AUTHORISATION_ERROR;
if(
isset($_REQUEST["code"]) && $_REQUEST["code"] <> ''
&& CSocServAuthManager::CheckUniqueKey()
)
{
if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
{
$redirect_uri = static::CONTROLLER_URL."/redirect.php";
}
else
{
$redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
}
$this->entityOAuth = $this->getEntityOAuth($_REQUEST['code']);
if($this->entityOAuth->GetAccessToken($redirect_uri) !== false)
{
$arFBUser = $this->entityOAuth->GetCurrentUser();
if(is_array($arFBUser) && isset($arFBUser["id"]))
{
$arFields = self::prepareUser($arFBUser);
$authError = $this->AuthorizeUser($arFields);
}
}
}
$bSuccess = $authError === true;
$url = ($APPLICATION->GetCurDir() == "/login/") ? "" : $APPLICATION->GetCurDir();
$aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
if(isset($_REQUEST["state"]) && $bSuccess)
{
$arState = array();
parse_str($_REQUEST["state"], $arState);
if(isset($arState['backurl']) || isset($arState['redirect_url']))
{
$url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
if(mb_substr($url, 0, 1) !== "#")
{
$parseUrl = parse_url($url);
$urlPath = $parseUrl["path"];
$arUrlQuery = explode('&', $parseUrl["query"]);
foreach($arUrlQuery as $key => $value)
{
foreach($aRemove as $param)
{
if(mb_strpos($value, $param."=") === 0)
{
unset($arUrlQuery[$key]);
break;
}
}
}
$url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
}
}
}
if($authError === SOCSERV_REGISTRATION_DENY)
{
$url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
$url .= 'auth_service_id='.self::ID.'&auth_service_error='.$authError;
}
elseif($bSuccess !== true)
{
$url = (isset($urlPath)) ? $urlPath.'?auth_service_id='.self::ID.'&auth_service_error='.$authError : $GLOBALS['APPLICATION']->GetCurPageParam(('auth_service_id='.self::ID.'&auth_service_error='.$authError), $aRemove);
}
if(CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
{
$url .= ((mb_strpos($url, "?") === false) ? '?' : '&')."current_fieldset=SOCSERV";
}
?>