%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/main/classes/general/ |
| Current File : //home/bitrix/www/bitrix/modules/main/classes/general/event_log.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage main
* @copyright 2001-2013 Bitrix
*/
IncludeModuleLangFile(__FILE__);
class CEventLog
{
const SEVERITY_SECURITY = 1;
const SEVERITY_ERROR = 2;
const SEVERITY_WARNING = 3;
const SEVERITY_INFO = 4;
const SEVERITY_DEBUG = 5;
public static function Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION = false, $SITE_ID = false)
{
return CEventLog::Add(array(
"SEVERITY" => $SEVERITY,
"AUDIT_TYPE_ID" => $AUDIT_TYPE_ID,
"MODULE_ID" => $MODULE_ID,
"ITEM_ID" => $ITEM_ID,
"DESCRIPTION" => $DESCRIPTION,
"SITE_ID" => $SITE_ID,
));
}
public static function Add($arFields)
{
global $USER, $DB;
static $arSeverity = array(
"SECURITY" => self::SEVERITY_SECURITY,
"ERROR" => self::SEVERITY_ERROR,
"WARNING" => self::SEVERITY_WARNING,
"INFO" => self::SEVERITY_INFO,
"DEBUG" => self::SEVERITY_DEBUG,
);
$url = preg_replace("/(&?sessid=[0-9a-z]+)/", "", $_SERVER["REQUEST_URI"]);
$SITE_ID = defined("ADMIN_SECTION") && ADMIN_SECTION==true ? false : SITE_ID;
$arFields = array(
"SEVERITY" => array_key_exists($arFields["SEVERITY"], $arSeverity)? $arFields["SEVERITY"]: "UNKNOWN",
"AUDIT_TYPE_ID" => strlen($arFields["AUDIT_TYPE_ID"]) <= 0? "UNKNOWN": $arFields["AUDIT_TYPE_ID"],
"MODULE_ID" => strlen($arFields["MODULE_ID"]) <= 0? "UNKNOWN": $arFields["MODULE_ID"],
"ITEM_ID" => strlen($arFields["ITEM_ID"]) <= 0? "UNKNOWN": $arFields["ITEM_ID"],
"REMOTE_ADDR" => $_SERVER["REMOTE_ADDR"],
"USER_AGENT" => $_SERVER["HTTP_USER_AGENT"],
"REQUEST_URI" => $url,
"SITE_ID" => strlen($arFields["SITE_ID"]) <= 0 ? $SITE_ID : $arFields["SITE_ID"],
"USER_ID" => is_object($USER) && ($USER->GetID() > 0)? $USER->GetID(): false,
"GUEST_ID" => (isset($_SESSION) && array_key_exists("SESS_GUEST_ID", $_SESSION) && $_SESSION["SESS_GUEST_ID"] > 0? $_SESSION["SESS_GUEST_ID"]: false),
"DESCRIPTION" => $arFields["DESCRIPTION"],
"~TIMESTAMP_X" => $DB->GetNowFunction(),
);
return $DB->Add("b_event_log", $arFields, array("DESCRIPTION"), "", false, "", array("ignore_dml"=>true));
}
//Agent
public static function CleanUpAgent()
{
global $DB;
$cleanup_days = COption::GetOptionInt("main", "event_log_cleanup_days", 7);
if($cleanup_days > 0)
{
$arDate = localtime(time());
$date = mktime(0, 0, 0, $arDate[4]+1, $arDate[3]-$cleanup_days, 1900+$arDate[5]);
$DB->Query("DELETE FROM b_event_log WHERE TIMESTAMP_X <= ".$DB->CharToDateFunction(ConvertTimeStamp($date, "FULL")));
}
return "CEventLog::CleanUpAgent();";
}
public static function GetList($arOrder = Array("ID" => "DESC"), $arFilter = array(), $arNavParams = false)
{
global $DB;
$err_mess = "FILE: ".__FILE__."<br>LINE: ";
$arSqlSearch = array();
$arSqlOrder = array();
$arFields = array("ID", "TIMESTAMP_X", "AUDIT_TYPE_ID", "MODULE_ID", "SEVERITY", "ITEM_ID", "SITE_ID", "REMOTE_ADDR", "USER_AGENT", "REQUEST_URI", "USER_ID", "GUEST_ID");
$arOFields = array(
"ID" => "L.ID",
"TIMESTAMP_X" => "L.TIMESTAMP_X",
);
foreach($arFilter as $key => $val)
{
if(is_array($val))
{
if(count($val) <= 0)
continue;
}
elseif(strlen($val) <= 0)
{
continue;
}
$key = strtoupper($key);
switch($key)
{
case "ID":
$arSqlSearch[] = "L.ID=".IntVal($val);
break;
case "TIMESTAMP_X_1":
$arSqlSearch[] = "L.TIMESTAMP_X >= ".$DB->CharToDateFunction($DB->ForSql($val), "FULL");
break;
case "TIMESTAMP_X_2":
$arSqlSearch[] = "L.TIMESTAMP_X <= ".$DB->CharToDateFunction($DB->ForSql($val), "FULL");
break;
case "=AUDIT_TYPE_ID":
$arValues = array();
if(is_array($val))
{
foreach($val as $value)
{
$value = trim($value);
if(strlen($value))
$arValues[$value] = $DB->ForSQL($value);
}
}
elseif(is_string($val))
{
$value = trim($val);
if(strlen($value))
$arValues[$value] = $DB->ForSQL($value);
}
if(!empty($arValues))
$arSqlSearch[] = "L.AUDIT_TYPE_ID in ('".implode("', '", $arValues)."')";
break;
case "=MODULE_ITEM":
if(is_array($val))
{
$arSqlSearch2 = array();
foreach($val as $value)
{
$arSqlSearchTmp = array();
foreach($value as $item2 => $value2)
{
if (in_array($item2, $arFields))
$arSqlSearchTmp[] = "L.".$item2." = '".$DB->ForSQL($value2)."'";
}
if(count($arSqlSearchTmp) > 0)
$arSqlSearch2[] = implode(" AND ", $arSqlSearchTmp);
}
if(count($arSqlSearch2) > 0)
$arSqlSearch[] = "(".implode(" OR ", $arSqlSearch2).")";
}
break;
case "SEVERITY":
case "AUDIT_TYPE_ID":
case "MODULE_ID":
case "ITEM_ID":
case "SITE_ID":
case "REMOTE_ADDR":
case "USER_AGENT":
case "REQUEST_URI":
$arSqlSearch[] = GetFilterQuery("L.".$key, $val);
break;
case "USER_ID":
case "GUEST_ID":
$arSqlSearch[] = "L.".$key." = ".intval($val)."";
break;
}
}
foreach($arOrder as $by => $order)
{
$by = strtoupper($by);
$order = strtoupper($order);
if (array_key_exists($by, $arOFields))
{
if ($order != "ASC")
$order = "DESC".($DB->type=="ORACLE" ? " NULLS LAST" : "");
else
$order = "ASC".($DB->type=="ORACLE" ? " NULLS FIRST" : "");
$arSqlOrder[$by] = $arOFields[$by]." ".$order;
}
}
$strSql = "
FROM
b_event_log L
";
if(!empty($arSqlSearch))
$strSql .= " WHERE ".implode(" AND ", $arSqlSearch);
if(is_array($arNavParams))
{
$res_cnt = $DB->Query("SELECT count(1) C".$strSql);
$res_cnt = $res_cnt->Fetch();
$cnt = $res_cnt["C"];
if(!empty($arSqlOrder))
$strSql .= " ORDER BY ".implode(", ", $arSqlOrder);
$res = new CDBResult();
$res->NavQuery("
SELECT
ID
,".$DB->DateToCharFunction("L.TIMESTAMP_X")." as TIMESTAMP_X
,SEVERITY
,AUDIT_TYPE_ID
,MODULE_ID
,ITEM_ID
,REMOTE_ADDR
,USER_AGENT
,REQUEST_URI
,SITE_ID
,USER_ID
,GUEST_ID
,DESCRIPTION
".$strSql, $cnt, $arNavParams);
return $res;
}
else
{
if(!empty($arSqlOrder))
$strSql .= " ORDER BY ".implode(", ", $arSqlOrder);
return $DB->Query("SELECT L.*, ".$DB->DateToCharFunction("L.TIMESTAMP_X")." as TIMESTAMP_X".$strSql, false, $err_mess.__LINE__);
}
}
}
class CEventMain
{
public static function MakeMainObject()
{
$obj = new CEventMain;
return $obj;
}
public static function GetFilter()
{
$arFilter = array();
if(COption::GetOptionString("main", "event_log_register", "N") === "Y" || COption::GetOptionString("main", "event_log_user_delete", "N") === "Y" || COption::GetOptionString("main", "event_log_user_edit", "N") === "Y" || COption::GetOptionString("main", "event_log_user_groups", "N") === "Y")
{
$arFilter["USERS"] = GetMessage("LOG_TYPE_USERS");
}
return $arFilter;
}
public static function GetAuditTypes()
{
return array(
"USER_REGISTER" => "[USER_REGISTER] ".GetMessage("LOG_TYPE_NEW_USERS"),
"USER_DELETE" => "[USER_DELETE] ".GetMessage("LOG_TYPE_USER_DELETE"),
"USER_EDIT" => "[USER_EDIT] ".GetMessage("LOG_TYPE_USER_EDIT"),
"USER_GROUP_CHANGED" => "[USER_GROUP_CHANGED] ".GetMessage("LOG_TYPE_USER_GROUP_CHANGED"),
"BACKUP_ERROR" => "[BACKUP_ERROR] ".GetMessage("LOG_TYPE_BACKUP_ERROR"),
"BACKUP_SUCCESS" => "[BACKUP_SUCCESS] ".GetMessage("LOG_TYPE_BACKUP_SUCCESS"),
"SITE_CHECKER_SUCCESS" => "[SITE_CHECKER_SUCCESS] ".GetMessage("LOG_TYPE_SITE_CHECK_SUCCESS"),
"SITE_CHECKER_ERROR" => "[SITE_CHECKER_ERROR] ".GetMessage("LOG_TYPE_SITE_CHECK_ERROR"),
);
}
public static function GetEventInfo($row, $arParams)
{
$DESCRIPTION = unserialize($row["DESCRIPTION"]);
$userURL = $EventPrint = "";
$rsUser = CUser::GetByID($row['ITEM_ID']);
if($arUser = $rsUser->GetNext())
$userURL = SITE_DIR.CComponentEngine::MakePathFromTemplate($arParams['USER_PATH'], array("user_id" => $row['ITEM_ID'], "SITE_ID" => ""));
$EventName = $DESCRIPTION["user"];
switch($row['AUDIT_TYPE_ID'])
{
case "USER_REGISTER":
$EventPrint = GetMessage("LOG_USER_REGISTER");
break;
case "USER_DELETE":
$EventPrint = GetMessage("LOG_USER_DELETE");
break;
case "USER_EDIT":
$EventPrint = GetMessage("LOG_USER_EDIT");
break;
case "USER_GROUP_CHANGED":
$EventPrint = GetMessage("LOG_USER_GROUP_CHANGED");
break;
}
return array(
"eventType" => $EventPrint,
"eventName" => $EventName,
"eventURL" => $userURL,
);
}
public static function GetFilterSQL($var)
{
$ar[] = array("AUDIT_TYPE_ID" => "USER_REGISTER");
$ar[] = array("AUDIT_TYPE_ID" => "USER_DELETE");
$ar[] = array("AUDIT_TYPE_ID" => "USER_EDIT");
$ar[] = array("AUDIT_TYPE_ID" => "USER_GROUP_CHANGED");
return $ar;
}
}