Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/intranet/classes/general/ |
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/intranet/classes/general/invite_dialog.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage intranet * @copyright 2001-2014 Bitrix */ use Bitrix\Main\Event; use Bitrix\Main\Loader; use Bitrix\Main\ModuleManager; use Bitrix\Socialnetwork; use Bitrix\Main\UserTable; use Bitrix\Intranet\Invitation; IncludeModuleLangFile(__FILE__); class CIntranetInviteDialog { public static $bSendPassword = false; public static function ShowInviteDialogLink($arParams = array()) { CJSCore::Init(array('popup')); if (Loader::includeModule("bitrix24") && !CBitrix24::isMoreUserAvailable()) { CBitrix24::initLicenseInfoPopupJS(); } $arParams["MESS"] = array( "BX24_INVITE_TITLE_INVITE" => GetMessage("BX24_INVITE_TITLE_INVITE"), "BX24_INVITE_TITLE_ADD" => GetMessage("BX24_INVITE_TITLE_ADD"), "BX24_INVITE_BUTTON" => GetMessage("BX24_INVITE_BUTTON"), "BX24_CLOSE_BUTTON" => GetMessage("BX24_CLOSE_BUTTON"), "BX24_LOADING" => GetMessage("BX24_LOADING"), ); return "B24.Bitrix24InviteDialog.ShowForm(".CUtil::PhpToJSObject($arParams).")"; } public static function setSendPassword($value) { self::$bSendPassword = $value; } public static function getSendPassword() { return self::$bSendPassword; } public static function AddNewUser($SITE_ID, $arFields, &$strError) { global $APPLICATION, $USER; $ID_ADDED = 0; $bitrix24Installed = ModuleManager::isModuleInstalled('bitrix24'); $iDepartmentId = intval($arFields["DEPARTMENT_ID"]); $siteIdByDepartmentId = self::getUserSiteId(array( "UF_DEPARTMENT" => $iDepartmentId, "SITE_ID" => $SITE_ID )); $bExtranet = ($iDepartmentId <= 0); $arGroups = self::getUserGroups($siteIdByDepartmentId, $bExtranet); $strEmail = trim($arFields["ADD_EMAIL"]); $strName = trim($arFields["ADD_NAME"]); $strLastName = trim($arFields["ADD_LAST_NAME"]); $strPosition = trim($arFields["ADD_POSITION"]); if ($strEmail <> '') { $filter = array( "=EMAIL"=> $strEmail ); if (Loader::includeModule('socialnetwork')) { $externalAuthIdList = Socialnetwork\ComponentHelper::checkPredefinedAuthIdList(array('bot', 'imconnector', 'replica', 'sale', 'saleanonymous')); if (!empty($externalAuthIdList)) { $filter['!@EXTERNAL_AUTH_ID'] = $externalAuthIdList; } } $rsUser = UserTable::getList(array( 'filter' => $filter, 'select' => array("ID", "EXTERNAL_AUTH_ID", "UF_DEPARTMENT") )); if ($arUser = $rsUser->Fetch()) { if ($arUser["EXTERNAL_AUTH_ID"] == 'email' || $arUser["EXTERNAL_AUTH_ID"] == 'shop') { if ($arUser["EXTERNAL_AUTH_ID"] == 'shop' && Loader::includeModule("crm")) { $arGroups[] = \Bitrix\Crm\Order\BuyerGroup::getSystemGroupId(); } $ID_TRANSFERRED = self::TransferEmailUser($arUser["ID"], array( "GROUP_ID" => $arGroups, "UF_DEPARTMENT" => $iDepartmentId, "SITE_ID" => $siteIdByDepartmentId, "NAME" => $strName, "LAST_NAME" => $strLastName, "POSITION" => $strPosition )); if (!$ID_TRANSFERRED) { if($e = $APPLICATION->GetException()) { $strError = $e->GetString(); } return false; } else { return $ID_TRANSFERRED; } } elseif ( $bitrix24Installed && !ModuleManager::isModuleInstalled('extranet') && $arUser["EXTERNAL_AUTH_ID"] == 'socservices' && $iDepartmentId > 0 && ( !isset($arUser["UF_DEPARTMENT"]) || ( is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"][0]) <= 0 ) || ( !is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"]) <= 0 ) ) // past-extranet to intranet ) { $ID_TRANSFERRED = self::TransferExtranetUser($arUser["ID"], array( "GROUP_ID" => $arGroups, "UF_DEPARTMENT" => $iDepartmentId, "SITE_ID" => $siteIdByDepartmentId )); if (!$ID_TRANSFERRED) { if($e = $APPLICATION->GetException()) { $strError = $e->GetString(); } return false; } else { return $ID_TRANSFERRED; } } else { $strError = GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", array( '#EMAIL#' => $strEmail )); } } } if ($strEmail == '') { if ( !isset($arFields["ADD_MAILBOX_ACTION"]) || !in_array($arFields["ADD_MAILBOX_ACTION"], array("create", "connect")) || $arFields['ADD_MAILBOX_USER'] == '' || $arFields['ADD_MAILBOX_DOMAIN'] == '' ) { $strError = GetMessage("BX24_INVITE_DIALOG_ERROR_EMPTY_EMAIL"); } else { // email from mailbox $strEmail = $arFields['ADD_MAILBOX_USER']."@".$arFields['ADD_MAILBOX_DOMAIN']; } } if (!$strError) { $strPassword = self::GeneratePassword($siteIdByDepartmentId, $bExtranet); self::setSendPassword($arFields["ADD_SEND_PASSWORD"] == "Y"); $arUser = array( "LOGIN" => $strEmail, "NAME" => $strName, "LAST_NAME" => $strLastName, "EMAIL" => $strEmail, "PASSWORD" => $strPassword, "GROUP_ID" => $arGroups, "WORK_POSITION" => $strPosition, "LID" => $siteIdByDepartmentId, "UF_DEPARTMENT" => ($iDepartmentId > 0 ? array($iDepartmentId) : array()) ); if (!self::getSendPassword()) { $arUser["CONFIRM_CODE"] = randString(8); } else { $arUser["B24NETWORK_CHECKWORD"] = randString(16); } $obUser = new CUser; $ID_ADDED = $obUser->Add($arUser); if (!$ID_ADDED) { if($e = $APPLICATION->GetException()) { $strError = $e->GetString(); } else { $strError = $obUser->LAST_ERROR; } } else { $userFields = $arUser; $userFields['ID'] = $ID_ADDED; foreach(GetModuleEvents("intranet", "OnRegisterUser", true) as $arEvent) { ExecuteModuleEventEx($arEvent, [ $userFields ]); } if (self::getSendPassword()) { $db_events = GetModuleEvents("main", "OnUserInitialize", true); foreach($db_events as $arEvent) { ExecuteModuleEventEx($arEvent, array($ID_ADDED, $arUser)); } $event = new Event( 'intranet', 'onUserAdded', [ 'originatorId' => $USER->getId(), 'userId' => [ $ID_ADDED ], 'type' => Invitation::TYPE_EMAIL ] ); $event->send(); } else { Invitation::add([ 'USER_ID' => $ID_ADDED, 'TYPE' => Invitation::TYPE_EMAIL ]); } if ( $bExtranet && !IsModuleInstalled("extranet") && !$bitrix24Installed ) { $bExtranet = false; } $messageText = self::getInviteMessageText(); $event = new CEvent; if (self::getSendPassword()) { $rsSites = CSite::GetByID($siteIdByDepartmentId); $arSite = $rsSites->Fetch(); $serverName = ( $arSite["SERVER_NAME"] <> '' ? $arSite["SERVER_NAME"] : ( defined("SITE_SERVER_NAME") && SITE_SERVER_NAME <> '' ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "") ) ); if ($bitrix24Installed && Loader::includeModule('socialservices')) { $b24NetworkTransport = new CBitrix24NetOAuthInterface(); $uri = new \Bitrix\Main\Web\Uri(defined('B24NETWORK_NODE') ? B24NETWORK_NODE : 'https://www.bitrix24.net'); $uri->setPath('/invite/'); $uri->addParams([ 'user_lang' => LANGUAGE_ID, 'client_id' => $b24NetworkTransport->getAppID(), 'profile_id' => $ID_ADDED, 'checkword' => $arUser["B24NETWORK_CHECKWORD"], 'accepted' => 'yes' ]); $url = $uri->getLocator(); } else { $url = (CMain::IsHTTPS() ? "https" : "http") . "://" . $serverName . $arSite["DIR"]; } $event->SendImmediate("INTRANET_USER_ADD", $siteIdByDepartmentId, array( "EMAIL_TO" => $arUser["EMAIL"], "LINK" => $url, "USER_ID_FROM" => $USER->GetID(), "PASSWORD" => $strPassword, "USER_TEXT" => $messageText )); } else { $dbUser = CUser::GetByID($ID_ADDED); $arUser = $dbUser->Fetch(); if ($bExtranet) { $event->SendImmediate("EXTRANET_INVITATION", $siteIdByDepartmentId, array( "USER_ID" => $arUser["ID"], "CHECKWORD" => $arUser["CONFIRM_CODE"], "EMAIL" => $arUser["EMAIL"], "USER_TEXT" => '' )); } elseif ($bitrix24Installed) { $event->SendImmediate("BITRIX24_USER_INVITATION", $siteIdByDepartmentId, array( "EMAIL_FROM" => $USER->GetEmail(), "USER_ID_FROM" => $USER->GetID(), "EMAIL_TO" => $arUser["EMAIL"], "LINK" => self::getInviteLink($arUser, $siteIdByDepartmentId), "USER_TEXT" => $messageText )); } else { $event->SendImmediate("INTRANET_USER_INVITATION", $siteIdByDepartmentId, array( "USER_ID_FROM" => $USER->GetID(), "EMAIL_TO" => $arUser["EMAIL"], "LINK" => self::getInviteLink($arUser, $siteIdByDepartmentId), "USER_TEXT" => $messageText )); } } } } return $ID_ADDED; } public static function RegisterNewUser($SITE_ID, $arFields, &$arError) { global $APPLICATION; $arCreatedUserId = array(); $arEmailToRegister = array(); $arEmailToReinvite = array(); $arUserForTransferId = $arExtranetUserId = $arShopUserId = array(); $arEmailExist = array(); $bExtranetUser = false; $bExtranetInstalled = (IsModuleInstalled("extranet") && COption::GetOptionString("extranet", "extranet_site") <> ''); if ($arFields["EMAIL"] <> '' || $arFields['PHONE'] <> '') { $isPhone = is_array($arFields['PHONE']) && !empty($arFields['PHONE']); $phoneCountryList = []; if($isPhone) { $arEmailOriginal = $arFields['PHONE']; $phoneCountryList = $arFields['PHONE_COUNTRY']; } else { $arEmailOriginal = preg_split("/[\n\r\t\\,;\\ ]+/", trim($arFields["EMAIL"])); } $arEmail = $errorEmails = array(); $emailCnt = 0; foreach($arEmailOriginal as $index => $addr) { if ($emailCnt >= ($isPhone ? 5 : 100)) { $arError = array($isPhone ? GetMessage("BX24_INVITE_DIALOG_PHONE_LIMIT_EXCEEDED") : GetMessage("BX24_INVITE_DIALOG_EMAIL_LIMIT_EXCEEDED")); return false; } if($isPhone) { $phoneNumber = \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse($addr, $phoneCountryList[$index]); if($phoneNumber->isValid()) { $arEmail[] = $phoneNumber->format(\Bitrix\Main\PhoneNumber\Format::E164); $emailCnt++; } else { $errorEmails[] = $addr; } } else { if($addr <> '' && check_email($addr)) { $arEmail[] = $addr; $emailCnt++; } else { $errorEmails[] = htmlspecialcharsbx($addr); } } } if (count($arEmailOriginal) > count($arEmail)) { $arError = array(($isPhone ? GetMessage("BX24_INVITE_DIALOG_PHONE_ERROR"): GetMessage("BX24_INVITE_DIALOG_EMAIL_ERROR")).": ".implode(", ", $errorEmails)); return false; } foreach($arEmail as $email) { if($isPhone) { $filter = array( "=PHONE_NUMBER" => $email ); if (Loader::includeModule('socialnetwork')) { $externalAuthIdList = Socialnetwork\ComponentHelper::checkPredefinedAuthIdList(array('bot', 'imconnector', 'replica', 'sale', 'saleanonymous')); if (!empty($externalAuthIdList)) { $filter['!@USER.EXTERNAL_AUTH_ID'] = $externalAuthIdList; } } $rsUser = \Bitrix\Main\UserPhoneAuthTable::getList(array( 'filter' => $filter, 'select' => array("USER_ID", "USER_CONFIRM_CODE" => "USER.CONFIRM_CODE", "USER_EXTERNAL_AUTH_ID" => "USER.EXTERNAL_AUTH_ID", "USER_UF_DEPARTMENT" => "USER.UF_DEPARTMENT") )); } else { $filter = array( "=EMAIL" => $email ); if (Loader::includeModule('socialnetwork')) { $externalAuthIdList = Socialnetwork\ComponentHelper::checkPredefinedAuthIdList(array('bot', 'imconnector', 'replica', 'sale', 'saleanonymous')); if (!empty($externalAuthIdList)) { $filter['!@EXTERNAL_AUTH_ID'] = $externalAuthIdList; } } $rsUser = UserTable::getList(array( 'filter' => $filter, 'select' => array("ID", "CONFIRM_CODE", "EXTERNAL_AUTH_ID", "UF_DEPARTMENT") )); } $bFound = false; while ($arUser = $rsUser->Fetch()) { if($isPhone) { $arUser = array( 'ID' => $arUser["USER_ID"], 'CONFIRM_CODE' => $arUser["USER_CONFIRM_CODE"], 'EXTERNAL_AUTH_ID' => $arUser["USER_ID"], 'UF_DEPARTMENT' => $arUser["USER_UF_DEPARTMENT"], ); } $bFound = true; if ($arUser["EXTERNAL_AUTH_ID"] == 'email' || $arUser["EXTERNAL_AUTH_ID"] == 'shop') { $arUserForTransferId[] = $arUser["ID"]; if ($arUser["EXTERNAL_AUTH_ID"] == 'shop') { $arShopUserId[] = $arUser["ID"]; } } elseif ( $arUser["CONFIRM_CODE"] != "" && ( !$bExtranetInstalled || ( // both intranet isset($arFields["DEPARTMENT_ID"]) && intval($arFields["DEPARTMENT_ID"]) > 0 && isset($arUser["UF_DEPARTMENT"]) && ( ( is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"][0]) > 0 ) || ( !is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"]) > 0 ) ) ) || ( // both extranet ( !isset($arFields["DEPARTMENT_ID"]) || intval($arFields["DEPARTMENT_ID"]) <= 0 ) && ( !isset($arUser["UF_DEPARTMENT"]) || ( is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"][0]) <= 0 ) || ( !is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"]) <= 0 ) ) ) ) ) { $arEmailToReinvite[] = array( "EMAIL" => $email, "REINVITE" => true, "ID" => $arUser["ID"], "CONFIRM_CODE" => $arUser["CONFIRM_CODE"], "UF_DEPARTMENT" => $arUser["UF_DEPARTMENT"] ); } elseif ( ModuleManager::isModuleInstalled('bitrix24') && !ModuleManager::isModuleInstalled('extranet') && $arUser["EXTERNAL_AUTH_ID"] == 'socservices' && ( isset($arFields["DEPARTMENT_ID"]) && intval($arFields["DEPARTMENT_ID"]) > 0 ) && ( !isset($arUser["UF_DEPARTMENT"]) || ( is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"][0]) <= 0 ) || ( !is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"]) <= 0 ) ) // past-extranet to intranet ) { $arExtranetUserId[] = $arUser["ID"]; } else { $arEmailExist[] = $email; } } if (!$bFound) { $arEmailToRegister[] = array( "EMAIL" => $email, "REINVITE" => false ); } } } if(!$isPhone) { if( isset($arFields["MESSAGE_TEXT"]) && ( !Loader::includeModule('bitrix24') || ( CBitrix24::IsLicensePaid() && !CBitrix24::IsDemoLicense() ) || CBitrix24::IsNfrLicense() ) ) { $messageText = $arFields["MESSAGE_TEXT"]; CUserOptions::SetOption((IsModuleInstalled("bitrix24") ? "bitrix24" : "intranet"), "invite_message_text", $arFields["MESSAGE_TEXT"]); } else { $messageText = GetMessage("BX24_INVITE_DIALOG_INVITE_MESSAGE_TEXT_1"); } if( empty($arEmailToRegister) && empty($arEmailToReinvite) && empty($arUserForTransferId) && empty($arExtranetUserId) ) { $arError = array( ( !empty($arEmailExist) ? ( count($arEmailExist) > 1 ? GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR2", array("#EMAIL_LIST#" => implode(', ', $arEmailExist))) : GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", array("#EMAIL#" => $arEmailExist[0])) ) : GetMessage("BX24_INVITE_DIALOG_ERROR_EMPTY_EMAIL_LIST") ) ); return false; } //reinvite users foreach($arEmailToReinvite as $userData) { self::InviteUser($userData, $messageText, array('checkB24' => false)); } } else { // TODO: reinvite: self::InviteUserByPhone($userData) } $siteIdByDepartmentId = $arGroups = false; if ( !empty($arEmailToRegister) || !empty($arUserForTransferId) || !empty($arExtranetUserId) ) { if (isset($arFields["DEPARTMENT_ID"])) { $arFields["UF_DEPARTMENT"] = $arFields["DEPARTMENT_ID"]; } if ( !( isset($arFields["UF_DEPARTMENT"]) && intval($arFields["UF_DEPARTMENT"]) > 0 ) ) { if (!$bExtranetInstalled) { if (CModule::IncludeModule('iblock')) { $rsIBlock = CIBlock::GetList(array(), array("CODE" => "departments")); $arIBlock = $rsIBlock->Fetch(); $iblockID = $arIBlock["ID"]; $db_up_department = CIBlockSection::GetList( array(), array( "SECTION_ID" => 0, "IBLOCK_ID" => $iblockID ) ); if ($ar_up_department = $db_up_department->Fetch()) { $arFields["UF_DEPARTMENT"] = $ar_up_department['ID']; } } } else { $bExtranetUser = true; } } $siteIdByDepartmentId = self::getUserSiteId(array( "UF_DEPARTMENT" => (!$bExtranetUser ? $arFields["UF_DEPARTMENT"] : false), "SITE_ID" => $SITE_ID )); $arGroups = self::getUserGroups($siteIdByDepartmentId, $bExtranetUser); } // transfer email or shop users to employees or extranet if (!empty($arUserForTransferId)) { $arShopGroups = $arGroups; if (Loader::includeModule("crm")) { $arShopGroups[] = \Bitrix\Crm\Order\BuyerGroup::getSystemGroupId(); } foreach ($arUserForTransferId as $transferUserId) { $ID_TRANSFERRED = self::TransferEmailUser($transferUserId, array( "GROUP_ID" => (in_array($transferUserId, $arShopUserId)) ? $arShopGroups : $arGroups, "UF_DEPARTMENT" => $arFields["UF_DEPARTMENT"], "SITE_ID" => $siteIdByDepartmentId )); if (!$ID_TRANSFERRED) { if($e = $APPLICATION->GetException()) { $arError[] = $e->GetString(); } return false; } else { $arCreatedUserId[] = $ID_TRANSFERRED; } } } // transfer past-extranet users to employees if (!empty($arExtranetUserId)) { foreach ($arExtranetUserId as $extranetUserId) { $ID_TRANSFERRED = self::TransferExtranetUser($extranetUserId, array( "GROUP_ID" => $arGroups, "UF_DEPARTMENT" => $arFields["UF_DEPARTMENT"], "SITE_ID" => $siteIdByDepartmentId )); if (!$ID_TRANSFERRED) { if($e = $APPLICATION->GetException()) { $arError[] = $e->GetString(); } return false; } else { $arCreatedUserId[] = $ID_TRANSFERRED; } } } //register users if (!empty($arEmailToRegister)) { $invitedUserIdList = []; foreach ($arEmailToRegister as $userData) { if($isPhone) { $userData['LOGIN'] = $userData['EMAIL']; $userData['PHONE_NUMBER'] = $userData['EMAIL']; unset($userData['EMAIL']); } $userData["CONFIRM_CODE"] = randString(8); $userData["GROUP_ID"] = $arGroups; $userData["UF_DEPARTMENT"] = $arFields["UF_DEPARTMENT"]; $ID = self::RegisterUser($userData, $siteIdByDepartmentId); if(is_array($ID)) { $arError = $ID; return false; } else { $arCreatedUserId[] = $ID; $invitedUserIdList[] = $ID; $userData['ID'] = $ID; if(!$isPhone) { self::InviteUser($userData, $messageText, array('checkB24' => false)); } else { //TODO: invite user self::InviteUserByPhone($userData); } } } if (!empty($invitedUserIdList)) { Invitation::add([ 'USER_ID' => $invitedUserIdList, 'TYPE' => ($isPhone ? Invitation::TYPE_PHONE : Invitation::TYPE_EMAIL) ]); } } if (!empty($arEmailExist)) { if($isPhone) { $arError = array( count($arEmailExist) > 1 ? GetMessage("BX24_INVITE_DIALOG_USER_PHONE_EXIST_ERROR2", array("#PHONE_LIST#" => implode(', ', $arEmailExist))) : GetMessage("BX24_INVITE_DIALOG_USER_PHONE_EXIST_ERROR1", array("#PHONE#" => $arEmailExist[0])) ); } else { $arError = array( count($arEmailExist) > 1 ? GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR2", array("#EMAIL_LIST#" => implode(', ', $arEmailExist))) : GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", array("#EMAIL#" => $arEmailExist[0])) ); } return false; } else { return $arCreatedUserId; } } public static function inviteIntegrator($SITE_ID, $email, $messageText, &$strError) { CUserOptions::SetOption("bitrix24", "integrator_message_text", $messageText); $filter = array( "=LOGIN"=> $email, "!=EXTERNAL_AUTH_ID" => "imconnector" ); $rsUser = UserTable::getList(array( 'filter' => $filter, 'select' => array("ID", "CONFIRM_CODE", "EXTERNAL_AUTH_ID", "UF_DEPARTMENT") )); if ($arUser = $rsUser->Fetch()) { if (empty($arUser["CONFIRM_CODE"])) { $strError = GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", array("#EMAIL#" => $email)); return false; } else { $userData = array( "EMAIL" => $email, "REINVITE" => true, "ID" => $arUser["ID"], "CONFIRM_CODE" => $arUser["CONFIRM_CODE"], "UF_DEPARTMENT" => $arUser["UF_DEPARTMENT"] ); self::InviteUser($userData, $messageText, array('checkB24' => false)); } } else { $userData = array( "EMAIL" => $email, "REINVITE" => false ); if (CModule::IncludeModule('iblock')) { $rsIBlock = CIBlock::GetList(array(), array("CODE" => "departments")); $arIBlock = $rsIBlock->Fetch(); $iblockID = $arIBlock["ID"]; $db_up_department = CIBlockSection::GetList( array(), array( "SECTION_ID" => 0, "IBLOCK_ID" => $iblockID ) ); if ($ar_up_department = $db_up_department->Fetch()) { $arFields["UF_DEPARTMENT"] = $ar_up_department['ID']; } } $arGroups = self::getAdminGroups($SITE_ID); if (CModule::IncludeModule('bitrix24')) { $integratorGroupId = \Bitrix\Bitrix24\Integrator::getIntegratorGroupId(); $arGroups[] = $integratorGroupId; } //register users $userData["CONFIRM_CODE"] = randString(8); $userData["GROUP_ID"] = $arGroups; $userData["UF_DEPARTMENT"] = $arFields["UF_DEPARTMENT"]; $ID = self::RegisterUser($userData, $SITE_ID); if(is_array($ID)) { $arError = $ID; return false; } else { $userData['ID'] = $ID; self::InviteUser($userData, $messageText, array('checkB24' => false)); Invitation::add([ 'USER_ID' => [ $ID ], 'TYPE' => Invitation::TYPE_EMAIL ]); return $ID; } } } public static function getUserGroups($SITE_ID, $bExtranetUser = false) { $arGroups = array(); if ( $bExtranetUser && CModule::IncludeModule("extranet") ) { $extranetGroupID = CExtranet::GetExtranetUserGroupID(); if (intval($extranetGroupID) > 0) { $arGroups[] = $extranetGroupID; } } else { $rsGroups = CGroup::GetList( $o="", $b="", array( "STRING_ID" => "EMPLOYEES_".$SITE_ID ) ); while($arGroup = $rsGroups->Fetch()) { $arGroups[] = $arGroup["ID"]; } } return $arGroups; } public static function getAdminGroups($SITE_ID) { $arGroups = array(1); $rsGroups = CGroup::GetList( $o="", $b="", array( "STRING_ID" => "PORTAL_ADMINISTRATION_".$SITE_ID ) ); while($arGroup = $rsGroups->Fetch()) { $arGroups[] = $arGroup["ID"]; } return $arGroups; } public static function checkUsersCount($cnt) { if (CModule::IncludeModule("bitrix24")) { $UserMaxCount = intval(COption::GetOptionString("main", "PARAM_MAX_USERS")); $currentUserCount = CBitrix24::getActiveUserCount(); return $UserMaxCount <= 0 || $cnt <= $UserMaxCount - $currentUserCount; } return true; } public static function RegisterUser($userData, $SITE_ID = SITE_ID) { $bExtranetUser = (!isset($userData['UF_DEPARTMENT']) || empty($userData['UF_DEPARTMENT'])); $strPassword = self::GeneratePassword($SITE_ID, $bExtranetUser); $arUser = array( "LOGIN" => isset($userData["LOGIN"]) ? $userData["LOGIN"] : $userData["EMAIL"], 'EMAIL' => $userData['EMAIL'], "PASSWORD" => $strPassword, "CONFIRM_CODE" => $userData['CONFIRM_CODE'], "GROUP_ID" => $userData['GROUP_ID'], "LID" => $SITE_ID, "UF_DEPARTMENT" => (intval($userData["UF_DEPARTMENT"]) > 0 ? array($userData["UF_DEPARTMENT"]) : array()) ); if(isset($userData['PHONE_NUMBER'])) { $arUser['PHONE_NUMBER'] = $userData['PHONE_NUMBER']; $arUser['PERSONAL_MOBILE'] = $userData['PHONE_NUMBER']; } if(isset($userData["ACTIVE"])) { $arUser["ACTIVE"] = $userData["ACTIVE"]; } if(isset($userData['XML_ID'])) { $arUser['XML_ID'] = $userData['XML_ID']; } $obUser = new CUser; $res = $obUser->Add($arUser); if ($res) { $userFields = $arUser; $userFields['ID'] = $res; foreach(GetModuleEvents("intranet", "OnRegisterUser", true) as $arEvent) { ExecuteModuleEventEx($arEvent, [ $userFields ]); } } return ($res? $res : preg_split("/<br>/", $obUser->LAST_ERROR)); } public static function InviteUserByPhone($arUser, $params = array()) { } public static function InviteUser($arUser, $messageText, $params = array()) { global $USER; if ( !is_array($params) || !isset($params['checkB24']) || $params['checkB24'] !== false ) { if ( Loader::includeModule('bitrix24') && ( !CBitrix24::IsLicensePaid() || CBitrix24::IsDemoLicense() ) && !CBitrix24::IsNfrLicense() ) { $messageText = GetMessage("BX24_INVITE_DIALOG_INVITE_MESSAGE_TEXT_1"); } } $bExtranet = ( IsModuleInstalled('extranet') && ( !isset($arUser["UF_DEPARTMENT"]) || ( is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"][0]) <= 0 ) || ( !is_array($arUser["UF_DEPARTMENT"]) && intval($arUser["UF_DEPARTMENT"]) <= 0 ) ) ); $siteIdByDepartmentId = self::getUserSiteId(array( "UF_DEPARTMENT" => $arUser["UF_DEPARTMENT"], "SITE_ID" => SITE_ID )); $event = new CEvent; if ($bExtranet) { $event->SendImmediate("EXTRANET_INVITATION", $siteIdByDepartmentId, array( "USER_ID" => $arUser["ID"], "USER_ID_FROM" => $USER->GetID(), "CHECKWORD" => $arUser["CONFIRM_CODE"], "EMAIL" => $arUser["EMAIL"], "USER_TEXT" => $messageText )); } elseif (IsModuleInstalled("bitrix24")) { $event->SendImmediate("BITRIX24_USER_INVITATION", $siteIdByDepartmentId, array( "EMAIL_FROM" => $USER->GetEmail(), "USER_ID_FROM" => $USER->GetID(), "EMAIL_TO" => $arUser["EMAIL"], "LINK" => self::getInviteLink($arUser, $siteIdByDepartmentId), "USER_TEXT" => $messageText, )); } else { $event->SendImmediate("INTRANET_USER_INVITATION", $siteIdByDepartmentId, array( "EMAIL_TO" => $arUser["EMAIL"], "USER_ID_FROM" => $USER->GetID(), "LINK" => self::getInviteLink($arUser, $siteIdByDepartmentId), "USER_TEXT" => $messageText, )); } } public static function ReinviteUser($SITE_ID, $USER_ID) { $USER_ID = intval($USER_ID); $rsUser = CUser::GetList( ($o = "ID"), ($b = "DESC"), array("ID_EQUAL_EXACT" => $USER_ID), array("SELECT" => array("UF_DEPARTMENT")) ); if($arUser = $rsUser->Fetch()) { self::InviteUser($arUser, self::getInviteMessageText(), array('checkB24' => false)); return true; } return false; } public static function ReinviteExtranetUser($SITE_ID, $USER_ID) { global $USER; $USER_ID = intval($USER_ID); $rsUser = CUser::GetList( ($o = "ID"), ($b = "DESC"), array("ID_EQUAL_EXACT" => $USER_ID) ); if($arUser = $rsUser->Fetch()) { $event = new CEvent; $arFields = Array( "USER_ID" => $USER_ID, "USER_ID_FROM" => $USER->GetID(), "CHECKWORD" => $arUser["CONFIRM_CODE"], "EMAIL" => $arUser["EMAIL"], "USER_TEXT" => self::getInviteMessageText() ); $event->SendImmediate("EXTRANET_INVITATION", $SITE_ID, $arFields); return true; } return false; } public static function RequestToSonetGroups($arUserId, $arGroupCode, $arGroupName, $bExtranetUser = false) { global $APPLICATION, $USER; $arGroupToAdd = array(); $strError = false; if (!is_array($arUserId)) { $arUserId = array($arUserId); } if ( is_array($arGroupCode) && !empty($arGroupCode) && CModule::IncludeModule("socialnetwork") ) { foreach($arGroupCode as $group_code) { if( $bExtranetUser && preg_match('/^(SGN\d+)$/', $group_code, $match) && is_array($arGroupName) && isset($arGroupName[$match[1]]) && $arGroupName[$match[1]] <> '' && CModule::IncludeModule("extranet") && ( CSocNetUser::IsCurrentUserModuleAdmin(SITE_ID, false) || $APPLICATION->GetGroupRight("socialnetwork", false, "Y", "Y", array(CExtranet::GetExtranetSiteID(), false)) >= "K" ) ) { // check and create group, for extranet only $dbSubjects = CSocNetGroupSubject::GetList( array("SORT"=>"ASC", "NAME" => "ASC"), array("SITE_ID" => CExtranet::GetExtranetSiteID()), false, false, array("ID") ); if ($arSubject = $dbSubjects->GetNext()) { $arSocNetGroupFields = array( "NAME" => $arGroupName[$match[1]], "DESCRIPTION" => "", "VISIBLE" => "N", "OPENED" => "N", "CLOSED" => "N", "SUBJECT_ID" => $arSubject["ID"], "INITIATE_PERMS" => "E", "SPAM_PERMS" => "K", "SITE_ID" => array(SITE_ID, CExtranet::GetExtranetSiteID()) ); if ($group_id = CSocNetGroup::CreateGroup( $USER->GetID(), $arSocNetGroupFields, false )) { $arGroupToAdd[] = $group_id; } elseif ($e = $APPLICATION->GetException()) { $strError = $e->GetString(); } } } elseif(preg_match('/^SG(\d+)$/', $group_code, $match)) { $group_id = $match[1]; if ( ($arGroup = CSocNetGroup::GetByID($group_id)) && ($arCurrentUserPerms = CSocNetUserToGroup::InitUserPerms($USER->GetID(), $arGroup, CSocNetUser::IsCurrentUserModuleAdmin(SITE_ID, false))) && $arCurrentUserPerms["UserCanInitiate"] && $arGroup["CLOSED"] != "Y" ) { $arGroupToAdd[] = $group_id; } } } if (!$strError) { $arAccessCodes = array(); foreach($arGroupToAdd as $group_id) { foreach($arUserId as $user_id) { if (!CSocNetUserToGroup::SendRequestToJoinGroup($USER->GetID(), $user_id, $group_id, "", false)) { if ($e = $APPLICATION->GetException()) { $strError .= $e->GetString(); } } } $arAccessCodes[] = 'SG'.$group_id; } } } return $strError; } public static function OnAfterUserAuthorize($arParams) { global $CACHE_MANAGER; if ( isset($arParams['update']) && $arParams['update'] === false ) { return false; } if ($arParams['user_fields']['ID'] <= 0) { return false; } if ( array_key_exists('LAST_LOGIN', $arParams['user_fields']) && trim($arParams['user_fields']['LAST_LOGIN']) == '' // do not check CONFIRM_CODE, please && CModule::IncludeModule("socialnetwork") ) { $dbRelation = CSocNetUserToGroup::GetList( array(), array( "USER_ID" => $arParams['user_fields']['ID'], "ROLE" => SONET_ROLES_REQUEST, "INITIATED_BY_TYPE" => SONET_INITIATED_BY_GROUP ), false, false, array("ID", "GROUP_ID") ); while ($arRelation = $dbRelation->Fetch()) { if (CSocNetUserToGroup::UserConfirmRequestToBeMember($arParams['user_fields']['ID'], $arRelation["ID"], false)) { if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->ClearByTag("sonet_user2group_G".$arRelation["GROUP_ID"]); $CACHE_MANAGER->ClearByTag("sonet_user2group_U".$arParams['user_fields']['ID']); } if (CModule::IncludeModule("im")) { CIMNotify::DeleteByTag("SOCNET|INVITE_GROUP|".$arParams['user_fields']['ID']."|".intval($arRelation["ID"])); } } } } } private static function GeneratePassword($SITE_ID, $bExtranetUser) { global $USER; $arGroupID = self::getUserGroups($SITE_ID, $bExtranetUser); $arPolicy = $USER->GetGroupPolicy($arGroupID); $password_min_length = intval($arPolicy["PASSWORD_LENGTH"]); if($password_min_length <= 0) { $password_min_length = 6; } $password_chars = array( "abcdefghijklnmopqrstuvwxyz", "ABCDEFGHIJKLNMOPQRSTUVWXYZ", "0123456789", ); if($arPolicy["PASSWORD_PUNCTUATION"] === "Y") { $password_chars[] = ",.<>/?;:'\"[]{}\\|`~!@#\$%^&*()-_+="; } $password = randString($password_min_length, $password_chars); return $password; } public static function TransferEmailUser($userId, $arParams = array()) { global $APPLICATION; $userId = intval($userId); if (!($arUser = self::checkUserId($userId))) { $APPLICATION->ThrowException(GetMessage("BX24_INVITE_DIALOG_USER_ID_NO_EXIST_ERROR")); return false; } $dbUser = CUser::GetList( $o = "ID", $b = "ASC", array( "=EMAIL" => $arUser["EMAIL"], "EXTERNAL_AUTH_ID" => "", ), array("FIELDS" => array("ID")) ); if ($arUserCheck = $dbUser->Fetch()) { $APPLICATION->ThrowException(GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", array("#EMAIL#" => $arUser["EMAIL"]))); return false; } if ( !isset($arParams["SITE_ID"]) || empty($arParams["SITE_ID"]) ) { $arParams["SITE_ID"] = SITE_ID; } $bExtranetUser = ( !isset($arParams['UF_DEPARTMENT']) || empty($arParams['UF_DEPARTMENT']) ); if ( !isset($arParams["GROUP_ID"]) || empty($arParams["GROUP_ID"]) ) { $arParams["GROUP_ID"] = self::getUserGroups($arParams["SITE_ID"], $bExtranetUser); } self::$bSendPassword = true; $strPassword = self::GeneratePassword($arParams["SITE_ID"], $bExtranetUser); $arFields = array( "EXTERNAL_AUTH_ID" => '', "GROUP_ID" => $arParams['GROUP_ID'], "PASSWORD" => $strPassword, "EMAIL" => $arUser["EMAIL"] ); if ( isset($arParams["UF_DEPARTMENT"]) && intval($arParams["UF_DEPARTMENT"]) > 0 ) { $arFields["UF_DEPARTMENT"] = array($arParams["UF_DEPARTMENT"]); } if ( isset($arParams["NAME"]) && $arParams["NAME"] <> '' ) { $arFields["NAME"] = $arParams["NAME"]; } else { $arFields["NAME"] = $arUser["NAME"]; } if ( isset($arParams["LAST_NAME"]) && $arParams["LAST_NAME"] <> '' ) { $arFields["LAST_NAME"] = $arParams["LAST_NAME"]; } else { $arFields["LAST_NAME"] = $arUser["LAST_NAME"]; } if ( isset($arParams["POSITION"]) && $arParams["POSITION"] <> '' ) { $arFields["POSITION"] = $arParams["POSITION"]; } foreach(GetModuleEvents("intranet", "OnTransferEMailUser", true) as $arEvent) { if(!ExecuteModuleEventEx($arEvent, array(&$arFields))) { return false; } } $obUser = new CUser; if ($obUser->Update($userId, $arFields)) { $dbUser = CUser::GetByID($userId); $arUser = $dbUser->Fetch(); $arFields['ID'] = $userId; foreach(GetModuleEvents("intranet", "OnAfterTransferEMailUser", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($arUser)); } foreach(GetModuleEvents("intranet", "OnRegisterUser", true) as $arEvent) { ExecuteModuleEventEx($arEvent, [ $arFields ]); } self::sentTransferNotification($arUser, $arFields, $arParams); return $userId; } else { $APPLICATION->ThrowException(GetMessage("BX24_INVITE_DIALOG_ERROR_USER_TRANSFER")); return false; } } public static function TransferExtranetUser($userId, $arParams = array()) { global $APPLICATION; $userId = intval($userId); if (!($arUser = self::checkUserId($userId))) { $APPLICATION->ThrowException(GetMessage("BX24_INVITE_DIALOG_USER_ID_NO_EXIST_ERROR")); return false; } $dbUser = CUser::GetList( $o = "ID", $b = "ASC", array( "=EMAIL" => $arUser["EMAIL"], "=EXTERNAL_AUTH_ID" => 'socservices', ), array( "FIELDS" => array("ID", "ADMIN_NOTES", "EXTERNAL_AUTH_ID"), "SELECT" => array("UF_DEPARTMENT") ) ); if ( ($arUserCheck = $dbUser->Fetch()) && isset($arUserCheck["UF_DEPARTMENT"]) && ( ( is_array($arUserCheck["UF_DEPARTMENT"]) && intval($arUserCheck["UF_DEPARTMENT"][0]) > 0 ) || ( !is_array($arUserCheck["UF_DEPARTMENT"]) && intval($arUserCheck["UF_DEPARTMENT"]) > 0 ) ) ) { $APPLICATION->ThrowException(GetMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", array("#EMAIL#" => $arUser["EMAIL"]))); return false; } if ( !isset($arParams["SITE_ID"]) || empty($arParams["SITE_ID"]) ) { $arParams["SITE_ID"] = SITE_ID; } $bExtranetUser = ( !isset($arParams['UF_DEPARTMENT']) || empty($arParams['UF_DEPARTMENT']) ); if ( !isset($arParams["GROUP_ID"]) || empty($arParams["GROUP_ID"]) ) { $arParams["GROUP_ID"] = self::getUserGroups($arParams["SITE_ID"], $bExtranetUser); } self::$bSendPassword = true; $arFields = array( "EXTERNAL_AUTH_ID" => $arUser["EXTERNAL_AUTH_ID"], "GROUP_ID" => $arParams['GROUP_ID'], "PASSWORD" => \Bitrix\Main\Localization\Loc::getMessage('BX24_INVITE_DIALOG_PASSWORD_SAME'), "NAME" => $arUser["NAME"], "LAST_NAME" => $arUser["LAST_NAME"], "EMAIL" => $arUser["EMAIL"], "UF_DEPARTMENT" => array($arParams["UF_DEPARTMENT"]), "ADMIN_NOTES" => str_replace("~deactivated~", "", $arUser["ADMIN_NOTES"]), "ACTIVE" => "Y" ); if ( isset($arParams["POSITION"]) && $arParams["POSITION"] <> '' ) { $arFields["POSITION"] = $arParams["POSITION"]; } foreach(GetModuleEvents("intranet", "OnTransferExtranetUser", true) as $arEvent) { if(!ExecuteModuleEventEx($arEvent, array(&$arFields))) { return false; } } $obUser = new CUser; if ($obUser->Update($userId, $arFields)) { $dbUser = CUser::GetByID($userId); $arUser = $dbUser->Fetch(); $arFields['ID'] = $userId; foreach(GetModuleEvents("intranet", "OnAfterTransferExtranetUser", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($arUser)); } foreach(GetModuleEvents("intranet", "OnRegisterUser", true) as $arEvent) { ExecuteModuleEventEx($arEvent, [ $arFields ]); } self::sentTransferNotification($arUser, $arFields, $arParams); return $userId; } else { $APPLICATION->ThrowException(GetMessage("BX24_INVITE_DIALOG_ERROR_EXTRANET_USER_TRANSFER")); return false; } } private static function checkUserId($userId = 0) { if ($userId <= 0) { return false; } $dbUser = CUser::GetByID($userId); $arUser = $dbUser->Fetch(); if (!$arUser) { return false; } return $arUser; } private static function sentTransferNotification($arUser, $arFields, $arParams) { global $USER; $siteIdToSend = self::getUserSiteId(array( "UF_DEPARTMENT" => $arParams["UF_DEPARTMENT"], "SITE_ID" => $arParams["SITE_ID"] )); $messageText = self::getInviteMessageText(); $event = new CEvent; if(self::$bSendPassword) { $rsSites = CSite::GetByID($siteIdToSend); $arSite = $rsSites->Fetch(); $serverName = ( $arSite["SERVER_NAME"] <> '' ? $arSite["SERVER_NAME"] : ( defined("SITE_SERVER_NAME") && SITE_SERVER_NAME <> '' ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "") ) ); $event->SendImmediate("INTRANET_USER_ADD", $arParams["SITE_ID"], array( "EMAIL_TO" => $arUser["EMAIL"], "LINK" => (CMain::IsHTTPS() ? "https" : "http")."://".$serverName.$arSite["DIR"], "PASSWORD" => $arFields["PASSWORD"], "USER_TEXT" => $messageText )); } else { if(IsModuleInstalled("bitrix24")) { $event->SendImmediate("BITRIX24_USER_INVITATION", $arParams["SITE_ID"], array( "EMAIL_FROM" => $USER->GetEmail(), "USER_ID_FROM" => $USER->GetID(), "EMAIL_TO" => $arUser["EMAIL"], "LINK" => self::getInviteLink($arUser, $siteIdToSend), "USER_TEXT" => $messageText )); } else { $event->SendImmediate("INTRANET_USER_INVITATION", $arParams["SITE_ID"], array( "EMAIL_TO" => $arUser["EMAIL"], "USER_ID_FROM" => $USER->GetID(), "LINK" => self::getInviteLink($arUser, $siteIdToSend), "USER_TEXT" => $messageText )); } } } public static function getUserSiteId($arParams = array()) { $bExtranet = ( !isset($arParams["UF_DEPARTMENT"]) || intval($arParams["UF_DEPARTMENT"]) <= 0 ); if ( $bExtranet && CModule::IncludeModule("extranet") ) { $siteId = CExtranet::GetExtranetSiteID(); } elseif (IsModuleInstalled("bitrix24")) { $siteId = ( isset($arParams["SITE_ID"]) && !empty($arParams["SITE_ID"]) ? $arParams["SITE_ID"] : SITE_ID ); } else { CModule::IncludeModule('socialnetwork'); $arSite = CSocNetLogComponent::GetSiteByDepartmentId(intval($arParams["UF_DEPARTMENT"])); $siteId = $arSite["LID"]; } return $siteId; } public static function getInviteLink($arUser, $siteId) { $rsSites = CSite::GetByID($siteId); $arSite = $rsSites->Fetch(); $serverName = ( $arSite["SERVER_NAME"] <> '' ? $arSite["SERVER_NAME"] : ( defined("SITE_SERVER_NAME") && SITE_SERVER_NAME <> '' ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "") ) ); return CHTTP::URN2URI("/bitrix/tools/intranet_invite_dialog.php?user_id=".$arUser["ID"]."&checkword=".urlencode($arUser["CONFIRM_CODE"]), $serverName); } public static function getInviteMessageText() { return ( ($userMessageText = \Bitrix\Main\Config\Option::get(ModuleManager::isModuleInstalled("bitrix24") ? "bitrix24" : "intranet", "invite_message_text")) && ( !Loader::includeModule('bitrix24') || ( CBitrix24::IsLicensePaid() && !CBitrix24::IsDemoLicense() ) || CBitrix24::IsNfrLicense() ) ? $userMessageText : GetMessage("BX24_INVITE_DIALOG_INVITE_MESSAGE_TEXT_1") ); } public static function logAction($arUserId, $module, $action, $label) { if (function_exists('AddEventToStatFile')) { if (!is_array($arUserId)) { $arUserId = array($arUserId); } foreach ($arUserId as $userId) { if ($userId > 0) { AddEventToStatFile($module, $action, $label, $userId); } } } } }