15 private static bool $isCloudPortal;
21 array(
"mailru2_client_id",
GetMessage(
"socserv_mailru2_id"),
"", Array(
"text", 40)),
22 array(
"mailru2_client_secret",
GetMessage(
"socserv_mailru2_key"),
"", Array(
"text", 40)),
25 'socserv_mailru2_sett_note_2',
28 '#MAIL_URL#' => \CHttp::urn2uri(
'/bitrix/tools/mail_oauth.php'),
41 if (!$this->entityOAuth)
48 $this->entityOAuth->setCode(
$code);
64 : '<a href="javascript:void(0)
" onclick="BX.util.popup(\
'' .
htmlspecialcharsbx(CUtil::JSEscape(
$url)) .
'\', 460, 420)
" class="bx-ss-button mailru-button
"></a><span class="bx-spacer
"></span><span>' . $phrase . '</span>';
67 public function GetOnClickJs($arParams)
69 $url = $this->getUrl($arParams);
70 return "BX.util.popup(
'" . CUtil::JSEscape($url) . "', 460, 420)
";
73 public function getUrl($arParams)
83 ?? $APPLICATION->GetCurPageParam('', [
84 'logout', 'auth_service_error', 'auth_service_id', 'backurl',
87 $state = StateService::getInstance()->createState([
89 'check_key' => \CSocServAuthManager::getUniqueKey(),
90 'redirect_url' => $backUrl,
93 if ($this->isCloudPortal())
95 $portalRedirectUri = new Uri(
96 $this->getEntityOAuth()->GetRedirectURI()
98 $portalRedirectUri->addParams([
102 $state = (string)$portalRedirectUri;
103 $redirectUri = new Uri(
104 static::CONTROLLER_URL . '/redirect.php'
109 $redirectUri = $this->getEntityOAuth()->GetRedirectURI();
112 return $this->getEntityOAuth()->GetAuthUrl($redirectUri, $state);
115 public function addScope($scope)
117 return $this->getEntityOAuth()->addScope($scope);
120 public function prepareUser($arUser, $short = false)
122 $entityOAuth = $this->getEntityOAuth();
124 'EXTERNAL_AUTH_ID' => self::ID,
125 'XML_ID' => $arUser["email
"],
126 'LOGIN' => $arUser["email
"],
127 'EMAIL' => $arUser["email
"],
128 'NAME' => $arUser["first_name
"],
129 'LAST_NAME' => $arUser["last_name
"],
130 'OATOKEN' => $entityOAuth->getToken(),
131 'OATOKEN_EXPIRES' => $entityOAuth->getAccessTokenExpires(),
134 if (!$short && isset($arUser['image']))
136 $picture_url = $arUser['image'];
137 $temp_path = CFile::GetTempName('', 'picture.jpg');
139 $ob = new HttpClient(array(
142 $ob->download($picture_url, $temp_path);
144 $arPic = CFile::MakeFileArray($temp_path);
147 $arFields["PERSONAL_PHOTO
"] = $arPic;
151 if (isset($arUser['birthday']))
153 if ($date = MakeTimeStamp($arUser['birthday'], "MM/DD/YYYY
"))
155 $arFields["PERSONAL_BIRTHDAY
"] = ConvertTimeStamp($date);
159 if (isset($arUser['gender']) && $arUser['gender'] != '')
161 if ($arUser['gender'] == 'm')
163 $arFields["PERSONAL_GENDER
"] = 'M';
165 elseif ($arUser['gender'] == 'f')
167 $arFields["PERSONAL_GENDER
"] = 'F';
173 $arFields["SITE_ID"] = SITE_ID;
179 private function isCloudPortal(): bool
181 self::$isCloudPortal ??= IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME');
183 return self::$isCloudPortal;
186 private function getRequestState(string $state = null): ?array
190 if (isset($_REQUEST['state']))
192 $state = $_REQUEST['state'];
200 return StateService::getInstance()->getPayload($state);
203 private function getAuthorizeRedirectUrl($authError): string
211 $bSuccess = $authError === true;
213 $url = $APPLICATION->GetCurDir();
214 if ($url === '/login/')
219 $aRemove = array("logout
", "auth_service_error
", "auth_service_id
", "code
", "error_reason
", "error
", "error_description
", "check_key
", "current_fieldset
");
220 $arState = $this->getRequestState();
225 isset($arState['backurl'])
226 || isset($arState['redirect_url'])
230 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
231 if (mb_substr($url, 0, 1) !== "#
")
233 $parseUrl = parse_url($url);
235 $urlPath = $parseUrl["path"];
236 $arUrlQuery = explode('&', $parseUrl["query
"]);
238 foreach ($arUrlQuery as $key => $value)
240 foreach ($aRemove as $param)
242 if (mb_strpos($value, $param."=
") === 0)
244 unset($arUrlQuery[$key]);
250 $url = (!empty($arUrlQuery)) ? $urlPath . '?' . implode("&
", $arUrlQuery) : $urlPath;
254 if ($authError === SOCSERV_REGISTRATION_DENY)
256 $url = (preg_match("/\?/
", $url)) ? $url . '&' : $url . '?';
257 $url .= 'auth_service_id=' . self::ID . '&auth_service_error=' . $authError;
259 elseif ($bSuccess !== true)
261 $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);
264 if (CModule::IncludeModule("socialnetwork
") && mb_strpos($url, "current_fieldset=
") === false)
266 $url .= ((mb_strpos($url, "?
") === false) ? '?' : '&') . "current_fieldset=SOCSERV
";
272 public function Authorize()
276 $APPLICATION->RestartBuffer();
277 $authError = SOCSERV_AUTHORISATION_ERROR;
280 isset($_REQUEST["code
"])
281 && $_REQUEST["code
"] <> ''
282 && CSocServAuthManager::CheckUniqueKey()
285 if ($this->isCloudPortal())
287 $redirect_uri = static::CONTROLLER_URL . "/redirect.php
";
291 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
294 $entityOAuth = $this->getEntityOAuth($_REQUEST['code']);
295 if ($entityOAuth->GetAccessToken($redirect_uri) !== false)
297 $arUser = $entityOAuth->GetCurrentUser();
298 if (is_array($arUser) && isset($arUser["email
"]))
300 $authError = $this->AuthorizeUser(
301 $this->prepareUser($arUser)
307 $url = $this->getAuthorizeRedirectUrl($authError);
311 window.opener.location = '<?=CUtil::JSEscape($url)?>';
315 CMain::FinalActions();
318 public function setUser($userId)
320 $this->getEntityOAuth()->setUser($userId);