1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
openidclient.php
См. документацию.
1<?php
2
4
6{
8
9 public function SetTrustProviders($t)
10 {
11 if (is_array($t))
12 $this->_trust_providers = array_filter($t);
13 }
14
15 public function CheckTrustProviders($url)
16 {
17 if (count($this->_trust_providers) <= 0)
18 return true;
19
20 $arUrl = CHTTP::ParseURL($url);
21 foreach ($this->_trust_providers as $p)
22 if (mb_strpos($arUrl['host'], $p) !== false)
23 return true;
24
25 return false;
26 }
27
28 public function GetOpenIDServerTags($url)
29 {
30 if ($str = @CHTTP::sGet($url, true))
31 {
32 $server = '';
33 $delegate = '';
34
35 if (preg_match('/<link[^>]+rel=(["\'])([^>"]*\s)?openid\.server(\s[^>"]*)?\1[^>]*>/i', $str, $arLinks))
36 if (preg_match('/href=["\']([^"|\']+)["\']/i', $arLinks[0], $arHref))
37 $server = $arHref[1];
38
39 if (preg_match('/<link[^>]+rel=(["\'])([^>"]*\s)?openid.delegate(\s[^>"]*)?\1[^>]*>/i', $str, $arLinks))
40 if (preg_match('/href=["\']([^"|\']+)["\']/i', $arLinks[0], $arHref))
41 $delegate = $arHref[1];
42
43 if ($server == '')
44 {
45 $GLOBALS['APPLICATION']->ThrowException(GetMessage('OPENID_CLIENT_NO_OPENID_SERVER_TAG'));
46 return false;
47 }
48 return array('server' => $server, 'delegate' => $delegate);
49 }
50 $GLOBALS['APPLICATION']->ThrowException(GetMessage('OPENID_CLIENT_NO_OPENID_SERVER_TAG'));
51 return false;
52 }
53
54 public function GetRedirectUrl($identity, $return_to=false)
55 {
56 if ($identity == '')
57 {
58 $GLOBALS['APPLICATION']->ThrowException(GetMessage('OPENID_CLIENT_EMPTY_IDENTITY'));
59 return false;
60 }
61
62 if (mb_strlen($identity) > 1024)
63 $identity = mb_substr($identity, 0, 1024); // may be 256 ????
64
65 if (mb_strpos(mb_strtolower($identity), 'http://') === false && mb_strpos(mb_strtolower($identity), 'https://') === false)
66 $identity = 'http://' . $identity;
67
68 $_SESSION['BX_OPENID_IDENTITY'] = $identity;
69
70 if ($arOpenidServerTags = $this->GetOpenIDServerTags($identity))
71 {
72 if (!$this->CheckTrustProviders($arOpenidServerTags['server']))
73 {
74 $GLOBALS['APPLICATION']->ThrowException(GetMessage('OPENID_CLIENT_CHECK_TRUST_PRIVIDERS_FAULT'));
75 return false;
76 }
77
78 $protocol = (CMain::IsHTTPS() ? "https" : "http");
79 $port = ($_SERVER['SERVER_PORT'] > 0 && $_SERVER['SERVER_PORT'] <> 80 && $_SERVER['SERVER_PORT'] <> 443? ':'.$_SERVER['SERVER_PORT']:'');
80 $server_name = $protocol.'://'.$_SERVER['SERVER_NAME'].$port;
81
82 if ($return_to === false)
83 $return_to = $server_name.$GLOBALS['APPLICATION']->GetCurPageParam('', [], false);
84
85 $return_to = preg_replace("|amp%3B|", '', $return_to);
86
87 if ($arOpenidServerTags['delegate'] <> '')
88 $identity = $arOpenidServerTags['delegate'];
89
90 $trust_root = $server_name.'/';
91
92 $url = $arOpenidServerTags['server'] . (mb_strpos($arOpenidServerTags['server'], '?') !== false ? '&' : '?').
93 'openid.mode=checkid_setup'.
94 '&openid.return_to='.urlencode($return_to).
95 '&openid.identity='.urlencode($identity).
96 '&openid.trust_root='.urlencode($trust_root).
97 '&openid.sreg.required=email,fullname'.
98 '&openid.sreg.optional=gender,dob,postcode,country,timezone';
99 $_SESSION['BX_OPENID_RETURN_TO'] = $return_to;
100 return $url;
101 }
102 return false;
103 }
104
105 public function Validate()
106 {
108 {
109 if ($arOpenidServerTags = $this->GetOpenIDServerTags($_GET['openid_identity']))
110 {
112 'openid.assoc_handle' => $_GET['openid_assoc_handle'],
113 'openid.signed' => $_GET['openid_signed'],
114 'openid.sig' => $_GET['openid_sig'],
115 );
116 $arSigned = explode(',', $_GET['openid_signed']);
117 foreach ($arSigned as $s)
118 $arParams['openid.' . $s] = $_GET['openid_' . str_replace('.', '_', $s)];
119
120 $arParams['openid.mode'] = 'check_authentication';
121 if(isset($_SESSION['BX_OPENID_RETURN_TO']))
122 {
123 $arParams['openid.return_to'] = $_SESSION['BX_OPENID_RETURN_TO'];
124 unset($_SESSION['BX_OPENID_RETURN_TO']);
125 }
126
127 $str = CHTTP::sPost($arOpenidServerTags['server'], $arParams, true);
128
129 if (preg_match('/is_valid\s*\:\s*/u', $str))
130 {
131 return array(
132 'server' => $arOpenidServerTags['server'],
133 'identity' => $_GET['openid_identity']
134 );
135 }
136 else
137 {
138 $GLOBALS['APPLICATION']->ThrowException(GetMessage('OPENID_CLIENT_ERROR_AUTH'));
139 }
140 }
141 }
142 // self::CleanParam('ERROR');
143 $GLOBALS['APPLICATION']->ThrowException(GetMessage('OPENID_CLIENT_ERROR_AUTH'));
144 return false;
145 }
146
147 public static function CleanParam($state=false)
148 {
149 $arKillParams = array("check_key");
150 foreach (array_keys($_GET) as $k)
151 if (mb_strpos($k, 'openid_') === 0)
152 $arKillParams[] = $k;
153 if ($state == 'ERROR')
154 $GLOBALS['APPLICATION']->ThrowException(GetMessage('OPENID_CLIENT_ERROR_AUTH'));
155 $redirect_url = $GLOBALS['APPLICATION']->GetCurPageParam(($state == 'ERROR' ? 'auth_service_error=1' : ''), $arKillParams, false);
156 LocalRedirect($redirect_url, true);
157 }
158
159 public function Authorize()
160 {
161 global $APPLICATION, $USER;
162 $errorCode = 1;
163 if ($arOpenID = $this->Validate())
164 {
166 'EXTERNAL_AUTH_ID' => 'OPENID#' . $arOpenID['server'],
167 'XML_ID' => $arOpenID['identity'],
168 'PASSWORD' => randString(30),
169 'LID' => SITE_ID,
170 "PERSONAL_WWW" => $arOpenID['identity'],
171 );
172
173 if (array_key_exists('openid_sreg_email', $_GET))
174 $arFields['EMAIL'] = $_GET['openid_sreg_email'];
175
176 if (array_key_exists('openid_sreg_gender', $_GET) && ($_GET['openid_sreg_gender'] == 'M' || $_GET['openid_sreg_gender'] == 'F'))
177 $arFields['PERSONAL_GENDER'] = $_GET['openid_sreg_gender'];
178
179 if (array_key_exists('openid_sreg_fullname', $_GET))
180 {
181 $fullname = $_GET['openid_sreg_fullname'];
182 $fullname = trim($fullname);
183 if (($pos = mb_strpos($fullname, ' ')) !== false)
184 {
185 $arFields['NAME'] = mb_substr($fullname, 0, $pos);
186 $arFields['LAST_NAME'] = mb_substr($fullname, $pos + 1);
187 }
188 else
189 {
190 $arFields['NAME'] = $fullname;
191 }
192 }
193
194 if (array_key_exists('openid_sreg_postcode', $_GET))
195 $arFields['PERSONAL_ZIP'] = $_GET['openid_sreg_postcode'];
196
197 if (array_key_exists('openid_sreg_timezone', $_GET))
198 $arFields['TIME_ZONE'] = $_GET['openid_sreg_timezone'];
199
200 if (array_key_exists('openid_sreg_country', $_GET))
201 $arFields['PERSONAL_COUNTRY'] = GetCountryIdByCode($_GET['openid_sreg_country']);
202
203 if (array_key_exists('openid_sreg_dob', $_GET))
204 $arFields['PERSONAL_BIRTHDAY'] = CDatabase::FormatDate($_GET['openid_sreg_dob'], "YYYY-MM-DD", FORMAT_DATE);
205
206 if (array_key_exists('BX_OPENID_IDENTITY', $_SESSION))
207 $arFields['LOGIN'] = $_SESSION['BX_OPENID_IDENTITY'];
208 else
209 $arFields['LOGIN'] = $arOpenID['identity'];
210
211 $arFields['LOGIN'] = preg_replace("#^(http://|https://)#i", "", $arFields['LOGIN']);
212
213 $USER_ID = 0;
214
215 if($GLOBALS["USER"]->IsAuthorized() && $GLOBALS["USER"]->GetID())
216 {
218 {
219 $arFields['USER_ID'] = $GLOBALS["USER"]->GetID();
220 \Bitrix\Socialservices\UserTable::add($arFields);
222 }
223 else
224 {
225 $errorCode = SOCSERV_REGISTRATION_DENY;
226 }
227 }
228 else
229 {
230 $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")));
231 $dbUsersNew = $GLOBALS["USER"]->GetList($by, $ord, array('XML_ID'=>$arFields['XML_ID'], 'EXTERNAL_AUTH_ID'=>'socservices', 'ACTIVE'=>'Y'), array('NAV_PARAMS'=>array("nTopCount"=>"1")));
232 $dbSocUser = \Bitrix\Socialservices\UserTable::getList([
233 'filter' => [
234 '=XML_ID'=>$arFields['XML_ID'],
235 '=EXTERNAL_AUTH_ID'=>$arFields['EXTERNAL_AUTH_ID']
236 ],
237 'select' => ["USER_ID", "ACTIVE" => "USER.ACTIVE", "XML_ID"]
238 ]);
239 if($arUser = $dbSocUser->fetch())
240 {
241 if($arUser["ACTIVE"] === 'Y')
242 $USER_ID = $arUser["USER_ID"];
243 }
244 elseif ($arUser = $dbUsersOld->Fetch())
245 {
246 $USER_ID = $arUser['ID'];
247 }
248 elseif($arUser = $dbUsersNew->Fetch())
249 {
250 $USER_ID = $arUser["ID"];
251 }
252 elseif(COption::GetOptionString("main", "new_user_registration", "N") == "Y")
253 {
254 $def_group = COption::GetOptionString('main', 'new_user_registration_def_group', '');
255 if($def_group != '')
256 $arFields['GROUP_ID'] = explode(',', $def_group);
257
258 if(!empty($arFields['GROUP_ID']) && CSocServAuth::isAuthDenied($arFields['GROUP_ID']))
259 {
260 $errorCode = SOCSERV_REGISTRATION_DENY;
261 }
262 else
263 {
264 foreach(GetModuleEvents("main", "OnBeforeOpenIDUserAdd", true) as $arEvent)
266
267 $arFieldsUser = $arFields;
268 $arFieldsUser["EXTERNAL_AUTH_ID"] = "socservices";
269 if(!($USER_ID = $GLOBALS["USER"]->Add($arFieldsUser)))
270 return false;
271 $arFields['CAN_DELETE'] = 'N';
272 $arFields['USER_ID'] = $USER_ID;
273 \Bitrix\Socialservices\UserTable::add($arFields);
274 unset($arFields['CAN_DELETE']);
275 }
276 }
277 elseif(COption::GetOptionString("main", "new_user_registration", "N") == "N")
278 $errorCode = 2;
279
280 if (intval($USER_ID) > 0)
281 {
282 if($arUser && $arUser["XML_ID"] !== $arFields['XML_ID'])
283 {
284 $USER_ID = 0;
285 }
286 }
287
288 if (intval($USER_ID) > 0)
289 {
290 $arGroups = $USER->GetUserGroup($USER_ID);
292 {
293 $errorCode = SOCSERV_AUTHORISATION_ERROR;
294 }
295 else
296 {
297 $USER->AuthorizeWithOtp($USER_ID);
298
299 $arKillParams = array("auth_service_id", "check_key");
300 foreach (array_keys($_GET) as $k)
301 if (mb_strpos($k, 'openid_') === 0)
302 $arKillParams[] = $k;
303
304 $redirect_url = $APPLICATION->GetCurPageParam('', $arKillParams, false);
305
306 foreach(GetModuleEvents("main", "OnBeforeOpenIDAuthFinalRedirect", true) as $arEvent)
307 ExecuteModuleEventEx($arEvent, array($redirect_url, $USER_ID, $arFields));
308
309 if ($redirect_url)
310 LocalRedirect($redirect_url, true);
311
312 return $USER_ID;
313 }
314 }
315 }
316 }
317 $arKillParams = array("check_key");
318 foreach (array_keys($_GET) as $k)
319 if (mb_strpos($k, 'openid') === 0)
320 $arKillParams[] = $k;
321 $redirect_url = $APPLICATION->GetCurPageParam('auth_service_error='.$errorCode, $arKillParams, false);
322 LocalRedirect($redirect_url, true);
323 return false;
324 }
325
326 public static function GetOpenIDAuthStep($request_var='OPENID_IDENTITY')
327 {
328 if (array_key_exists('openid_mode', $_GET) && $_GET['openid_mode'] == 'id_res')
329 return 2;
330 elseif ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists($request_var, $_REQUEST) && mb_strlen($_REQUEST[$request_var]))
331 return 1;
332 return 0;
333 }
334}
$arParams
Определения access_dialog.php:21
global $APPLICATION
Определения include.php:80
static sGet($url, $follow_redirect=false)
Определения http.php:409
static sPost($url, $arPostData, $follow_redirect=false)
Определения http.php:419
static ParseURL($url)
Определения http.php:320
Определения openidclient.php:6
Validate()
Определения openidclient.php:105
CheckTrustProviders($url)
Определения openidclient.php:15
Authorize()
Определения openidclient.php:159
GetRedirectUrl($identity, $return_to=false)
Определения openidclient.php:54
$_trust_providers
Определения openidclient.php:7
GetOpenIDServerTags($url)
Определения openidclient.php:28
static GetOpenIDAuthStep($request_var='OPENID_IDENTITY')
Определения openidclient.php:326
SetTrustProviders($t)
Определения openidclient.php:9
static CleanParam($state=false)
Определения openidclient.php:147
static isSplitDenied($arGroups=null)
Определения authmanager.php:1375
static isAuthDenied($arGroups)
Определения authmanager.php:1390
static CheckUniqueKey($bUnset=true)
Определения authmanager.php:351
$str
Определения commerceml2.php:63
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$arGroups
Определения options.php:1766
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
$p
Определения group_list_element_edit.php:23
$protocol
Определения .description.php:9
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $USER
Определения csv_new_run.php:40
const FORMAT_DATE
Определения include.php:63
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetCountryIdByCode($code)
Определения tools.php:4175
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
randString($pass_len=10, $pass_chars=false)
Определения tools.php:2154
LocalRedirect($url, $skip_security_check=false, $status="302 Found")
Определения tools.php:4005
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
const SOCSERV_REGISTRATION_DENY
Определения include.php:4
const SOCSERV_AUTHORISATION_ERROR
Определения include.php:3
const SITE_ID
Определения sonet_set_content_view.php:12
$k
Определения template_pdf.php:567
$GLOBALS['_____370096793']
Определения update_client.php:1
$url
Определения iframe.php:7