1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
ldap_util.php
См. документацию.
1<?php
2
4
6{
7 public static function GetSynFields()
8 {
9 static $arSyncFields = false;
10 if(!is_array($arSyncFields))
11 {
12 // "Field in CUser"=>Array("NAME" => "Name in Bitrix CMS", "AD"=>"Default attribute in AD", "LDAP"=>"Default Attribute in LDAP")
13 $arSyncFields = Array(
14 "ACTIVE" =>Array("NAME" => GetMessage("LDAP_FIELD_ACTIVE"), "AD"=>"UserAccountControl&2"),
15 "EMAIL" =>Array("NAME" => GetMessage("LDAP_FIELD_EMAIIL"), "AD"=>"mail", "LDAP"=>"email"),
16 "NAME" =>Array("NAME" => GetMessage("LDAP_FIELD_NAME"), "AD"=>"givenName", "LDAP"=>"cn"),
17 "LAST_NAME" =>Array("NAME" => GetMessage("LDAP_FIELD_LAST_NAME"), "AD"=>"sn", "LDAP"=>"sn"),
18 "SECOND_NAME" =>Array("NAME" => GetMessage("LDAP_FIELD_SECOND_NAME")),
19 "PERSONAL_GENDER" =>Array("NAME" => GetMessage("LDAP_FIELD_GENDER")),
20 "PERSONAL_BIRTHDAY" =>Array("NAME" => GetMessage("LDAP_FIELD_BIRTHDAY")),
21 "PERSONAL_PROFESSION" =>Array("NAME" => GetMessage("LDAP_FIELD_PROF")),
22 "PERSONAL_PHOTO" =>Array("NAME" => GetMessage("LDAP_FIELD_PHOTO"), "AD"=>"thumbnailPhoto", "LDAP"=>"jpegPhoto"),
23 "PERSONAL_WWW" =>Array("NAME" => GetMessage("LDAP_FIELD_WWW"), "AD"=>"wWWHomePage"),
24 "PERSONAL_ICQ" =>Array("NAME" => "ICQ"),
25 "PERSONAL_PHONE" =>Array("NAME" => GetMessage("LDAP_FIELD_PHONE"), "AD"=>"homePhone"),
26 "PERSONAL_FAX" =>Array("NAME" => GetMessage("LDAP_FIELD_FAX")),
27 "PERSONAL_MOBILE" =>Array("NAME" => GetMessage("LDAP_FIELD_MOB"), "AD"=>"mobile"),
28 "PERSONAL_PAGER" =>Array("NAME" => GetMessage("LDAP_FIELD_PAGER")),
29 "PERSONAL_STREET" =>Array("NAME" => GetMessage("LDAP_FIELD_STREET"), "AD"=>"streetAddress"),
30 "PERSONAL_MAILBOX" =>Array("NAME" => GetMessage("LDAP_FIELD_MAILBOX"), "AD"=>"postOfficeBox"),
31 "PERSONAL_CITY" =>Array("NAME" => GetMessage("LDAP_FIELD_CITY"), "AD"=>"l"),
32 "PERSONAL_STATE" =>Array("NAME" => GetMessage("LDAP_FIELD_STATE"), "AD"=>"st"),
33 "PERSONAL_ZIP" =>Array("NAME" => GetMessage("LDAP_FIELD_ZIP"), "AD"=>"postalCode"),
34 "PERSONAL_COUNTRY" =>Array("NAME" => GetMessage("LDAP_FIELD_COUNTRY"), "AD"=>"c"),
35 //"PERSONAL_NOTES" =>Array("NAME" => "Personal notes"),
36 "WORK_COMPANY" =>Array("NAME" => GetMessage("LDAP_FIELD_COMPANY"), "AD"=>"company"),
37 "WORK_DEPARTMENT" =>Array("NAME" => GetMessage("LDAP_FIELD_DEP"), "AD"=>"department"),
38 "WORK_POSITION" =>Array("NAME" => GetMessage("LDAP_FIELD_POS"), "AD"=>"title"),
39 //"WORK_WWW" =>Array("NAME" => "Company web page"),
40 "WORK_PHONE" =>Array("NAME" => GetMessage("LDAP_FIELD_WORK_PHONE"), "AD"=>"telephoneNumber"),
41 "WORK_FAX" =>Array("NAME" => GetMessage("LDAP_FIELD_WORK_FAX"), "AD"=>"facsimileTelephoneNumber"),
42 "WORK_PAGER" =>Array("NAME" => GetMessage("LDAP_FIELD_WORK_PAGER")),
43 //"WORK_STREET" =>Array("NAME" => "Work address"),
44 //"WORK_MAILBOX" =>Array("NAME" => ""),
45 //"WORK_CITY" =>Array("NAME" => ""),
46 //"WORK_STATE" =>Array("NAME" => ""),
47 //"WORK_ZIP" =>Array("NAME" => ""),
48 //"WORK_COUNTRY" =>Array("NAME" => ""),
49 //"WORK_PROFILE" =>Array("NAME" => ""),
50 //"WORK_NOTES" =>Array("NAME" => "Additional notes"),
51 "ADMIN_NOTES" =>Array("NAME" => GetMessage("LDAP_FIELD_ADMIN_NOTES"), "AD"=>"description"),
52 );
53
54 $arRes = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("USER", 0, LANGUAGE_ID);
55 foreach($arRes as $pr_id=>$pr_v)
56 if($pr_v["EDIT_FORM_LABEL"]!='')
57 $arSyncFields[$pr_id] = Array("NAME"=>$pr_v["EDIT_FORM_LABEL"]);
58 }
59
60 return $arSyncFields;
61 }
62
63 public static function MkOperationFilter($key)
64 {
65 if(mb_substr($key, 0, 1) == "!")
66 {
67 $key = mb_substr($key, 1);
68 $cOperationType = "N";
69 }
70 elseif(mb_substr($key, 0, 1) == "?")
71 {
72 $key = mb_substr($key, 1);
73 $cOperationType = "?";
74 }
75 elseif(mb_substr($key, 0, 2) == ">=")
76 {
77 $key = mb_substr($key, 2);
78 $cOperationType = "GE";
79 }
80 elseif(mb_substr($key, 0, 1) == ">")
81 {
82 $key = mb_substr($key, 1);
83 $cOperationType = "G";
84 }
85 elseif(mb_substr($key, 0, 2) == "<=")
86 {
87 $key = mb_substr($key, 2);
88 $cOperationType = "LE";
89 }
90 elseif(mb_substr($key, 0, 1) == "<")
91 {
92 $key = mb_substr($key, 1);
93 $cOperationType = "L";
94 }
95 else
96 $cOperationType = "E";
97
98 return Array("FIELD"=>$key, "OPERATION"=>$cOperationType);
99 }
100
101 public static function FilterCreate($fname, $vals, $type, $cOperationType=false, $bSkipEmpty = true)
102 {
103 return CLdapUtil::FilterCreateEx($fname, $vals, $type, $bFullJoin, $cOperationType, $bSkipEmpty);
104 }
105
106 public static function FilterCreateEx($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty = true)
107 {
108 global $DB;
109 if(!is_array($vals))
110 $vals=Array($vals);
111
112 if(count($vals)<1)
113 return "";
114 if(is_bool($cOperationType))
115 {
116 if($cOperationType===true)
117 $cOperationType = "N";
118 else
119 $cOperationType = "E";
120 }
121
122 if($cOperationType=="G")
123 $strOperation = ">";
124 elseif($cOperationType=="GE")
125 $strOperation = ">=";
126 elseif($cOperationType=="LE")
127 $strOperation = "<=";
128 elseif($cOperationType=="L")
129 $strOperation = "<";
130 else
131 $strOperation = "=";
132
133 $bFullJoin = false;
134 $bWasLeftJoin = false;
135
136 $res = Array();
137 for($i=0, $c=count($vals); $i < $c; $i++)
138 {
139 $val = $vals[$i];
140 if(!$bSkipEmpty || $val <> '' || (is_bool($val) && $val===false))
141 {
142 switch ($type)
143 {
144 case "string_equal":
145 if($cOperationType=="?")
146 {
147 if($val <> '')
148 $res[] = GetFilterQuery($fname, $val, "N");
149 }
150 else
151 {
152 if($val == '')
153 $res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
154 else
155 $res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".CLdapUtil::_Upper($fname).$strOperation.CLdapUtil::_Upper("'".$DB->ForSql($val)."'").")";
156 }
157 break;
158 case "string":
159 if($cOperationType=="?")
160 {
161 if($val <> '')
162 {
163 $sr = GetFilterQuery($fname, $val, "Y", array(), "N");
164 if($sr != "0")
165 $res[] = $sr;
166 }
167 }
168 else
169 {
170 if($val == '')
171 $res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
172 else
173 if($strOperation=="=")
174 $res[] = ($cOperationType == "N" ? " " . $fname . " IS NULL OR NOT " : "") . "(" . $fname . " LIKE '" . $DB->ForSqlLike($val) . "')";
175 else
176 $res[] = ($cOperationType == "N" ? " " . $fname . " IS NULL OR NOT " : "") . "(" . $fname . " " . $strOperation . " '" . $DB->ForSql($val) . "')";
177 }
178 break;
179 case "date":
180 if($val == '')
181 $res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
182 else
183 $res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
184 break;
185 case "number":
186 if($cOperationType=="?")
187 {
188 $sqlHelper = \Bitrix\Main\Application::getConnection()->getSqlHelper();
189
190 $res[] = "(" . $sqlHelper->castToChar($fname) . " LIKE '%" . $DB->ForSqlLike(trim($val)) . "%' AND " . $fname . " IS NOT NULL)";
191 }
192 else
193 {
194 if($val == '')
195 $res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
196 else
197 $res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".DoubleVal($val)."')";
198 }
199 break;
200 case "number_above":
201 if($val == '')
202 $res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
203 else
204 $res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".$DB->ForSql($val)."')";
205 break;
206 }
207
208 // we need this conditions to do INNER JOIN
209 if($val <> '' && $cOperationType!="N")
210 $bFullJoin = true;
211 else
212 $bWasLeftJoin = true;
213 }
214 }
215
216 $strResult = "";
217 for($i=0, $c=count($res); $i < $c; $i++)
218 {
219 if($i>0)
220 $strResult .= ($cOperationType=="N"?" AND ":" OR ");
221 $strResult .= "(".$res[$i].")";
222 }
223 if($strResult!="")
224 $strResult = "(".$strResult.")";
225
226 if($bFullJoin && $bWasLeftJoin && $cOperationType!="N")
227 $bFullJoin = false;
228
229 return $strResult;
230 }
231
232 public static function _Upper($str)
233 {
234 global $DB;
235 return ($DB->type === 'PGSQL' ? 'UPPER(' . $str . ')' : $str);
236 }
237
238 // gets department list from system (iblock) for displaying in select box
239 public static function getDepartmentListFromSystem($arFilter = Array())
240 {
241 if (!IsModuleInstalled('intranet'))
242 {
243 return false;
244 }
245
246 $l=false;
247 if (CModule::IncludeModule('iblock'))
248 {
249 $iblockId=COption::GetOptionInt("intranet","iblock_structure",false,false);
250 if ($iblockId)
251 {
252 $arFilter["IBLOCK_ID"] = $iblockId;
253 $arFilter["CHECK_PERMISSIONS"]="N";
254 $l = CIBlockSection::GetTreeList($arFilter);
255 }
256 }
257 return $l;
258 }
259
260 public static function SetDepartmentHead($userId, $sectionId)
261 {
262 //echo "Setting ".$userId." as head of ".$sectionId;
263
264 $iblockId=COption::GetOptionInt("intranet","iblock_structure",false,false);
265
266 if ($iblockId && $sectionId && $userId && CModule::IncludeModule('iblock'))
267 {
268 /*$perm = CIBlock::GetPermission($iblockId);
269 if ($perm >= 'W')
270 {*/
271 $obS = new CIBlockSection();
272 if ($obS->Update($sectionId, array('UF_HEAD' => $userId), false, false))
273 {
274 return true;
275 }
276 else //if ($obS->LAST_ERROR)
277 {
278 // update error
279 return false;
280 }
281 /*}
282 else
283 {
284 // access denied
285 return false;
286 }*/
287 }
288 else
289 {
290 // bad data
291 return false;
292 }
293 }
294
295 public static function OnAfterUserAuthorizeHandler()
296 {
297 if(defined("LDAP_NO_PORT_REDIRECTION"))
298 return false;
299
300 global $USER;
301
302 if($USER->IsAuthorized())
303 {
304 $authNet = COption::GetOptionString("ldap", 'bitrixvm_auth_net', '');
305
306 if (trim($authNet))
307 if(self::IsIpFromNet($_SERVER['REMOTE_ADDR'],$authNet)===false)
308 return false;
309
310 $backUrl = isset($_GET['back_url']) ? $_GET['back_url'] : "/";
311
312 if ($_SERVER['SERVER_PORT'] == '8890')
313 LocalRedirect('http://'.$_SERVER["SERVER_NAME"].$backUrl);
314 if ($_SERVER['SERVER_PORT'] == '8891')
315 LocalRedirect('https://'.$_SERVER["SERVER_NAME"].$backUrl);
316 }
317
318 return true;
319 }
320
321 public static function OnEpilogHandler()
322 {
324 }
325
326 public static function bitrixVMAuthorize()
327 {
328 if(defined("LDAP_NO_PORT_REDIRECTION"))
329 return false;
330
331 global $USER, $APPLICATION;
332
333 if(!$USER->IsAuthorized())
334 {
335 $authNet = COption::GetOptionString("ldap", 'bitrixvm_auth_net', '');
336
337 if (trim($authNet))
338 if(self::IsIpFromNet($_SERVER['REMOTE_ADDR'],$authNet)===false)
339 return false;
340
341 $backUrl= mb_strlen($APPLICATION->GetCurPage()) > 1 ? "?back_url=".rawurlencode($APPLICATION->GetCurUri()) : "";
342
343 if ($_SERVER['SERVER_PORT'] == '80')
344 LocalRedirect('http://'.$_SERVER["SERVER_NAME"].':8890/'.$backUrl, true);
345 elseif (($_SERVER['SERVER_PORT'] == '443'))
346 LocalRedirect('https://'.$_SERVER["SERVER_NAME"].':8891/'.$backUrl, true);
347 }
348
349 return true;
350 }
351
352 public static function isBitrixVMAuthSupported()
353 {
355 $hndl = $eventManager->findEventHandlers("main", "OnEpilog", array("ldap"));
356 return !empty($hndl);
357 }
358
359 public static function SetBitrixVMAuthSupport($setOption=false, $netAndMask=false)
360 {
361 RegisterModuleDependences("main", "OnAfterUserAuthorize", 'ldap', 'CLdapUtil', 'OnAfterUserAuthorizeHandler');
362 RegisterModuleDependences("main", "OnEpilog", 'ldap', 'CLdapUtil', 'OnEpilogHandler');
363
364 if($setOption)
365 COption::SetOptionString("ldap", "bitrixvm_auth_support", "Y");
366
367 if($netAndMask)
368 COption::SetOptionString("ldap", "bitrixvm_auth_net", $netAndMask);
369 }
370
371 public static function UnSetBitrixVMAuthSupport($unSetOption=false)
372 {
373 UnRegisterModuleDependences("main", "OnAfterUserAuthorize", 'ldap', 'CLdapUtil', 'OnAfterUserAuthorizeHandler');
374 UnRegisterModuleDependences("main", "OnEpilog", 'ldap', 'CLdapUtil', 'OnEpilogHandler');
375
376 if($unSetOption)
377 COption::SetOptionString("ldap", "bitrixvm_auth_support", "N");
378 }
379
386 public static function IsIpFromNet($ip, $netsAndMasks)
387 {
388 if((string)$ip === "")
389 {
390 return false;
391 }
392
393 if((string)$netsAndMasks === "")
394 {
395 return false;
396 }
397
398 $arNetsMasks = explode(";", $netsAndMasks);
399
400 foreach ($arNetsMasks as $netAndMask)
401 {
402 $netAndMask = trim($netAndMask);
403
404 if(!$netAndMask)
405 continue;
406
407 if((!preg_match("#^(\d{1,3}\.){3,3}(\d{1,3})/(\d{1,3}\.){3,3}(\d{1,3})$#",$netAndMask) && !preg_match("#^(\d{1,3}\.){3,3}(\d{1,3})/(\d{1,3})$#",$netAndMask)) || !preg_match("#^(\d{1,3}\.){3,3}(\d{1,3})$#",$ip))
408 continue;
409
410 $arNetAndMask = explode("/", $netAndMask);
411
412 $net = $arNetAndMask[0];
413
414 if(mb_strpos($arNetAndMask[1], ".") !== false) //xxx.xxx.xxx.xxx/xxx.xxx.xxx.xxx
415 $mask = $arNetAndMask[1];
416 else //xxx.xxx.xxx.xxx/xx -> xxx.xxx.xxx.xxx/xxx.xxx.xxx.xxx
417 $mask=long2ip('11111111111111111111111111111111'<<(32-$arNetAndMask[1]));
418
419 $newNet = long2ip(ip2long($ip) & ip2long($mask));
420
421 if($newNet == $net)
422 return true;
423 else
424 continue;
425 }
426
427 return false;
428 }
429
435 public static function GetImgTypeBySignature($signature)
436 {
437 if($signature == "")
438 return false;
439
440 $signature = mb_substr($signature, 0, 12);
441
442 $arSigs = array(
443 "GIF" => "gif",
444 "\xff\xd8\xff" => "jpg",
445 "\x89\x50\x4e" => "png",
446 "FWS" => "swf",
447 "CWS" => "swc",
448 "8BPS" => "psd",
449 "BM" => "bmp",
450 "\xff\x4f\xff" => "jpc",
451 "II\x2a\x00" => "tif",
452 "MM\x00\x2a" => "tif",
453 "FORM" => "iff",
454 "\x00\x00\x01\x00" => "ico",
455 "\x0d\x0a\x87\x0a" => "jp2"
456 );
457
458 foreach ($arSigs as $sig => $type)
459 if(preg_match("/^".$sig."/x", $signature))
460 return $type;
461
462 return false;
463 }
464
465 public static function isLdapPaginationAviable(): bool
466 {
467 return true;
468 }
469
475 public static function isNtlmRedirectNetRangeDefined()
476 {
477 $authNet = COption::GetOptionString("ldap", 'bitrixvm_auth_net', '');
478 return trim($authNet) <> '';
479 }
480
485 public static function getTargetPort($serverPort = false)
486 {
487 if($serverPort === false)
488 $serverPort = $_SERVER["SERVER_PORT"];
489
490 $result = false;
491
492 $vmAuth = COption::GetOptionString("ldap", "bitrixvm_auth_support","N") == "Y";
493 $useNtlm = COption::GetOptionString("ldap", "use_ntlm","N") == "Y";
494 $isNtlmOn = $vmAuth && $useNtlm;
495
496 if($serverPort == "80")
497 $result = $isNtlmOn ? "8890" : "80";
498 elseif($serverPort == "443")
499 $result = $isNtlmOn ? "8891" : "443";
500
501 return $result;
502 }
503}
$type
Определения options.php:106
global $APPLICATION
Определения include.php:80
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getConnection($name="")
Определения application.php:638
static getInstance()
Определения eventmanager.php:31
Определения ldap_util.php:6
static getTargetPort($serverPort=false)
Определения ldap_util.php:485
static isNtlmRedirectNetRangeDefined()
Определения ldap_util.php:475
static OnEpilogHandler()
Определения ldap_util.php:321
static isBitrixVMAuthSupported()
Определения ldap_util.php:352
static _Upper($str)
Определения ldap_util.php:232
static MkOperationFilter($key)
Определения ldap_util.php:63
static IsIpFromNet($ip, $netsAndMasks)
Определения ldap_util.php:386
static SetDepartmentHead($userId, $sectionId)
Определения ldap_util.php:260
static FilterCreateEx($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
Определения ldap_util.php:106
static UnSetBitrixVMAuthSupport($unSetOption=false)
Определения ldap_util.php:371
static SetBitrixVMAuthSupport($setOption=false, $netAndMask=false)
Определения ldap_util.php:359
static FilterCreate($fname, $vals, $type, $cOperationType=false, $bSkipEmpty=true)
Определения ldap_util.php:101
static isLdapPaginationAviable()
Определения ldap_util.php:465
static OnAfterUserAuthorizeHandler()
Определения ldap_util.php:295
static GetSynFields()
Определения ldap_util.php:7
static bitrixVMAuthorize()
Определения ldap_util.php:326
static GetImgTypeBySignature($signature)
Определения ldap_util.php:435
static getDepartmentListFromSystem($arFilter=Array())
Определения ldap_util.php:239
$str
Определения commerceml2.php:63
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
GetFilterQuery($field, $val, $procent="Y", $ex_sep=array(), $clob="N", $div_fields="Y", $clob_upper="N")
Определения filter_tools.php:383
$result
Определения get_property_values.php:14
if($request->getPost('Update') !==null) elseif( $request->getPost( 'Apply') !==null) elseif($request->getPost('RestoreDefaults') !==null) $backUrl
Определения options.php:66
$iblockId
Определения iblock_catalog_edit.php:30
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$l
Определения options.php:783
IsModuleInstalled($module_id)
Определения tools.php:5301
RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $SORT=100, $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5295
UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $TO_PATH="", $TO_METHOD_ARG=[])
Определения tools.php:5289
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
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
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</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
$val
Определения options.php:1793
$eventManager
Определения include.php:412
$arRes
Определения options.php:104
$GLOBALS['_____370096793']
Определения update_client.php:1
$arFilter
Определения user_search.php:106