1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
box.php
См. документацию.
1<?php
4
6
8{
9 const ID = "Box";
10 const CONTROLLER_URL = "https://www.bitrix24.ru/controller";
11 const LOGIN_PREFIX = "B_";
12
14 protected $entityOAuth = null;
15
20 public function getEntityOAuth($code = false)
21 {
22 if(!$this->entityOAuth)
23 {
24 $this->entityOAuth = new CBoxOAuthInterface();
25 }
26
27 if($code !== false)
28 {
29 $this->entityOAuth->setCode($code);
30 }
31
32 return $this->entityOAuth;
33 }
34
35 public function GetSettings()
36 {
37 return array(
38 array("box_appid", GetMessage("socserv_box_client_id"), "", array("text", 40)),
39 array("box_appsecret", GetMessage("socserv_box_client_secret"), "", array("text", 40)),
40 array("note"=>GetMessage("socserv_box_note_2", array('#URL#'=>CBoxOAuthInterface::GetRedirectURI()))),
41 );
42 }
43
44 public function GetFormHtml($arParams)
45 {
46 $url = $this->getUrl('opener', null, $arParams);
47
48 $phrase = ($arParams["FOR_INTRANET"]) ? GetMessage("socserv_box_form_note_intranet") : GetMessage("socserv_box_form_note");
49
50 if($arParams["FOR_INTRANET"])
51 {
52 return array("ON_CLICK" => 'onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 680, 600)"');
53 }
54 else
55 {
56 return '<a href="javascript:void(0)" onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 680, 600)" class="bx-ss-button box-button"></a><span class="bx-spacer"></span><span>'.$phrase.'</span>';
57 }
58 }
59
60 public function GetOnClickJs($arParams)
61 {
62 $url = $this->getUrl('opener', null, $arParams);
63 return "BX.util.popup('".CUtil::JSEscape($url)."', 680, 600)";
64 }
65
66 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
67 {
68 global $APPLICATION;
69
70 $this->entityOAuth = $this->getEntityOAuth();
71 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
72 {
73 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
74 $state = CBoxOAuthInterface::GetRedirectURI()."?check_key=".\CSocServAuthManager::getUniqueKey()."&state=";
75 $backurl = $APPLICATION->GetCurPageParam('', array("logout", "auth_service_error", "auth_service_id", "backurl"));
76 $state .= urlencode("state=".urlencode("backurl=".urlencode($backurl).'&mode='.$location.(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '')));
77 }
78 else
79 {
80 $state = 'site_id='.SITE_ID.'&backurl='.urlencode($APPLICATION->GetCurPageParam('check_key='.\CSocServAuthManager::getUniqueKey(), array("logout", "auth_service_error", "auth_service_id", "backurl"))).'&mode='.$location.(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '');
81 $redirect_uri = CBoxOAuthInterface::GetRedirectURI();
82 }
83
84 return $this->entityOAuth->GetAuthUrl($redirect_uri, $state);
85 }
86
87 public function getStorageToken()
88 {
89 $accessToken = null;
90 $userId = intval($this->userId);
91 if($userId > 0)
92 {
93 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
94 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID" => static::ID],
95 'select' => ["USER_ID", "OATOKEN", "REFRESH_TOKEN", "OATOKEN_EXPIRES"]
96 ]);
97 if($arOauth = $dbSocservUser->fetch())
98 {
99 $accessToken = $arOauth["OATOKEN"];
100 $accessTokenExpires = $arOauth["OATOKEN_EXPIRES"];
101
102 $entityOauth = $this->getEntityOAuth();
103 $entityOauth->setToken($accessToken);
104 $entityOauth->setAccessTokenExpires($accessTokenExpires);
105
106 if($entityOauth->checkAccessToken())
107 {
108 return $accessToken;
109 }
110 elseif(isset($arOauth["REFRESH_TOKEN"]))
111 {
112 if($entityOauth->getNewAccessToken($arOauth["REFRESH_TOKEN"], $arOauth["USER_ID"],true))
113 {
114 return $entityOauth->getToken();
115 }
116 }
117 }
118 }
119
120 return $accessToken;
121 }
122
123 public function prepareUser($boxUser, $short = false)
124 {
125 $nameDetails = explode(" ", $boxUser['name'], 2);
126
127 $id = $boxUser['id'];
128
129 $arFields = array(
130 'EXTERNAL_AUTH_ID' => static::ID,
131 'XML_ID' => $id,
132 'LOGIN' => static::LOGIN_PREFIX.$id,
133 'NAME'=> $nameDetails[0],
134 'LAST_NAME'=> $nameDetails[1],
135 'EMAIL' => $boxUser["login"],
136 'OATOKEN' => $this->entityOAuth->getToken(),
137 'OATOKEN_EXPIRES' => $this->entityOAuth->getAccessTokenExpires(),
138 'REFRESH_TOKEN' => $this->entityOAuth->getRefreshToken(),
139 );
140
141 if(!$short && !empty($boxUser['avatar_url']))
142 {
143 $picture_url = $boxUser['avatar_url'];
144 $temp_path = CFile::GetTempName('', 'picture.jpg');
145
146 $ob = new HttpClient(array(
147 "redirect" => true
148 ));
149 $ob->download($picture_url, $temp_path);
150
151 $arPic = CFile::MakeFileArray($temp_path);
152 if($arPic)
153 {
154 $arFields["PERSONAL_PHOTO"] = $arPic;
155 }
156 }
157
158 if(SITE_ID <> '')
159 {
160 $arFields["SITE_ID"] = SITE_ID;
161 }
162
163 return $arFields;
164 }
165
166 public function Authorize()
167 {
168 global $APPLICATION;
169 $APPLICATION->RestartBuffer();
170
171 $bSuccess = false;
172 $bProcessState = false;
173 $authError = SOCSERV_AUTHORISATION_ERROR;
174
175 if(
176 isset($_REQUEST["code"]) && $_REQUEST["code"] <> '' && CSocServAuthManager::CheckUniqueKey()
177 )
178 {
179 $bProcessState = true;
180 $this->entityOAuth = $this->getEntityOAuth($_REQUEST['code']);
181
182 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
183 {
184 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
185 }
186 else
187 {
188 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
189 }
190
191 if($this->entityOAuth->GetAccessToken($redirect_uri) !== false)
192 {
193
194 $boxUser = $this->entityOAuth->GetCurrentUser();
195
196 if(is_array($boxUser))
197 {
198 $arFields = self::prepareUser($boxUser);
199 $authError = $this->AuthorizeUser($arFields);
200 $bSuccess = $authError === true;
201 }
202 }
203 }
204
205 $url = ($APPLICATION->GetCurDir() == "/login/") ? "" : $APPLICATION->GetCurDir();
206 $aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
207
208 if(!$bProcessState)
209 {
210 unset($_REQUEST["state"]);
211 }
212
213 $mode = 'opener';
214 $addParams = true;
215 if(isset($_REQUEST["state"]))
216 {
217 $arState = array();
218 parse_str($_REQUEST["state"], $arState);
219
220 if(isset($arState['backurl']) || isset($arState['redirect_url']))
221 {
222 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
223 if(mb_substr($url, 0, 1) !== "#")
224 {
225 $parseUrl = parse_url($url);
226
227 $urlPath = $parseUrl["path"];
228 $arUrlQuery = explode('&', $parseUrl["query"]);
229
230 foreach($arUrlQuery as $key => $value)
231 {
232 foreach($aRemove as $param)
233 {
234 if(mb_strpos($value, $param."=") === 0)
235 {
236 unset($arUrlQuery[$key]);
237 break;
238 }
239 }
240 }
241
242 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
243 }
244 else
245 {
246 $addParams = false;
247 }
248 }
249
250 if(isset($arState['mode']))
251 {
252 $mode = $arState['mode'];
253 }
254 }
255
256 if($authError === SOCSERV_REGISTRATION_DENY)
257 {
258 $url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
259 $url .= 'auth_service_id='.static::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
260 }
261 elseif($bSuccess !== true)
262 {
263 $url = (isset($urlPath)) ? $urlPath.'?auth_service_id='.static::ID.'&auth_service_error='.$authError : $APPLICATION->GetCurPageParam(('auth_service_id='.static::ID.'&auth_service_error='.$authError), $aRemove);
264 }
265
266 if($addParams && CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
267 {
268 $url = (preg_match("/\?/", $url)) ? $url."&current_fieldset=SOCSERV" : $url."?current_fieldset=SOCSERV";
269 }
270
271 $url = CUtil::JSEscape($url);
272
273 if($addParams)
274 {
275 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = \''.$url.'\'; window.close();' : ' window.location = \''.$url.'\';';
276 }
277 else
278 {
279 //fix for chrome
280 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = window.opener.location.href + \''.$url.'\'; window.close();' : ' window.location = window.location.href + \''.$url.'\';';
281 }
282
283 $JSScript = '
284 <script>
285 '.$location.'
286 </script>
287 ';
288
289 echo $JSScript;
290
291 CMain::FinalActions();
292 }
293}
294
295class CBoxOAuthInterface extends CSocServOAuthTransport
296{
297 const SERVICE_ID = "Box";
298
299 const AUTH_URL = "https://app.box.com/api/oauth2/authorize";
300 const TOKEN_URL = "https://app.box.com/api/oauth2/token";
301
302 const ACCOUNT_URL = "https://api.box.com/2.0/users/me";
303
304 protected $oauthResult;
305
306 public function __construct($appID = false, $appSecret = false, $code = false)
307 {
308 if($appID === false)
309 {
310 $appID = trim(CSocServBoxAuth::GetOption("box_appid"));
311 }
312
313 if($appSecret === false)
314 {
315 $appSecret = trim(CSocServBoxAuth::GetOption("box_appsecret"));
316 }
317
318 parent::__construct($appID, $appSecret, $code);
319 }
320
321 public static function GetRedirectURI()
322 {
323 return \CHTTP::URN2URI("/bitrix/tools/oauth/box.php");
324 }
325
326 public function GetAuthUrl($redirect_uri, $state = '')
327 {
328 return static::AUTH_URL.
329 "?client_id=".urlencode($this->appID).
330 "&redirect_uri=".urlencode($redirect_uri).
331 "&response_type=code".
332 ($state <> '' ? '&state='.urlencode($state) : '');
333 }
334
335 public function GetAccessToken($redirect_uri)
336 {
337 $token = $this->getStorageTokens();
338
339 if(is_array($token))
340 {
341 if(!$this->code)
342 {
343 $this->access_token = $token["OATOKEN"];
344 $this->accessTokenExpires = $token["OATOKEN_EXPIRES"];
345
346 if($this->checkAccessToken())
347 {
348 return true;
349 }
350 elseif(isset($token["REFRESH_TOKEN"]))
351 {
352 if($this->getNewAccessToken($token["REFRESH_TOKEN"], $token["USER_ID"], true))
353 {
354 return true;
355 }
356 }
357 }
358
359 $this->deleteStorageTokens();
360 }
361
362 if($this->code === false)
363 {
364 return false;
365 }
366
367 $h = new HttpClient();
368 $result = $h->post(static::TOKEN_URL, array(
369 "code"=>$this->code,
370 "client_id"=>$this->appID,
371 "client_secret"=>$this->appSecret,
372 "redirect_uri"=>$redirect_uri,
373 "grant_type"=>"authorization_code",
374 ));
375
376 $this->oauthResult = Json::decode($result);
377
378 if(isset($this->oauthResult["access_token"]) && $this->oauthResult["access_token"] <> '')
379 {
380 $this->access_token = $this->oauthResult["access_token"];
381 $this->accessTokenExpires = time() + $this->oauthResult["expires_in"];
382
383 if(isset($this->oauthResult["refresh_token"]) && $this->oauthResult["refresh_token"] <> '')
384 {
385 $this->refresh_token = $this->oauthResult["refresh_token"];
386 }
387
388 $_SESSION["OAUTH_DATA"] = array(
389 "OATOKEN" => $this->access_token,
390 );
391
392 return true;
393 }
394 return false;
395 }
396
397 public function getNewAccessToken($refreshToken = false, $userId = 0, $save = false, $scope = array())
398 {
399 if($this->appID == false || $this->appSecret == false)
400 {
401 return false;
402 }
403
404 if($refreshToken == false)
405 {
406 $refreshToken = $this->refresh_token;
407 }
408
409 $http = new HttpClient(array('socketTimeout' => $this->httpTimeout));
410
411 $result = $http->post(static::TOKEN_URL, array(
412 'client_id' => $this->appID,
413 'client_secret' => $this->appSecret,
414 'refresh_token' => $refreshToken,
415 'grant_type' => 'refresh_token',
416 ));
417
418 $arResult = Json::decode($result);
419
420 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
421 {
422 $this->access_token = $arResult["access_token"];
423 $this->accessTokenExpires = time() + $arResult["expires_in"];
424 $this->refresh_token = $arResult["refresh_token"];
425
426 if($save && intval($userId) > 0)
427 {
428 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
429 'filter' => [
430 "=USER_ID" => intval($userId),
431 "=EXTERNAL_AUTH_ID" => CSocServBoxAuth::ID
432 ],
433 'select' => ["ID"]
434 ]);
435
436 $arOauth = $dbSocservUser->fetch();
437
438 if($arOauth)
439 {
440 \Bitrix\Socialservices\UserTable::update(
441 $arOauth["ID"], array(
442 "OATOKEN" => $this->access_token,
443 "OATOKEN_EXPIRES" => $this->accessTokenExpires,
444 "REFRESH_TOKEN" => $this->refresh_token,
445 )
446 );
447 }
448 }
449
450 return true;
451 }
452 return false;
453 }
454
455
456 public function GetCurrentUser()
457 {
458 if($this->access_token === false)
459 return false;
460
461 $h = new HttpClient();
462 $h->setHeader("Authorization", "Bearer ".$this->access_token);
463
464 $result = $h->get(static::ACCOUNT_URL);
465
466 $result = Json::decode($result);
467
468 if(is_array($result))
469 {
470 $result["access_token"] = $this->access_token;
471 }
472
473 return $result;
474 }
475}
$arParams
Определения access_dialog.php:21
$arResult
Определения generate_coupon.php:16
change_password_forgot_link login popup forget pas AUTH_GOTO_FORGOT_FORM login btn wrap change_password_button login popup link login popup return auth javascript
Определения change_password.php:57
Определения json.php:9
Определения box.php:296
static GetRedirectURI()
Определения box.php:321
__construct($appID=false, $appSecret=false, $code=false)
Определения box.php:306
getNewAccessToken($refreshToken=false, $userId=0, $save=false, $scope=array())
Определения box.php:397
const TOKEN_URL
Определения box.php:300
GetAccessToken($redirect_uri)
Определения box.php:335
GetCurrentUser()
Определения box.php:456
GetAuthUrl($redirect_uri, $state='')
Определения box.php:326
$oauthResult
Определения box.php:304
const ACCOUNT_URL
Определения box.php:302
Определения authmanager.php:985
static GetOption($opt)
Определения authmanager.php:1339
Определения box.php:8
const ID
Определения box.php:9
GetSettings()
Определения box.php:35
$entityOAuth
Определения box.php:14
getEntityOAuth($code=false)
Определения box.php:20
const CONTROLLER_URL
Определения box.php:10
getUrl($location='opener', $addScope=null, $arParams=array())
Определения box.php:66
const LOGIN_PREFIX
Определения box.php:11
GetFormHtml($arParams)
Определения box.php:44
getStorageTokens()
Определения oauthtransport.php:116
deleteStorageTokens()
Определения oauthtransport.php:134
checkAccessToken()
Определения oauthtransport.php:153
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$save
Определения iblock_catalog_edit.php:365
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
const SITE_ID
Определения sonet_set_content_view.php:12
path
Определения template_copy.php:201
$url
Определения iframe.php:7