• Модуль: socialservices
  • Путь к файлу: ~/bitrix/modules/socialservices/classes/general/openidclient.php
  • Класс: COpenIDClient
  • Вызов: COpenIDClient::Authorize
public function Authorize()
{
	global $APPLICATION, $USER;
	$errorCode = 1;
	if ($arOpenID = $this->Validate())
	{
		$arFields = array(
			'EXTERNAL_AUTH_ID' => 'OPENID#' . $arOpenID['server'],
			'XML_ID' => $arOpenID['identity'],
			'PASSWORD' => randString(30),
			'LID' => SITE_ID,
			"PERSONAL_WWW" => $arOpenID['identity'],
		);

		if (array_key_exists('openid_sreg_email', $_GET))
			$arFields['EMAIL'] = $_GET['openid_sreg_email'];

		if (array_key_exists('openid_sreg_gender', $_GET) && ($_GET['openid_sreg_gender'] == 'M' || $_GET['openid_sreg_gender'] == 'F'))
			$arFields['PERSONAL_GENDER'] = $_GET['openid_sreg_gender'];

		if (array_key_exists('openid_sreg_fullname', $_GET))
		{
			$fullname = (defined("BX_UTF")? $_GET['openid_sreg_fullname'] : CharsetConverter::ConvertCharset($_GET['openid_sreg_fullname'], 'UTF-8', LANG_CHARSET));
			$fullname = trim($fullname);
			if (($pos = mb_strpos($fullname, ' ')) !== false)
			{
				$arFields['NAME'] = mb_substr($fullname, 0, $pos);
				$arFields['LAST_NAME'] = mb_substr($fullname, $pos + 1);
			}
			else
			{
				$arFields['NAME'] = $fullname;
			}
		}

		if (array_key_exists('openid_sreg_postcode', $_GET))
			$arFields['PERSONAL_ZIP'] = $_GET['openid_sreg_postcode'];

		if (array_key_exists('openid_sreg_timezone', $_GET))
			$arFields['TIME_ZONE'] = $_GET['openid_sreg_timezone'];

		if (array_key_exists('openid_sreg_country', $_GET))
			$arFields['PERSONAL_COUNTRY'] = GetCountryIdByCode($_GET['openid_sreg_country']);

		if (array_key_exists('openid_sreg_dob', $_GET))
			$arFields['PERSONAL_BIRTHDAY'] = CDatabase::FormatDate($_GET['openid_sreg_dob'], "YYYY-MM-DD", FORMAT_DATE);

		if (array_key_exists('BX_OPENID_IDENTITY', $_SESSION))
			$arFields['LOGIN'] = $_SESSION['BX_OPENID_IDENTITY'];
		else
			$arFields['LOGIN'] = $arOpenID['identity'];

		$arFields['LOGIN'] = preg_replace("#^(http://|https://)#i", "", $arFields['LOGIN']);

		$USER_ID = 0;

		if($GLOBALS["USER"]->IsAuthorized() && $GLOBALS["USER"]->GetID())
		{
			if(!CSocServAuth::isSplitDenied())
			{
				$arFields['USER_ID'] = $GLOBALS["USER"]->GetID();
				BitrixSocialservicesUserTable::add($arFields);
				self::CleanParam();
			}
			else
			{
				$errorCode = SOCSERV_REGISTRATION_DENY;
			}
		}
		else
		{
			$dbUsersOld = $GLOBALS["USER"]->GetList($by, $ord, array('XML_ID'=>$arFields['XML_ID'], 'EXTERNAL_AUTH_ID'=>$arFields['EXTERNAL_AUTH_ID'], 'ACTIVE'=>'Y'), array('NAV_PARAMS'=>array("nTopCount"=>"1")));
			$dbUsersNew = $GLOBALS["USER"]->GetList($by, $ord, array('XML_ID'=>$arFields['XML_ID'], 'EXTERNAL_AUTH_ID'=>'socservices', 'ACTIVE'=>'Y'),  array('NAV_PARAMS'=>array("nTopCount"=>"1")));
			$dbSocUser = BitrixSocialservicesUserTable::getList([
				'filter' => [
					'=XML_ID'=>$arFields['XML_ID'],
					'=EXTERNAL_AUTH_ID'=>$arFields['EXTERNAL_AUTH_ID']
				],
				'select' => ["USER_ID", "ACTIVE" => "USER.ACTIVE", "XML_ID"]
			]);
			if($arUser = $dbSocUser->fetch())
			{
				if($arUser["ACTIVE"] === 'Y')
					$USER_ID = $arUser["USER_ID"];
			}
			elseif ($arUser = $dbUsersOld->Fetch())
			{
				$USER_ID = $arUser['ID'];
			}
			elseif($arUser = $dbUsersNew->Fetch())
			{
				$USER_ID = $arUser["ID"];
			}
			elseif(COption::GetOptionString("main", "new_user_registration", "N") == "Y")
			{
				$def_group = COption::GetOptionString('main', 'new_user_registration_def_group', '');
				if($def_group != '')
					$arFields['GROUP_ID'] = explode(',', $def_group);

				if(!empty($arFields['GROUP_ID']) && CSocServAuth::isAuthDenied($arFields['GROUP_ID']))
				{
					$errorCode = SOCSERV_REGISTRATION_DENY;
				}
				else
				{
					foreach(GetModuleEvents("main", "OnBeforeOpenIDUserAdd", true) as $arEvent)
						ExecuteModuleEventEx($arEvent, array($arFields));

					$arFieldsUser = $arFields;
					$arFieldsUser["EXTERNAL_AUTH_ID"] = "socservices";
					if(!($USER_ID = $GLOBALS["USER"]->Add($arFieldsUser)))
						return false;
					$arFields['CAN_DELETE'] = 'N';
					$arFields['USER_ID'] = $USER_ID;
					BitrixSocialservicesUserTable::add($arFields);
					unset($arFields['CAN_DELETE']);
				}
			}
			elseif(COption::GetOptionString("main", "new_user_registration", "N") == "N")
				$errorCode = 2;

			if (intval($USER_ID) > 0)
			{
				if($arUser && $arUser["XML_ID"] !== $arFields['XML_ID'])
				{
					$USER_ID = 0;
				}
			}

			if (intval($USER_ID) > 0)
			{
				$arGroups = $USER->GetUserGroup($USER_ID);
				if(CSocServAuth::isAuthDenied($arGroups))
				{
					$errorCode = SOCSERV_AUTHORISATION_ERROR;
				}
				else
				{
					$USER->AuthorizeWithOtp($USER_ID);

					$arKillParams = array("auth_service_id", "check_key");
					foreach (array_keys($_GET) as $k)
						if (mb_strpos($k, 'openid_') === 0)
							$arKillParams[] = $k;

					$redirect_url = $APPLICATION->GetCurPageParam('', $arKillParams, false);

					foreach(GetModuleEvents("main", "OnBeforeOpenIDAuthFinalRedirect", true) as $arEvent)
						ExecuteModuleEventEx($arEvent, array($redirect_url, $USER_ID, $arFields));

					if ($redirect_url)
						LocalRedirect($redirect_url, true);

					return $USER_ID;
				}
			}
		}
	}
	$arKillParams = array("check_key");
	foreach (array_keys($_GET) as $k)
		if (mb_strpos($k, 'openid') === 0)
			$arKillParams[] = $k;
	$redirect_url = $APPLICATION->GetCurPageParam('auth_service_error='.$errorCode, $arKillParams, false);
	LocalRedirect($redirect_url, true);
	return false;
}