1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
dropbox.php
См. документацию.
1<?php
3
5{
6 const ID = "Dropbox";
7 const CONTROLLER_URL = "https://www.bitrix24.ru/controller";
8 const LOGIN_PREFIX = "DB_";
9
11 protected $entityOAuth = null;
12
17 public function getEntityOAuth($code = false)
18 {
19 if(!$this->entityOAuth)
20 {
21 $this->entityOAuth = new CDropboxOAuthInterface();
22 }
23
24 if($code !== false)
25 {
26 $this->entityOAuth->setCode($code);
27 }
28
29 return $this->entityOAuth;
30 }
31
32 public function GetSettings()
33 {
34 return array(
35 array("dropbox_appid", GetMessage("socserv_dropbox_client_id"), "", array("text", 40)),
36 array("dropbox_appsecret", GetMessage("socserv_dropbox_client_secret"), "", array("text", 40)),
37 array("note"=>GetMessage("socserv_dropbox_note", array('#URL#'=>CDropboxOAuthInterface::GetRedirectURI()))),
38 );
39 }
40
41 public function GetFormHtml($arParams)
42 {
43 $url = static::getUrl('opener', null, $arParams);
44
45 $phrase = ($arParams["FOR_INTRANET"]) ? GetMessage("socserv_dropbox_form_note_intranet") : GetMessage("socserv_dropbox_form_note");
46
47 if($arParams["FOR_INTRANET"])
48 {
49 return array("ON_CLICK" => 'onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 680, 600)"');
50 }
51 else
52 {
53 return '<a href="javascript:void(0)" onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 680, 600)" class="bx-ss-button dropbox-button"></a><span class="bx-spacer"></span><span>'.$phrase.'</span>';
54 }
55 }
56
57 public function GetOnClickJs($arParams)
58 {
59 $url = static::getUrl('opener', null, $arParams);
60 return "BX.util.popup('".CUtil::JSEscape($url)."', 680, 600)";
61 }
62
63
64 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
65 {
66 global $APPLICATION;
67
68 $this->entityOAuth = $this->getEntityOAuth();
69 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
70 {
71 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
72 $state = CDropboxOAuthInterface::GetRedirectURI()."?check_key=".\CSocServAuthManager::getUniqueKey()."&state=";
73 $backurl = $APPLICATION->GetCurPageParam('', array("logout", "auth_service_error", "auth_service_id", "backurl"));
74
75 $stateIntoState = 'mode=' . $location;
76 if (isset($arParams['BACKURL']))
77 {
78 $stateIntoState .= '&redirect_url=' . urlencode($arParams['BACKURL']);
79 }
80 else
81 {
82 $stateIntoState .= "&backurl=" . urlencode($backurl);
83 }
84 $state .= urlencode("state=" . urlencode($stateIntoState));
85 }
86 else
87 {
88 $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']) : '');
89 $redirect_uri = CDropboxOAuthInterface::GetRedirectURI();
90 }
91
92 return $this->entityOAuth->GetAuthUrl($redirect_uri, $state);
93 }
94
95 public function getStorageToken()
96 {
97 $accessToken = null;
98 $userId = intval($this->userId);
99 if($userId > 0)
100 {
101 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
102 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID" => static::ID],
103 'select' => ["OATOKEN", "REFRESH_TOKEN", "OATOKEN_EXPIRES"]
104 ]);
105 if($arOauth = $dbSocservUser->fetch())
106 {
107 $accessToken = $arOauth["OATOKEN"];
108 }
109 }
110
111 return $accessToken;
112 }
113
114 public function prepareUser($arDropboxUser, $short = false)
115 {
116 $first_name = "";
117 $last_name = "";
118 if(is_array($arDropboxUser['name']))
119 {
120 $first_name = $arDropboxUser['name']['given_name'];
121 $last_name = $arDropboxUser['name']['surname'];
122 }
123
124 $id = $arDropboxUser['uid'];
125
126 $arFields = array(
127 'EXTERNAL_AUTH_ID' => static::ID,
128 'XML_ID' => $id,
129 'LOGIN' => static::LOGIN_PREFIX.$id,
130 'NAME'=> $first_name,
131 'LAST_NAME'=> $last_name,
132 'EMAIL' => $arDropboxUser["email"],
133 'OATOKEN' => $this->entityOAuth->getToken(),
134 'OATOKEN_EXPIRES' => $this->entityOAuth->getAccessTokenExpires(),
135 );
136
137 if(SITE_ID <> '')
138 {
139 $arFields["SITE_ID"] = SITE_ID;
140 }
141
142 return $arFields;
143 }
144
145 public function Authorize()
146 {
147 global $APPLICATION;
148 $APPLICATION->RestartBuffer();
149
150 $bSuccess = false;
151 $bProcessState = false;
152 $authError = SOCSERV_AUTHORISATION_ERROR;
153
154 if(
155 isset($_REQUEST["code"]) && $_REQUEST["code"] <> '' && CSocServAuthManager::CheckUniqueKey()
156 )
157 {
158 $bProcessState = true;
159
160 $this->entityOAuth = $this->getEntityOAuth($_REQUEST['code']);
161
162 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
163 {
164 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
165 }
166 else
167 {
168 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
169 }
170
171 if($this->entityOAuth->GetAccessToken($redirect_uri) !== false)
172 {
173 $arDropboxUser = $this->entityOAuth->GetCurrentUser();
174 if(is_array($arDropboxUser))
175 {
176 $arFields = self::prepareUser($arDropboxUser);
177 $authError = $this->AuthorizeUser($arFields);
178 $bSuccess = $authError === true;
179 }
180 }
181 }
182
183 $url = ($APPLICATION->GetCurDir() == "/login/") ? "" : $APPLICATION->GetCurDir();
184 $aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
185
186 if(!$bProcessState)
187 {
188 unset($_REQUEST["state"]);
189 }
190
191 $mode = 'opener';
192 $addParams = true;
193 if(isset($_REQUEST["state"]))
194 {
195 $arState = array();
196 parse_str($_REQUEST["state"], $arState);
197
198 if(isset($arState['backurl']) || isset($arState['redirect_url']))
199 {
200 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
201 if(mb_substr($url, 0, 1) !== "#")
202 {
203 $parseUrl = parse_url($url);
204
205 $urlPath = $parseUrl["path"];
206 $arUrlQuery = explode('&', $parseUrl["query"]);
207
208 foreach($arUrlQuery as $key => $value)
209 {
210 foreach($aRemove as $param)
211 {
212 if(mb_strpos($value, $param."=") === 0)
213 {
214 unset($arUrlQuery[$key]);
215 break;
216 }
217 }
218 }
219
220 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
221 }
222 else
223 {
224 $addParams = false;
225 }
226 }
227
228 if(isset($arState['mode']))
229 {
230 $mode = $arState['mode'];
231 }
232 }
233
234 if($authError === SOCSERV_REGISTRATION_DENY)
235 {
236 $url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
237 $url .= 'auth_service_id='.static::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
238 }
239 elseif($bSuccess !== true)
240 {
241 $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);
242 }
243
244 if($addParams && CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
245 {
246 $url = (preg_match("/\?/", $url)) ? $url."&current_fieldset=SOCSERV" : $url."?current_fieldset=SOCSERV";
247 }
248
249 $url = CUtil::JSEscape($url);
250
251 if($addParams)
252 {
253 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = \''.$url.'\'; window.close();' : ' window.location = \''.$url.'\';';
254 }
255 else
256 {
257 //fix for chrome
258 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = window.opener.location.href + \''.$url.'\'; window.close();' : ' window.location = window.location.href + \''.$url.'\';';
259 }
260
261 $JSScript = '
262 <script>
263 '.$location.'
264 </script>
265 ';
266
267 echo $JSScript;
268
269 CMain::FinalActions();
270 }
271}
272
273class CDropboxOAuthInterface extends CSocServOAuthTransport
274{
275 const SERVICE_ID = "Dropbox";
276
277 const AUTH_URL = "https://www.dropbox.com/oauth2/authorize";
278 const TOKEN_URL = "https://www.dropbox.com/oauth2/token";
279
280 const ACCOUNT_URL = "https://api.dropboxapi.com/2/users/get_current_account";
281
282 protected $oauthResult;
283
284 public function __construct($appID = false, $appSecret = false, $code = false)
285 {
286 if($appID === false)
287 {
288 $appID = trim(CSocServDropboxAuth::GetOption("dropbox_appid"));
289 }
290
291 if($appSecret === false)
292 {
293 $appSecret = trim(CSocServDropboxAuth::GetOption("dropbox_appsecret"));
294 }
295
296 parent::__construct($appID, $appSecret, $code);
297 }
298
299 public static function GetRedirectURI()
300 {
301 return \CHTTP::URN2URI("/bitrix/tools/oauth/dropbox.php");
302 }
303
304 public function GetAuthUrl($redirect_uri, $state = '')
305 {
306 return static::AUTH_URL.
307 "?client_id=".urlencode($this->appID).
308 "&redirect_uri=".urlencode($redirect_uri).
309 "&response_type=code".
310 ($state <> '' ? '&state='.urlencode($state) : '');
311 }
312
313 public function GetAccessToken($redirect_uri)
314 {
315 $tokens = $this->getStorageTokens();
316
317 if(is_array($tokens))
318 {
319 $this->access_token = $tokens["OATOKEN"];
320
321 if(!$this->code)
322 {
323 return true;
324 }
325
326 $this->deleteStorageTokens();
327 }
328
329 if($this->code === false)
330 {
331 return false;
332 }
333
334 $h = new \Bitrix\Main\Web\HttpClient();
335 $result = $h->post(static::TOKEN_URL, array(
336 "code"=>$this->code,
337 "client_id"=>$this->appID,
338 "client_secret"=>$this->appSecret,
339 "redirect_uri"=>$redirect_uri,
340 "grant_type"=>"authorization_code",
341 ));
342
343 $this->oauthResult = \Bitrix\Main\Web\Json::decode($result);
344
345 if(isset($this->oauthResult["access_token"]) && $this->oauthResult["access_token"] <> '')
346 {
347 if(isset($this->oauthResult["refresh_token"]) && $this->oauthResult["refresh_token"] <> '')
348 {
349 $this->refresh_token = $this->oauthResult["refresh_token"];
350 }
351 $this->access_token = $this->oauthResult["access_token"];
352
353 $_SESSION["OAUTH_DATA"] = array(
354 "OATOKEN" => $this->access_token,
355 );
356
357 return true;
358 }
359 return false;
360 }
361
362 public function GetCurrentUser()
363 {
364 if($this->access_token === false)
365 return false;
366
367 $h = new \Bitrix\Main\Web\HttpClient();
368 $h->setHeader("Authorization", "Bearer ".$this->access_token);
369 $h->setHeader("Content-Type", ""); // !!! Dropbox doest not accept empty POST requests with application/json or application/x-www-form-urlencoded types
370
371 $result = $h->post(static::ACCOUNT_URL);
372
374
375 if(is_array($result))
376 {
377 $result["uid"] = $this->oauthResult['uid'];
378 $result["access_token"] = $this->access_token;
379 }
380
381 return $result;
382 }
383}
$arParams
Определения access_dialog.php:21
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
static decode($data)
Определения json.php:50
static GetRedirectURI()
Определения dropbox.php:299
__construct($appID=false, $appSecret=false, $code=false)
Определения dropbox.php:284
const TOKEN_URL
Определения dropbox.php:278
GetAccessToken($redirect_uri)
Определения dropbox.php:313
GetCurrentUser()
Определения dropbox.php:362
GetAuthUrl($redirect_uri, $state='')
Определения dropbox.php:304
$oauthResult
Определения dropbox.php:282
const ACCOUNT_URL
Определения dropbox.php:280
Определения authmanager.php:985
static GetOption($opt)
Определения authmanager.php:1339
Определения dropbox.php:5
const ID
Определения dropbox.php:6
GetSettings()
Определения dropbox.php:32
$entityOAuth
Определения dropbox.php:11
getEntityOAuth($code=false)
Определения dropbox.php:17
const CONTROLLER_URL
Определения dropbox.php:7
const LOGIN_PREFIX
Определения dropbox.php:8
GetFormHtml($arParams)
Определения dropbox.php:41
getStorageTokens()
Определения oauthtransport.php:116
deleteStorageTokens()
Определения oauthtransport.php:134
</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
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
const SITE_ID
Определения sonet_set_content_view.php:12
path
Определения template_copy.php:201
$url
Определения iframe.php:7