%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/controller/classes/general/
Upload File :
Create Path :
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/controller/classes/general/controllermember.php

<?
IncludeModuleLangFile(__FILE__);

class CAllControllerMember
{
	/******************************* Public methods ************************************/
	public static function CheckMember($member_id, $member_url = false)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		$dbr_member = CControllerMember::GetById($member_id);
		$ar_member = $dbr_member->Fetch();
		if (!$ar_member)
		{
			$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR1")." ".htmlspecialcharsex($member_id));
			$APPLICATION->ThrowException($e);
			return false;
		}

		$oRequest = new CControllerServerRequestTo($ar_member, "ping");
		$oResponse = $oRequest->Send();
		if ($oResponse !== false)
		{
			return $oResponse->OK();
		}

		return false;
	}

	public static function RunCommandRedirect($member_id, $command, $arParameters = Array(), $log = true)
	{
		if(!($arMember = CControllerMember::GetMember($member_id)))
			return false;

		$command_id = CControllerMember::AddCommand($arMember["MEMBER_ID"], $command, $arParameters, false);

		$arVars = Array("command_id"=>$command_id);
		$oRequest = new CControllerServerRequestTo($arMember, "run", $arVars);

		if($log)
		{
			$arControllerLog = Array(
				'NAME'=>'REMOTE_COMMAND',
				'CONTROLLER_MEMBER_ID'=>$member_id,
				'DESCRIPTION'=>GetMessage("CTRLR_MEM_LOG_DESC_COMMAND").$command,
				'STATUS'=>'Y'
			);
			CControllerLog::Add($arControllerLog);
		}

		$oRequest->RedirectRequest($arMember["URL"]."/bitrix/admin/main_controller.php");

		return true;
	}

	public static function RunCommandWithLog($member_id, $command, $arParameters = Array(), $task_id=false, $operation = 'run')
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		$arControllerLog = Array(
				'NAME'=>'REMOTE_COMMAND',
				'CONTROLLER_MEMBER_ID'=>$member_id,
				'DESCRIPTION'=>"command: '$command'\n\noperation: '$operation'",
				'STATUS'=>'Y'
			);

		$res = CControllerMember::RunCommand($member_id, $command, $arParameters, $task_id, $operation);
		if($res === false)
		{
			$e = $APPLICATION->GetException();
			$arControllerLog['DESCRIPTION'] = $e->GetString()."\r\n".$arControllerLog['DESCRIPTION'];
			$arControllerLog['STATUS'] = 'N';
		}

		CControllerLog::Add($arControllerLog);
		return $res;
	}

	public static function RunCommand($member_id, $command, $arParameters = Array(), $task_id=false, $operation = 'run')
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;
		global $DB;

		if(!($arMember = CControllerMember::GetMember($member_id)))
			return false;

		if($operation == "run_immediate")
		{
			$arVars = array("command"=>$command);
		}
		else
		{
			$command_id = CControllerMember::AddCommand($arMember["MEMBER_ID"], $command, $arParameters, $task_id);

			if($command_id !== false)
				$arVars = array("command_id" => $command_id);
			else
				$arVars = array();
		}

		if(empty($arVars))
		{
			if(strlen($DB->GetErrorMessage()) > 0)
				$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR3")." ".$DB->GetErrorMessage());
			else
				$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR2"));
			$APPLICATION->ThrowException($e);
			return false;
		}

		$oRequest = new CControllerServerRequestTo($arMember, $operation, $arVars);

		/*@var $oResponse CControllerServerResponseFrom*/
		if(($oResponse = $oRequest->Send())===false)
			return false;

		if(!$oResponse->Check())
		{
			$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR2"));
			$APPLICATION->ThrowException($e);
			return false;
		}

		if($oResponse->OK() || preg_match("/^(STP0|FIN)/", $oResponse->text))
			return $oResponse->text;

		$str = strlen($oResponse->text)? $oResponse->text: $oResponse->status;
		$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR3")." ".$str);
		$APPLICATION->ThrowException($e);

		return false;
	}

	public static function SendFileWithLog($member_id, $file)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		$arControllerLog = array(
			'NAME' => 'SEND_FILE',
			'CONTROLLER_MEMBER_ID' => $member_id,
			'DESCRIPTION' => "sendfile",
			'STATUS' => 'Y',
		);

		$res = CControllerMember::SendFile();
		if ($res === false)
		{
			$e = $APPLICATION->GetException();
			$arControllerLog['DESCRIPTION'] = $e->GetString()."\n".$arControllerLog['DESCRIPTION'];
			$arControllerLog['STATUS'] = 'N';
		}

		CControllerLog::Add($arControllerLog);
		return $res;

	}

	public static function SendFile()
	{
		return false;
	}

	public static function UpdateCounters($member_id, $task_id = false)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;
		global $DB;
		$member_id = intval($member_id);

		$arMember = CControllerMember::GetMember($member_id);
		if(!$arMember)
		{
			$e = new CApplicationException("Member #".$member_id." is not found.");
			$APPLICATION->ThrowException($e);
			return false;
		}

		$dbr_group = CControllerGroup::GetList(array(), array("=ID" => $arMember["CONTROLLER_GROUP_ID"]), array("UF_*"));
		if(!$ar_group = $dbr_group->Fetch())
		{
			$e = new CApplicationException("Group #".$arMember["CONTROLLER_GROUP_ID"]." is not found.");
			$APPLICATION->ThrowException($e);
			return false;
		}

		$strCommand = '$arResult = array("DATE_FORMAT" => CSite::GetDateFormat());';
		if($ar_group["CHECK_COUNTER_FREE_SPACE"] == "Y")
			$strCommand .= "\n".'$quota = new CDiskQuota(); $disk_quota = $quota->GetDiskQuota(); if(is_bool($disk_quota))$arResult["COUNTER_FREE_SPACE"] = -1; else $arResult["COUNTER_FREE_SPACE"] = round($disk_quota/1024, 2);';
		if($ar_group["CHECK_COUNTER_SITES"] == "Y")
			$strCommand .= "\n".'$dbr = CSite::GetList(($by="sort"), ($order="asc"), array("ACTIVE"=>Y)); $arResult["COUNTER_SITES"] = $dbr->SelectedRowsCount();';
		if($ar_group["CHECK_COUNTER_USERS"] == "Y")
			$strCommand .= "\n".'$dbr = $GLOBALS["DB"]->Query("SELECT COUNT(1) as USER_COUNT FROM b_user U WHERE (U.EXTERNAL_AUTH_ID IS NULL OR U.EXTERNAL_AUTH_ID=\'\')"); $ar = $dbr->Fetch(); $arResult["COUNTER_USERS"] = $ar["USER_COUNT"];';
		if($ar_group["CHECK_COUNTER_LAST_AUTH"] == "Y")
			$strCommand .= "\n".'$dbr = $GLOBALS["DB"]->Query("SELECT MAX(U.LAST_LOGIN) as LAST_LOGIN FROM b_user U"); $ar = $dbr->Fetch(); $arResult["COUNTER_LAST_AUTH"] = $ar["LAST_LOGIN"];';

		$rsCounters = CControllerCounter::GetMemberCounters($member_id);
		while($arCounter = $rsCounters->Fetch())
			$strCommand .= "\n".'$arResult['.$arCounter['ID'].'] = eval("'.EscapePHPString($arCounter["COMMAND"]).'");';

		$strCommand .= "\n".'foreach($arResult as $k=>$v) echo urlencode($k),"=",urlencode($v),"&";';

		foreach(GetModuleEvents("controller", "OnBeforeUpdateCounters", true) as $arEvent)
		{
			ExecuteModuleEventEx($arEvent, array($arMember, $ar_group, &$strCommand));
		}

		$command_result = CControllerMember::RunCommand($member_id, $strCommand, array(), $task_id, 'run_immediate');
		if($command_result===false)
		{
			$e = $APPLICATION->GetException();
			if(!is_object($e))
			{
				$e = new CApplicationException("Command execution error.");
				$APPLICATION->ThrowException($e);
			}
			return false;
		}

		$ar_command_result = array();
		parse_str($command_result, $ar_command_result);

		//Try to guess encoding and convert to controller site charset
		foreach($ar_command_result as $k => $v)
			$ar_command_result[$k] = CUtil::ConvertToLangCharset($v);

		$arFields = array(
			"TIMESTAMP" => $arMember["TIMESTAMP_X"],
			"~COUNTERS_UPDATED" => $DB->CurrentTimeFunction(),
		);
		if(array_key_exists('COUNTER_FREE_SPACE', $ar_command_result))
			$arFields['COUNTER_FREE_SPACE'] = intval($ar_command_result['COUNTER_FREE_SPACE']);
		if(array_key_exists('COUNTER_SITES', $ar_command_result))
			$arFields['COUNTER_SITES'] = intval($ar_command_result['COUNTER_SITES']);
		if(array_key_exists('COUNTER_USERS', $ar_command_result))
			$arFields['COUNTER_USERS'] = intval($ar_command_result['COUNTER_USERS']);
		if(array_key_exists('COUNTER_LAST_AUTH', $ar_command_result))
			$arFields['COUNTER_LAST_AUTH'] = $DB->FormatDate($ar_command_result['COUNTER_LAST_AUTH'], 'YYYY-MM-DD HH:MI:SS', CSite::GetDateFormat());

		if(!CControllerMember::Update($member_id, $arFields))
		{
			$e = $APPLICATION->GetException();
			$e = new CApplicationException(GetMessage("CTRLR_MEM_COUNTERS_ERR1").$e->GetString());
			$APPLICATION->ThrowException($e);
			return false;
		}

		CControllerCounter::UpdateMemberValues($member_id, $ar_command_result);

		return $arFields;
	}


	public static function SetGroupSettings($member_id, $task_id = false)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		if(!($arMember = CControllerMember::GetMember($member_id)))
			return false;

		$arControllerLog = Array(
				'NAME'=>'SET_SETTINGS',
				'CONTROLLER_MEMBER_ID'=>$arMember['ID'],
				'DESCRIPTION'=>GetMessage("CTRLR_MEM_LOG_DESC_GROUP").' '.$arMember["CONTROLLER_GROUP_ID"],
				'STATUS'=>'Y'
			);

		$result = false;
		if($strCommand = CControllerGroup::GetGroupSettings($arMember["CONTROLLER_GROUP_ID"]))
		{
			$dbr_group = CControllerGroup::GetList(array(), array("=ID" => $arMember["CONTROLLER_GROUP_ID"]), array("UF_*"));
			if($ar_group = $dbr_group->Fetch())
			{
				if($ar_group["TRIAL_PERIOD"]>0 && $arMember["IN_GROUP_FROM"])
				{
					$tFrom = MakeTimeStamp($arMember["IN_GROUP_FROM"], FORMAT_DATE);
					$tTo = $tFrom + $ar_group["TRIAL_PERIOD"]*24*60*60 - 1;

					$strCommand .= "\r\nCOption::SetOptionString('main', '~controller_trial', '".$tTo."');";
				}
				else
					$strCommand .= "\r\nCOption::RemoveOption('main', '~controller_trial');";
			}

			foreach(GetModuleEvents("controller", "OnBeforeSetGroupSettings", true) as $arEvent)
			{
				ExecuteModuleEventEx($arEvent, array($arMember, $ar_group, &$strCommand));
			}

			$result = CControllerMember::RunCommand($member_id, $strCommand, array(), $task_id, 'run_immediate');
		}
		else
		{
			$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR4")." ".$arMember["CONTROLLER_GROUP_ID"]);
			$APPLICATION->ThrowException($e);
		}

		if($task_id === false)
		{
			if($result === false)
			{
				$e = $APPLICATION->GetException();
				$arControllerLog['DESCRIPTION'] = $e->GetString();
				$arControllerLog['STATUS'] = 'N';
			}

			CControllerLog::Add($arControllerLog);
		}
		return $result;
	}

	public static function RemoveGroupSettings($member_id)
	{
		return true;
	}

	public static function addHistoryNote($CONTROLLER_MEMBER_ID, $strNote)
	{
		global $DB, $USER;

		if(is_object($USER))
			$USER_ID = $USER->GetID();
		else
			$USER_ID = 1;

		$DB->Add("b_controller_member_log", array(
			"CONTROLLER_MEMBER_ID" => $CONTROLLER_MEMBER_ID,
			"USER_ID" => $USER_ID,
			"~CREATED_DATE" => $DB->CurrentTimeFunction(),
			"FIELD" => "NOTE",
			"NOTES" => $strNote,
		), array("NOTES"));
	}

	public static function logChanges($CONTROLLER_MEMBER_ID, $arFieldsOld, $arFieldsNew, $strNote)
	{
		global $DB, $USER;
		static $arFieldsToLog = array("CONTROLLER_GROUP_ID", "SITE_ACTIVE", "NAME");

		if(is_object($USER))
			$USER_ID = $USER->GetID();
		else
			$USER_ID = 1;

		foreach($arFieldsToLog as $FIELD)
		{
			if(
				isset($arFieldsOld[$FIELD])
				&& isset($arFieldsNew[$FIELD])
				&& $arFieldsOld[$FIELD] != $arFieldsNew[$FIELD]
			)
				$DB->Add("b_controller_member_log", array(
					"CONTROLLER_MEMBER_ID" => $CONTROLLER_MEMBER_ID,
					"USER_ID" => $USER_ID,
					"~CREATED_DATE" => $DB->CurrentTimeFunction(),
					"FIELD" => $FIELD,
					"FROM_VALUE" => $arFieldsOld[$FIELD],
					"TO_VALUE" => $arFieldsNew[$FIELD],
					"NOTES" => $strNote,
				), array("FROM_VALUE", "TO_VALUE", "NOTES"));
		}
	}

	public static function GetLog($arFilter)
	{
		global $DB;

		$obQueryWhere = new CSQLWhere;
		$arFields = array(
			"CONTROLLER_MEMBER_ID" => array(
				"TABLE_ALIAS" => "l",
				"FIELD_NAME" => "l.CONTROLLER_MEMBER_ID",
				"FIELD_TYPE" => "int",
				"JOIN" => false,
			),
			"FIELD" => array(
				"TABLE_ALIAS" => "l",
				"FIELD_NAME" => "l.FIELD",
				"FIELD_TYPE" => "string",
				"JOIN" => false,
			),
		);
		$obQueryWhere->SetFields($arFields);

		if(!is_array($arFilter))
			$arFilter = array();
		$strQueryWhere = $obQueryWhere->GetQuery($arFilter);

		$strSql = "
			SELECT l.*
				,".$DB->DateToCharFunction("l.CREATED_DATE", "FULL")." CREATED_DATE
				,".$DB->Concat("'('", "U.LOGIN", "') '", "U.NAME", "' '", "U.LAST_NAME")." USER_ID_USER
			FROM b_controller_member_log l
			LEFT JOIN b_user U ON U.ID = l.USER_ID
		";

		if($strQueryWhere)
		{
			$strSql .= "
				WHERE
				".$strQueryWhere."
			";
		}

		$strSql .= "
			ORDER BY l.ID DESC
		";

		return $DB->Query($strSql);
	}

	public static function Add($arFields)
	{
		/** @global CUserTypeManager $USER_FIELD_MANAGER */
		global $USER_FIELD_MANAGER;
		/** @global CDatabase $DB */
		global $DB;

		if(!CControllerMember::CheckFields($arFields))
			return false;

		if(!$USER_FIELD_MANAGER->CheckFields("CONTROLLER_MEMBER", 0, $arFields))
			return false;

		$arFields["SITE_ACTIVE"] = "X";
		unset($arFields["TIMESTAMP_X"]);
		unset($arFields["~TIMESTAMP_X"]);

		$ID = $DB->Add("b_controller_member", $arFields, array("NOTES"));
		$USER_FIELD_MANAGER->Update("CONTROLLER_MEMBER", $ID, $arFields);

		CControllerMember::UnregisterExpiredAgent($ID);

		return $ID;
	}

	public static function Update($ID, $arFields, $strNote = "")
	{
		/** @global CUserTypeManager $USER_FIELD_MANAGER */
		global $USER_FIELD_MANAGER;
		/** @global CDatabase $DB */
		global $DB;

		$dbr_m = CControllerMember::GetByID($ID);
		$ar_m = $dbr_m->Fetch();

		if(!CControllerMember::CheckFields($arFields, $ID))
			return false;

		if(!$USER_FIELD_MANAGER->CheckFields("CONTROLLER_MEMBER", $ID, $arFields))
			return false;

		if(
			isset($arFields["CONTROLLER_GROUP_ID"])
			&& $ar_m["CONTROLLER_GROUP_ID"] != $arFields["CONTROLLER_GROUP_ID"]
			&& !isset($arFields["IN_GROUP_FROM"])
		)
			$arFields["~IN_GROUP_FROM"] = $DB->CurrentTimeFunction();

		unset($arFields["TIMESTAMP_X"]);
		if(array_key_exists("TIMESTAMP", $arFields))
			$arFields["~TIMESTAMP_X"] = $DB->CharToDateFunction($arFields["TIMESTAMP"]);
		else
			$arFields["~TIMESTAMP_X"] = $DB->CurrentTimeFunction();

		$arUpdateBinds = array();
		$strUpdate = $DB->PrepareUpdateBind("b_controller_member", $arFields, "", false, $arUpdateBinds);

		$strSql = "UPDATE b_controller_member SET ".$strUpdate." WHERE ID=".intval($ID);

		$arBinds = array();
		foreach($arUpdateBinds as $field_id)
			$arBinds[$field_id] = $arFields[$field_id];

		$DB->QueryBind($strSql, $arBinds);

		$dbr_m = CControllerMember::GetByID($ID);
		$ar_n = $dbr_m->Fetch();

		CControllerMember::logChanges($ID, $ar_m, $ar_n, $strNote);

		$USER_FIELD_MANAGER->Update("CONTROLLER_MEMBER", $ID, $arFields);

		if(
			isset($arFields["CONTROLLER_GROUP_ID"])
			&& $ar_m["CONTROLLER_GROUP_ID"] != $arFields["CONTROLLER_GROUP_ID"]
		)
		{
			CControllerMember::SetGroupSettings($ID);
		}

		if(
			isset($arFields["ACTIVE"]) && $ar_m["ACTIVE"] != $arFields["ACTIVE"]
			|| isset($arFields["DATE_ACTIVE_FROM"]) && $ar_m["DATE_ACTIVE_FROM"] != $arFields["DATE_ACTIVE_FROM"]
			|| isset($arFields["DATE_ACTIVE_TO"]) && $ar_m["DATE_ACTIVE_TO"] != $arFields["DATE_ACTIVE_TO"]
		)
		{
			CControllerMember::UnregisterExpiredAgent($ID);
		}

		return true;
	}

	public static function Delete($ID)
	{
		global $DB, $USER_FIELD_MANAGER;
		$ID = intval($ID);

		$USER_FIELD_MANAGER->Delete("CONTROLLER_MEMBER", $ID);
		$DB->Query("DELETE FROM b_controller_log WHERE CONTROLLER_MEMBER_ID = ".$ID);
		$DB->Query("DELETE FROM b_controller_task WHERE CONTROLLER_MEMBER_ID = ".$ID);
		$DB->Query("DELETE FROM b_controller_counter_value WHERE CONTROLLER_MEMBER_ID = ".$ID);
		$DB->Query("DELETE FROM b_controller_member_log WHERE CONTROLLER_MEMBER_ID = ".$ID);
		$DB->Query("DELETE FROM b_controller_member WHERE ID = ".$ID);

		return true;
	}

	public static function GetList($arOrder = array(), $arFilter = array(), $arSelect = array(), $arOptions = array(), $arNavParams = false)
	{
		global $DB, $USER_FIELD_MANAGER;

		$bEmptySelect = !is_array($arSelect) || empty($arSelect);

		if(is_array($arOrder) && is_array($arSelect))
			foreach($arOrder as $k => $v)
				$arSelect[] = $k;

		$obUserFieldsSql = new CUserTypeSQL;
		$obUserFieldsSql->SetEntity("CONTROLLER_MEMBER", "M.ID");
		$obUserFieldsSql->SetSelect($arSelect);
		$obUserFieldsSql->SetFilter($arFilter);
		$obUserFieldsSql->SetOrder($arOrder);

		static $arFields = array(
			"ID" => array(
				"FIELD_NAME" => "M.ID",
				"FIELD_TYPE" => "int",
			),
			"MEMBER_ID" => array(
				"FIELD_NAME" => "M.MEMBER_ID",
				"FIELD_TYPE" => "string",
			),
			"SECRET_ID" => array(
				"FIELD_NAME" => "M.SECRET_ID",
				"FIELD_TYPE" => "string",
			),
			"NAME" => array(
				"FIELD_NAME" => "M.NAME",
				"FIELD_TYPE" => "string",
			),
			"EMAIL" => array(
				"FIELD_NAME" => "M.EMAIL",
				"FIELD_TYPE" => "string",
			),
			"CONTACT_PERSON" => array(
				"FIELD_NAME" => "M.CONTACT_PERSON",
				"FIELD_TYPE" => "string",
			),
			"URL" => array(
				"FIELD_NAME" => "M.URL",
				"FIELD_TYPE" => "string",
			),
			"CONTROLLER_GROUP_ID" => array(
				"FIELD_NAME" => "M.CONTROLLER_GROUP_ID",
				"FIELD_TYPE" => "int",
			),
			"CONTROLLER_GROUP_NAME" => array(
				"FIELD_NAME" => "G.NAME",
				"FIELD_TYPE" => "string",
				"TABLE_ALIAS" => "G",
				"JOIN" => "INNER JOIN b_controller_group G ON G.ID = M.CONTROLLER_GROUP_ID",
				"LEFT_JOIN" => "LEFT JOIN b_controller_group G ON G.ID = M.CONTROLLER_GROUP_ID",
			),
			"IN_GROUP_FROM" => array(
				"FIELD_NAME" => "M.IN_GROUP_FROM",
				"FIELD_TYPE" => "datetime",
				"FORMAT" => "FULL",
			),
			"SHARED_KERNEL" => array(
				"FIELD_NAME" => "M.SHARED_KERNEL",
				"FIELD_TYPE" => "string",
			),
			"ACTIVE" => array(
				"FIELD_NAME" => "M.ACTIVE",
				"FIELD_TYPE" => "string",
			),
			"SITE_ACTIVE" => array(
				"FIELD_NAME" => "M.SITE_ACTIVE",
				"FIELD_TYPE" => "string",
			),
			"DISCONNECTED" => array(
				"FIELD_NAME" => "M.DISCONNECTED",
				"FIELD_TYPE" => "string",
			),
			"DATE_ACTIVE_FROM" => array(
				"FIELD_NAME" => "M.DATE_ACTIVE_FROM",
				"FIELD_TYPE" => "datetime",
				"FORMAT" => "SHORT",
			),
			"DATE_ACTIVE_TO" => array(
				"FIELD_NAME" => "M.DATE_ACTIVE_TO",
				"FIELD_TYPE" => "datetime",
				"FORMAT" => "SHORT",
			),
			"TIMESTAMP_X" => array(
				"FIELD_NAME" => "M.TIMESTAMP_X",
				"FIELD_TYPE" => "datetime",
				"FORMAT" => "FULL",
			),
			"MODIFIED_BY" => array(
				"FIELD_NAME" => "M.MODIFIED_BY",
				"FIELD_TYPE" => "int",
			),
			"MODIFIED_BY_USER" => array(
				"FIELD_TYPE" => "string",
			),
			"DATE_CREATE" => array(
				"FIELD_NAME" => "M.DATE_CREATE",
				"FIELD_TYPE" => "datetime",
				"FORMAT" => "FULL",
			),
			"CREATED_BY" => array(
				"FIELD_NAME" => "M.CREATED_BY",
				"FIELD_TYPE" => "int",
			),
			"CREATED_BY_USER" => array(
				"FIELD_TYPE" => "string",
			),
			"COUNTER_FREE_SPACE" => array(
				"FIELD_NAME" => "M.COUNTER_FREE_SPACE",
				"FIELD_TYPE" => "int",
			),
			"COUNTER_SITES" => array(
				"FIELD_NAME" => "M.COUNTER_SITES",
				"FIELD_TYPE" => "int",
			),
			"COUNTER_USERS" => array(
				"FIELD_NAME" => "M.COUNTER_USERS",
				"FIELD_TYPE" => "int",
			),
			"COUNTER_LAST_AUTH" => array(
				"FIELD_NAME" => "M.COUNTER_LAST_AUTH",
				"FIELD_TYPE" => "datetime",
				"FORMAT" => "FULL",
			),
			"COUNTERS_UPDATED" => array(
				"FIELD_NAME" => "M.COUNTERS_UPDATED",
				"FIELD_TYPE" => "datetime",
				"FORMAT" => "FULL",
			),
			"NOTES" => array(
				"FIELD_NAME" => "M.NOTES",
			),
			"HOSTNAME" => array(
				"FIELD_NAME" => "M.HOSTNAME",
				"FIELD_TYPE" => "string",
			),
		);

		$arFields["MODIFIED_BY_USER"]["FIELD_NAME"] = $DB->Concat("'('", "UM.LOGIN", "') '", "UM.NAME", "' '", "UM.LAST_NAME");
		$arFields["CREATED_BY_USER"]["FIELD_NAME"] = $DB->Concat("'('", "UC.LOGIN", "') '", "UC.NAME", "' '", "UC.LAST_NAME");

		$rsCounters = CControllerCounter::GetList();
		while($arCounter = $rsCounters->Fetch())
		{
			$arFields["COUNTER_".$arCounter["ID"]] = array(
				"FIELD_NAME" => "CCV_".$arCounter["ID"].".".CControllerCounter::GetTypeColumn($arCounter["COUNTER_TYPE"]),
				"FIELD_TYPE" => CControllerCounter::GetTypeUserType($arCounter["COUNTER_TYPE"]),
				"TABLE_ALIAS" => "CCV_".$arCounter["ID"],
				"JOIN" => "INNER JOIN b_controller_counter_value CCV_".$arCounter["ID"]." ON CCV_".$arCounter["ID"].".CONTROLLER_COUNTER_ID = ".$arCounter["ID"]." AND CCV_".$arCounter["ID"].".CONTROLLER_MEMBER_ID = M.ID",
				"LEFT_JOIN" => "LEFT JOIN b_controller_counter_value CCV_".$arCounter["ID"]." ON CCV_".$arCounter["ID"].".CONTROLLER_COUNTER_ID = ".$arCounter["ID"]." AND CCV_".$arCounter["ID"].".CONTROLLER_MEMBER_ID = M.ID",
			);
		}

		$obWhere = new CSQLWhere;
		$obWhere->SetFields($arFields);

		$obWhereCnt = new CSQLWhere;
		$obWhereCnt->SetFields($arFields);

		$arDateFields = array();
		foreach($arFields as $code => $arField)
			if($arField["FIELD_TYPE"] == "datetime")
				$arDateFields[] = $code;
		$date_field = "/(".implode("|", $arDateFields).")\$/";

		$arFilterNew = array();
		if(is_array($arFilter))
		{
			foreach($arFilter as $k => $value)
			{
				if(is_array($value))
				{
					if(!empty($value))
						$arFilterNew[$k] = $value;
				}
				elseif($value === false)
				{
					$arFilterNew[$k] = $value;
				}
				elseif(strlen($value) > 0)
				{
					if(array_key_exists("date_format", $arOptions) && preg_match($date_field, $k))
						$arFilterNew[$k] = ConvertTimeStamp(MakeTimeStamp($value, $arOptions["date_format"]), "FULL");
					else
						$arFilterNew[$k] = $value;
				}
			}
		}

		$strWhere = "1 = 1";

		$r = $obWhereCnt->GetQuery($arFilterNew);
		$r = $obWhere->GetQuery($arFilterNew);
		if(strlen($r) > 0)
			$strWhere .= " AND (".$r.") ";

		$userFieldsWhere = $obUserFieldsSql->GetFilter();
		if($userFieldsWhere)
			$strWhere .= " AND (".$userFieldsWhere.") ";

		if(is_array($arOrder))
		{
			foreach($arOrder as $key => $value)
			{
				$key = strtoupper($key);
				if(array_key_exists($key, $arFields) && isset($arFields[$key]["LEFT_JOIN"]))
					$obWhere->c_joins[$key]++;
			}
		}

		if($bEmptySelect)
		{
			$arSelectAdd = array(
				"ID",
				"MEMBER_ID",
				"SECRET_ID",
				"NAME",
				"URL",
				"HOSTNAME",
				"EMAIL",
				"CONTACT_PERSON",
				"CONTROLLER_GROUP_ID",
				"DISCONNECTED",
				"SHARED_KERNEL",
				"ACTIVE",
				"DATE_ACTIVE_FROM",
				"DATE_ACTIVE_TO",
				"SITE_ACTIVE",
				"TIMESTAMP_X",
				"MODIFIED_BY",
				"DATE_CREATE",
				"CREATED_BY",
				"IN_GROUP_FROM",
				"NOTES",
				"COUNTER_FREE_SPACE",
				"COUNTER_SITES",
				"COUNTER_USERS",
				"COUNTER_LAST_AUTH",
				"COUNTERS_UPDATED",
				"MODIFIED_BY_USER",
				"CREATED_BY_USER",
			);
			if(is_array($arSelect))
				$arSelect = array_merge($arSelect, $arSelectAdd);
			else
				$arSelect = $arSelectAdd;
		}

		$duplicates = array("ID" => 1);
		$strSelect = "M.ID AS ID\n";
		foreach($arSelect as $key)
		{
			$key = strtoupper($key);
			if(array_key_exists($key, $arFields) && !array_key_exists($key, $duplicates))
			{
				$duplicates[$key]++;

				if(isset($arFields[$key]["LEFT_JOIN"]))
					$obWhere->c_joins[$key]++;

				if($arFields[$key]["FIELD_TYPE"] == "datetime")
				{
					if(array_key_exists("date_format", $arOptions))
						$strSelect .= ",".$DB->DateFormatToDB($arOptions["date_format"], $arFields[$key]["FIELD_NAME"])." AS ".$key."\n";
					else
						$strSelect .= ",".$arFields[$key]["FIELD_NAME"]." AS ".$key."_TMP,".$DB->DateToCharFunction($arFields[$key]["FIELD_NAME"], $arFields[$key]["FORMAT"])." AS ".$key."\n";
				}
				else
					$strSelect .= ",".$arFields[$key]["FIELD_NAME"]." AS ".$key."\n";
			}
		}

		$bUseSubQuery = false;
		if(
			$DB->type == "ORACLE"
			&& $obUserFieldsSql->GetDistinct()
		)
		{
			$bUseSubQuery = true;
		}

		if($bUseSubQuery)
		{
			$ob = new CUserTypeSQL;
			$ob->SetEntity("CONTROLLER_MEMBER", "M.ID");
			$ob->SetSelect($arSelect);
			$ob->SetOrder($arOrder);

			$strSelect = "SELECT ".$strSelect.$ob->GetSelect();
			$strSql = "
				FROM b_controller_member M
					LEFT JOIN b_user UC ON UC.ID = M.CREATED_BY
					LEFT JOIN b_user UM ON UM.ID = M.MODIFIED_BY
					".$obWhere->GetJoins()."
					".$ob->GetJoin("M.ID")."
				WHERE M.ID IN (
					SELECT M.ID
					FROM b_controller_member M
					".$obWhere->GetJoins()."
					".$obUserFieldsSql->GetJoin("M.ID")."
					WHERE ".$strWhere."
				)
			";
			$strSqlCnt = "
				FROM b_controller_member M
					".$obWhereCnt->GetJoins()."
					".$ob->GetJoin("M.ID")."
				WHERE M.ID IN (
					SELECT M.ID
					FROM b_controller_member M
					".$obWhereCnt->GetJoins()."
					".$obUserFieldsSql->GetJoin("M.ID")."
					WHERE ".$strWhere."
				)
			";
			$strOrder = CControllerAgent::_OrderBy($arOrder, $arFields, $ob);
		}
		else
		{
			$strSelect = "SELECT ".($obUserFieldsSql->GetDistinct()? "DISTINCT": "")." ".$strSelect.$obUserFieldsSql->GetSelect();
			$strSql = "
				FROM b_controller_member M
					LEFT JOIN b_user UC ON UC.ID = M.CREATED_BY
					LEFT JOIN b_user UM ON UM.ID = M.MODIFIED_BY
					".$obWhere->GetJoins()."
					".$obUserFieldsSql->GetJoin("M.ID")."
				WHERE ".$strWhere."
			";
			$strSqlCnt = "
				FROM b_controller_member M
					".$obWhereCnt->GetJoins()."
					".($userFieldsWhere? $obUserFieldsSql->GetJoin("M.ID"): "")."
				WHERE ".$strWhere."
			";
			$strOrder = CControllerAgent::_OrderBy($arOrder, $arFields, $obUserFieldsSql);
		}

		if (is_array($arNavParams) && $arNavParams["nTopCount"] > 0)
		{
			$strSql = $DB->TopSQL($strSelect.$strSql.$strOrder, $arNavParams["nTopCount"]);
			$dbr = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		}
		elseif (is_array($arNavParams))
		{
			$res_cnt = $DB->Query("SELECT count('x') CNT ".$strSqlCnt);
			$ar_cnt = $res_cnt->Fetch();

			$dbr = new CDBResult();
			$dbr->NavQuery($strSelect.$strSql.$strOrder, $ar_cnt["CNT"], $arNavParams);
		}
		else
		{
			$dbr = $DB->Query($strSelect.$strSql.$strOrder, false, "File: ".__FILE__."<br>Line: ".__LINE__);
		}

		$dbr->is_filtered = $strWhere != "1 = 1";
		$dbr->SetUserFields($USER_FIELD_MANAGER->GetUserFields("CONTROLLER_MEMBER"));

		return $dbr;
	}

	public static function GetByID($ID)
	{
		return CControllerMember::GetList(Array(), Array("ID"=>IntVal($ID)));
	}


	public static function GetByGuid($guid)
	{
		return CControllerMember::GetList(Array(), Array("=MEMBER_ID"=>$guid));
	}

	public static function RegisterMemberByPassword($ar_member, $admin_login, $admin_password, $controller_url = false)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		if($controller_url===false)
			$controller_url = COption::GetOptionString("controller", "controller_url", ($APPLICATION->IsHTTPS()?"https://":"http://").$_SERVER['HTTP_HOST']);

		if(!isset($ar_member['MEMBER_ID']))
			$ar_member['MEMBER_ID'] = "m".\Bitrix\Main\Security\Random::getString(31);

		if(!isset($ar_member['SECRET_ID']))
			$ar_member['SECRET_ID'] = "m".\Bitrix\Main\Security\Random::getString(31);

		if(!CControllerMember::CheckFields($ar_member))
			return false;

		$arParameters = Array(
			"member_id" => $ar_member['MEMBER_ID'],
			"member_secret_id" => $ar_member['SECRET_ID'],
			"controller_url" => $controller_url,
			"admin_login" => $admin_login,
			"admin_password" => $admin_password,
			"join_command" => '
				COption::SetOptionString("main", "controller_member", "Y");
				COption::SetOptionString("main", "controller_ticket", "");
				RegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin", 1);
				RegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			',
			"disconnect_command" => '
				CControllerClient::RestoreAll();
				COption::SetOptionString("main", "controller_member", "N");
				COption::SetOptionString("main", "controller_member_id", "");
				COption::SetOptionString("main", "controller_url", "");
				UnRegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin");
				UnRegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			'
		);

		$oRequest = new CControllerServerRequestTo($ar_member, "simple_register", $arParameters);
		if(($oResponse = $oRequest->Send())===false)
		{
			return false;
		}

		$result = $oResponse->OK();

		if($result === false)
		{
			$e = new CApplicationException($oResponse->text);
			$APPLICATION->ThrowException($e);
		}
		else
		{
			$APPLICATION->ResetException();
			if($ID = CControllerMember::Add($ar_member))
			{
				$arControllerLog = Array(
					'NAME'=>'REGISTRATION',
					'CONTROLLER_MEMBER_ID'=>$ID,
					'DESCRIPTION'=>GetMessage("CTRLR_MEM_LOG_DESC_JOIN_BY_TICKET"),
					'STATUS'=>'Y'
				);
				CControllerLog::Add($arControllerLog);
				CControllerMember::SetGroupSettings($ID);
				return $ID;
			}
		}

		return false;
	}

	public static function ReconnectMemberByPassword($ID, $ar_member, $admin_login, $admin_password, $controller_url = false)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		if($controller_url===false)
			$controller_url = COption::GetOptionString("controller", "controller_url", ($APPLICATION->IsHTTPS()?"https://":"http://").$_SERVER['HTTP_HOST']);

		if(!CControllerMember::CheckFields($ar_member, $ID))
			return false;

		$arParameters = Array(
			"member_id" => $ar_member['MEMBER_ID'],
			"member_secret_id" => $ar_member['SECRET_ID'],
			"controller_url" => $controller_url,
			"admin_login" => $admin_login,
			"admin_password" => $admin_password,
			"join_command" => '
				COption::SetOptionString("main", "controller_member", "Y");
				COption::SetOptionString("main", "controller_ticket", "");
				RegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin", 1);
				RegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			',
			"disconnect_command" => '
				CControllerClient::RestoreAll();
				COption::SetOptionString("main", "controller_member", "N");
				COption::SetOptionString("main", "controller_member_id", "");
				COption::SetOptionString("main", "controller_url", "");
				UnRegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin");
				UnRegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			'
		);

		$oRequest = new CControllerServerRequestTo($ar_member, "simple_register", $arParameters);
		if(($oResponse = $oRequest->Send())===false)
		{
			return false;
		}

		$result = $oResponse->OK();

		if($result === false)
		{
			$e = new CApplicationException($oResponse->text);
			$APPLICATION->ThrowException($e);
		}
		else
		{
			$APPLICATION->ResetException();
			if(CControllerMember::Update($ID, $ar_member))
			{
				$arControllerLog = Array(
					'NAME'=>'REGISTRATION',
					'CONTROLLER_MEMBER_ID'=>$ID,
					'DESCRIPTION'=>GetMessage("CTRLR_MEM_LOG_DESC_JOIN_BY_TICKET"),
					'STATUS'=>'Y'
				);
				CControllerLog::Add($arControllerLog);
				CControllerMember::SetGroupSettings($ID);
				return $ID;
			}
		}

		return false;
	}

	public static function CheckUserAuth($member_id, $login, $password)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		$arMember = CControllerMember::GetMember($member_id);
		if(!$arMember)
			return false;

		// send query to the client in order to check authorization
		$arParameters = array("login"=>$login, "password"=>$password);
		$oRequest = new CControllerServerRequestTo($arMember, 'check_auth', $arParameters);
		$oResponse = $oRequest->Send();
		if($oResponse === false)
			return false;

		if($oResponse->OK() === false)
		{
			$e = new CApplicationException($oResponse->text);
			$APPLICATION->ThrowException($e);
			return false;
		}
		elseif(COption::GetOptionString("controller", "auth_trans_enabled", "N") === "Y")
		{
			$current_groups = $oResponse->arParameters['USER_INFO']["GROUP_ID"];
			$arRemGroups = \Bitrix\Controller\GroupMapTable::getMapping("LOCAL_GROUP_CODE", "REMOTE_GROUP_CODE");
		}
		elseif(COption::GetOptionString("controller", "auth_controller_enabled", "N") === "Y")
		{
			$current_groups = $oResponse->arParameters['USER_INFO']["GROUP_ID"];
			$arRemGroups = \Bitrix\Controller\GroupMapTable::getMapping("LOCAL_GROUP_CODE", "CONTROLLER_GROUP_ID");
		}
		else
		{
			return false;
		}

		$GROUP_ID = array();
		$GROUPS_TO_ADD = array();
		$GROUPS_TO_DELETE = array();
		foreach($arRemGroups as $arTGroup)
		{
			$bFound = false;
			foreach($current_groups as $group_id)
			{
				if($arTGroup["FROM"] == $group_id)
				{
					$GROUP_ID[] = $arTGroup["TO"];
					$GROUPS_TO_ADD[] = $arTGroup["TO"];
					$bFound = true;
				}
			}

			if(!$bFound)
				$GROUPS_TO_DELETE[] = $arTGroup["TO"];
		}

		$oResponse->arParameters['USER_INFO']['GROUP_ID'] = $GROUP_ID;
		$oResponse->arParameters['USER_INFO']['GROUPS_TO_ADD'] = $GROUPS_TO_ADD;
		$oResponse->arParameters['USER_INFO']['GROUPS_TO_DELETE'] = $GROUPS_TO_DELETE;

		// return to the client
		return $oResponse->arParameters;
	}


	public static function RegisterMemberByPHP($ar_member)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		$controller_url = COption::GetOptionString("controller", "controller_url", ($APPLICATION->IsHTTPS()?"https://":"http://").$_SERVER['HTTP_HOST']);

		if(!isset($ar_member['MEMBER_ID']))
			$ar_member['MEMBER_ID'] = "m".\Bitrix\Main\Security\Random::getString(31);

		if(!isset($ar_member['SECRET_ID']))
			$ar_member['SECRET_ID'] = "m".\Bitrix\Main\Security\Random::getString(31);

		$arParameters = Array(
			"member_id" => $ar_member['MEMBER_ID'],
			"member_secret_id" => $ar_member['SECRET_ID'],
			"controller_url" => $controller_url,
			"join_command" => '
				COption::SetOptionString("main", "controller_member", "Y");
				COption::SetOptionString("main", "controller_ticket", "");
				RegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin", 1);
				RegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			',
			"disconnect_command" => '
				CControllerClient::RestoreAll();
				COption::SetOptionString("main", "controller_member", "N");
				COption::SetOptionString("main", "controller_member_id", "");
				COption::SetOptionString("main", "controller_url", "");
				UnRegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin");
				UnRegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			'
		);

		if($ar_member["ID"] = CControllerMember::Add($ar_member))
		{
			$ar_member["REG_PARAMS"] = $arParameters;
			return $ar_member;
		}
		return false;
	}


	public static function RegisterMemberByTicket($ar_member, $ticket_id, $session_id)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		if($ar_member["ID"]>0)
			$ID = $ar_member["ID"];
		else
			$ID = false;

		$member_id = $ar_member["MEMBER_ID"];

		if(!CControllerMember::CheckFields($ar_member, $ID))
			return false;

		$ar_member["MEMBER_ID"] = $member_id;

		$arParameters = Array(
			"controller_ticket_id"=>$ticket_id,
			"join_command" => '
				COption::SetOptionString("main", "controller_member", "Y");
				COption::SetOptionString("main", "controller_ticket", "");
				RegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin", 1);
				RegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			',
			"disconnect_command" => '
				CControllerClient::RestoreAll();
				COption::SetOptionString("main", "controller_member", "N");
				COption::SetOptionString("main", "controller_member_id", "");
				COption::SetOptionString("main", "controller_url", "");
				UnRegisterModuleDependences("main", "OnUserLoginExternal", "main", "CControllerClient", "OnExternalLogin", 1);
				UnRegisterModuleDependences("main", "OnExternalAuthList", "main", "CControllerClient", "OnExternalAuthList");
			'
		);

		$oRequest = new CControllerServerRequestTo($ar_member, "register", $arParameters);
		if($session_id)
			$oRequest->session_id = $session_id;

		if(($oResponse = $oRequest->Send())==false)
			return false;

		$result = $oResponse->OK();

		if($result === false)
		{
			$e = new CApplicationException($oResponse->text);
			$APPLICATION->ThrowException($e);
			return false;
		}


		if($ID>0)
		{
			$ar_member["DISCONNECTED"] = "N";
			$ID = CControllerMember::Update($ID, $ar_member) ? $ID : false;
		}
		else
			$ID = CControllerMember::Add($ar_member);

		if($ID>0)
		{
			$arControllerLog = Array(
					'NAME'=>'REGISTRATION',
					'CONTROLLER_MEMBER_ID'=>$ID,
					'DESCRIPTION'=>GetMessage("CTRLR_MEM_LOG_DESC_JOIN_BY_TICKET2"),
					'STATUS'=>'Y'
				);

			CControllerLog::Add($arControllerLog);
			CControllerMember::SetGroupSettings($ID);

			if(!isset($ar_member["DISCONNECTED"]) || $ar_member["DISCONNECTED"]=="N")
			{
				// add join event
				CTimeZone::Disable();
				$db_res = CControllerMember::GetByID($ID);
				CTimeZone::Enable();

				if($arFields = $db_res->Fetch())
				{
					foreach (GetModuleEvents("controller", "OnAfterRegisterMemberByTicket", true) as $arEvent)
					{
						ExecuteModuleEventEx($arEvent, array(&$arFields));
					}

					CEvent::Send("CONTROLLER_MEMBER_REGISTER", SITE_ID, $arFields);
				}
			}

			return $ID;
		}

		return false;
	}

	public static function CheckFields(&$arFields, $ID = false)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;
		/** @global CDatabase $DB */
		global $DB;
		/** @global CUser $USER */
		global $USER;

		$arMsg = array();
		if ($ID > 0)
		{
			unset($arFields["ID"]);
		}

		if ($ID === false)
		{
			if (!array_key_exists("MEMBER_ID", $arFields))
			{
				$arFields["MEMBER_ID"] = "m".\Bitrix\Main\Security\Random::getString(31);
			}
			elseif (array_key_exists("MEMBER_ID", $arFields))
			{
				if (intval($arFields["MEMBER_ID"]) > 0)
				{
					$arMsg[] = array(
						"id" => "MEMBER_ID",
						"text" => GetMessage("CTRLR_MEM_ERR_MEMBER_ID"),
					);
				}
				else
				{
					$strSqlCheck = "
						SELECT 'x'
						FROM b_controller_member
						WHERE MEMBER_ID = '".$DB->ForSQL($arFields['MEMBER_ID'], 32)."'
						AND ID <> ".intval($ID)."
					";
					$dbrCheck = $DB->Query($strSqlCheck);
					if ($dbrCheck->Fetch())
					{
						$arMsg[] = array(
							"id" => "MEMBER_ID",
							"text" => GetMessage("CTRLR_MEM_ERR_MEMBER_UID"),
						);
					}
				}
			}
		}

		if (($ID === false || array_key_exists("NAME", $arFields)) && strlen($arFields["NAME"]) <= 0)
		{
			$arMsg[] = array(
				"id" => "NAME",
				"text" => GetMessage("CTRLR_MEM_ERR_MEMBER_NAME"),
			);
		}

		if (($ID === false || array_key_exists("URL", $arFields)) && strlen($arFields["URL"]) <= 0)
		{
			$arMsg[] = array(
				"id" => "URL",
				"text" => GetMessage("CTRLR_MEM_ERR_MEMBER_URL"),
			);
		}

		if ($ID === false && !array_key_exists("CONTROLLER_GROUP_ID", $arFields))
		{
			$arFields["CONTROLLER_GROUP_ID"] = COption::GetOptionInt("controller", "default_group", 1);
		}

		if ($ID === false)
		{
			$dbEvents = GetModuleEvents("controller", "OnBeforeControllerMemberAdd", true);
		}
		else
		{
			$dbEvents = GetModuleEvents("controller", "OnBeforeControllerMemberUpdate", true);
		}

		$APPLICATION->ResetException();
		foreach($dbEvents as $arEvent)
		{
			$bEventRes = ExecuteModuleEventEx($arEvent, array($ID, &$arFields));
			if ($bEventRes === false)
			{
				$ex = $APPLICATION->GetException();
				$arMsg[] = array(
					"text" => ($ex? $ex->GetString(): "Unknown error."),
				);
			}
		}

		if (!empty($arMsg))
		{
			$e = new CAdminException($arMsg);
			$APPLICATION->ThrowException($e);
			return false;
		}

		if (isset($arFields["URL"]))
		{
			$arFields["URL"] = CControllerMember::_GoodURL($arFields["URL"]);
		}

		if (array_key_exists("ACTIVE", $arFields) && $arFields["ACTIVE"] != "Y")
		{
			$arFields["ACTIVE"] = "N";
		}

		if (array_key_exists("SHARED_KERNEL", $arFields) && $arFields["SHARED_KERNEL"] != "Y")
		{
			$arFields["SHARED_KERNEL"] = "N";
		}

		if (array_key_exists("DISCONNECTED", $arFields) && $arFields["DISCONNECTED"] != "Y" && $arFields["DISCONNECTED"]!="I")
		{
			$arFields["DISCONNECTED"] = "N";
		}

		if (!array_key_exists("MODIFIED_BY", $arFields) && is_object($USER))
		{
			$arFields["MODIFIED_BY"] = $USER->GetID();
		}

		if ($ID === false && !array_key_exists("CREATED_BY", $arFields) && is_object($USER))
		{
			$arFields["CREATED_BY"] = $USER->GetID();
		}

		if ($ID === false && !array_key_exists("DATE_CREATE", $arFields))
		{
			$arFields["~DATE_CREATE"] = $DB->CurrentTimeFunction();
		}

		return true;
	}

	public static function CloseMember($member_id, $bClose = true, $task_id = false)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		if(!($arMember = CControllerMember::GetMember($member_id)))
			return false;

		$arControllerLog = Array(
				'NAME'=>'SITE_CLOSING',
				'CONTROLLER_MEMBER_ID'=>$arMember['ID'],
				'DESCRIPTION'=>($bClose ? GetMessage("CTRLR_MEM_LOG_SITE_CLO") : GetMessage("CTRLR_MEM_LOG_SITE_OPE")),
				'STATUS'=>'Y',
				"TASK_ID"=>$task_id
			);

		$strCommand = 'CControllerClient::SetOptionString("main", "site_stopped", "'.($bClose?'Y':'N').'");';
		$result = CControllerMember::RunCommand($member_id, $strCommand, array(), $task_id, 'run_immediate');
		if($result === false)
		{
			$e = $APPLICATION->GetException();
			if ($e)
				$arControllerLog['DESCRIPTION'] = $e->GetString();
			else
				$arControllerLog['DESCRIPTION'] = 'Unknown error [001]';
			$arControllerLog['STATUS'] = 'N';
		}
		else
		{
			CControllerMember::Update($arMember['ID'], Array('SITE_ACTIVE'=>(!$bClose?'Y':'N')));
		}

		if ($task_id === false)
		{
			CControllerLog::Add($arControllerLog);
		}

		// close event
		CTimeZone::Disable();
		$db_res = CControllerMember::GetByID($arMember["ID"]);
		CTimeZone::Enable();
		if($arFields = $db_res->Fetch())
		{
			foreach (GetModuleEvents("controller", "OnAfterCloseMember", true) as $arEvent)
			{
				ExecuteModuleEventEx($arEvent, array(&$arFields));
			}

			if($bClose)
				CEvent::Send("CONTROLLER_MEMBER_CLOSED", SITE_ID, $arFields);
			else
				CEvent::Send("CONTROLLER_MEMBER_OPENED", SITE_ID, $arFields);
		}

		return $result;
	}

	public static function UnRegister($member_id)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		if(($ar_member = CControllerMember::GetMember($member_id))===false)
			return false;

		$arParameters = Array();
		$oRequest = new CControllerServerRequestTo($ar_member, "unregister", $arParameters);
		$oResponse = $oRequest->Send();

		$arControllerLog = Array(
				'NAME'=>'UNREGISTRATION',
				'CONTROLLER_MEMBER_ID'=>$ar_member['ID'],
				'STATUS'=>'Y',
				'DESCRIPTION'=>GetMessage("CTRLR_MEM_LOG_DISCON"),
			);

		if($oResponse==false)
		{
			$e = $APPLICATION->GetException();
			$arControllerLog['DESCRIPTION'] = $e->GetString();
			$result = false;
		}
		else
		{
			$result = $oResponse->OK();
			$arControllerLog['DESCRIPTION'] = $oResponse->text;
			if($result === false)
			{
				$e = new CApplicationException(GetMessage("CTRLR_MEM_LOG_DISCON_ERR")." ".$oResponse->text);
				$APPLICATION->ThrowException($e);
			}
			else
				CControllerMember::Update($ar_member['ID'], Array('DISCONNECTED'=>'Y'));
		}


		if($result === false)
		{
			$arControllerLog['DESCRIPTION'] = $e->GetString()."\r\n".$arControllerLog['DESCRIPTION'];
			$arControllerLog['STATUS'] = 'N';
		}

		CControllerLog::Add($arControllerLog);

		return $result;
	}

	public static function AddCommand($member_guid, $command, $arAddParams = Array(), $task_id = false)
	{
		global $DB;

		// unique command code
		$command_id = \Bitrix\Main\Security\Random::getString(32);

		$db_id = $DB->Add(
			"b_controller_command",
			array(
				"MEMBER_ID" => $member_guid,
				"COMMAND_ID" => $command_id,
				"TASK_ID" => $task_id,
				"COMMAND" => $command,
				"~DATE_INSERT" => $DB->CurrentTimeFunction(),
				"ADD_PARAMS" => (count($arAddParams)>0?serialize($arAddParams):false)
			),
			array("COMMAND", "ADD_PARAMS"),
			"", true //bIgnoreErrors
		);

		if($db_id > 0)
			return $command_id;
		else
			return false;
	}

	public static function GetMember($id)
	{
		/** @global CMain $APPLICATION */
		global $APPLICATION;

		$dbr_member = CControllerMember::GetById($id);
		$ar_member = $dbr_member->Fetch();
		if(!$ar_member)
		{
			$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR6")." ".htmlspecialcharsex($id));
			$APPLICATION->ThrowException($e);
			return false;
		}

		if($ar_member['DISCONNECTED'] == 'Y')
		{
			$e = new CApplicationException(GetMessage("CTRLR_MEM_ERR7"));
			$APPLICATION->ThrowException($e);
			return false;
		}

		return $ar_member;
	}

	public static function SiteUpdate($member_id)
	{
		return CControllerTask::Add(Array(
			"TASK_ID"=>"UPDATE",
			"CONTROLLER_MEMBER_ID"=>$member_id
		));
	}

	public static function _GoodURL($url)
	{
		$url = strtolower(trim($url, " \t\r\n./"));
		if(substr($url, 0, 7) != "http://" && substr($url, 0, 8) != "https://")
			$url = "http://".$url;
		return $url;
	}
}
?>

Zerion Mini Shell 1.0