Beispiel #1
0
 function SetUser($arLdapUser, $bAddNew = true)
 {
     global $USER;
     $isHead = false;
     $bUSERGen = false;
     if (!is_object($USER)) {
         $USER = new CUser();
         $bUSERGen = true;
     }
     // process previously saved department data
     if (IsModuleInstalled('intranet') && is_array($arLdapUser['UF_DEPARTMENT'])) {
         $isHead = $arLdapUser['UF_DEPARTMENT']['IS_HEAD'];
         // replace temporary value with a real one
         $arLdapUser['UF_DEPARTMENT'] = array($arLdapUser['UF_DEPARTMENT']['ID']);
     }
     if (isset($arLdapUser["ID"])) {
         $ID = intval($arLdapUser["ID"]);
         self::PrepareUserPhoto($ID, $arLdapUser);
         $USER->Update($ID, $arLdapUser);
     } else {
         $ldapUserID = 0;
         if (isset($_REQUEST["ldap_user_id"]) && strlen($_REQUEST["ldap_user_id"]) == 32) {
             $dbUser = CUser::GetList($O = "", $B = "", array("XML_ID" => $_REQUEST["ldap_user_id"], 'EXTERNAL_AUTH_ID' => $arLdapUser['EXTERNAL_AUTH_ID']));
             if ($arUser = $dbUser->Fetch()) {
                 if ($arUser["XML_ID"]) {
                     $ldapUserID = $arUser["ID"];
                 }
             }
         }
         $res = CUser::GetList($O = "", $B = "", array('LOGIN_EQUAL_EXACT' => $arLdapUser['LOGIN'], 'EXTERNAL_AUTH_ID' => $arLdapUser['EXTERNAL_AUTH_ID']));
         $arLdapUser['PASSWORD'] = uniqid(rand(), true);
         if (!($ar_res = $res->Fetch()) && $ldapUserID < 1) {
             if ($bAddNew) {
                 if (strlen($arLdapUser["EMAIL"]) <= 0) {
                     $arLdapUser["EMAIL"] = COption::GetOptionString("ldap", "default_email", 'no@email');
                 }
                 $ID = $USER->Add($arLdapUser);
             } else {
                 $ID = 0;
             }
         } else {
             $ID = $ldapUserID > 1 ? $ldapUserID : $ar_res['ID'];
             self::PrepareUserPhoto($ID, $arLdapUser);
             $USER->Update($ID, $arLdapUser);
         }
         $ID = intval($ID);
     }
     // - add this user to groups
     if ($ID > 0) {
         // - set as head of department
         if (IsModuleInstalled('intranet') && $isHead) {
             CLdapUtil::SetDepartmentHead($ID, $arLdapUser['UF_DEPARTMENT'][0]);
         }
         // For each group finding all superior ones
         $arUserLdapGroups = array();
         $arLdapGroups = $this->GetGroupListArray();
         $this->GetAllMemberOf($arLdapUser['LDAP_GROUPS'], $arUserLdapGroups, $arLdapGroups);
         $arGroupMaps = $this->GetGroupMaps();
         $arUserBitrixGroups = $USER->GetUserGroup($ID);
         $arUserBitrixGroupsNew = array();
         $prevGroups = $arUserBitrixGroups;
         sort($prevGroups);
         foreach ($arGroupMaps as $fromLdapGroup => $arToUserGroups) {
             foreach ($arToUserGroups as $toUserGroup) {
                 if (($k = array_search($toUserGroup, $arUserBitrixGroups)) !== false) {
                     unset($arUserBitrixGroups[$k]);
                 }
                 // If there is such a group among user's
                 if (in_array($fromLdapGroup, $arUserLdapGroups)) {
                     $arUserBitrixGroupsNew[] = $toUserGroup;
                 }
             }
         }
         $arUserBitrixGroups = array_merge($arUserBitrixGroups, array_unique($arUserBitrixGroupsNew));
         sort($arUserBitrixGroups);
         if ($arUserBitrixGroups != $prevGroups) {
             $USER->SetUserGroup($ID, $arUserBitrixGroups);
         }
     }
     if ($bUSERGen) {
         unset($USER);
     }
     return $ID;
 }