PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/main/classes/general/event_log.php

https://gitlab.com/alexprowars/bitrix
PHP | 354 lines | 314 code | 33 blank | 7 comment | 34 complexity | 09ac6a50d4a293a318ff0595e5244997 MD5 | raw file
  1. <?php
  2. /**
  3. * Bitrix Framework
  4. * @package bitrix
  5. * @subpackage main
  6. * @copyright 2001-2013 Bitrix
  7. */
  8. IncludeModuleLangFile(__FILE__);
  9. class CEventLog
  10. {
  11. const SEVERITY_SECURITY = 1;
  12. const SEVERITY_ERROR = 2;
  13. const SEVERITY_WARNING = 3;
  14. const SEVERITY_INFO = 4;
  15. const SEVERITY_DEBUG = 5;
  16. public static function Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION = false, $SITE_ID = false)
  17. {
  18. return CEventLog::Add(array(
  19. "SEVERITY" => $SEVERITY,
  20. "AUDIT_TYPE_ID" => $AUDIT_TYPE_ID,
  21. "MODULE_ID" => $MODULE_ID,
  22. "ITEM_ID" => $ITEM_ID,
  23. "DESCRIPTION" => $DESCRIPTION,
  24. "SITE_ID" => $SITE_ID,
  25. ));
  26. }
  27. public static function Add($arFields)
  28. {
  29. global $USER, $DB;
  30. static $arSeverity = array(
  31. "SECURITY" => self::SEVERITY_SECURITY,
  32. "ERROR" => self::SEVERITY_ERROR,
  33. "WARNING" => self::SEVERITY_WARNING,
  34. "INFO" => self::SEVERITY_INFO,
  35. "DEBUG" => self::SEVERITY_DEBUG,
  36. );
  37. $url = preg_replace("/(&?sessid=[0-9a-z]+)/", "", $_SERVER["REQUEST_URI"]);
  38. $SITE_ID = defined("ADMIN_SECTION") && ADMIN_SECTION==true ? false : SITE_ID;
  39. $session = \Bitrix\Main\Application::getInstance()->getSession();
  40. $arFields = array(
  41. "SEVERITY" => array_key_exists($arFields["SEVERITY"], $arSeverity)? $arFields["SEVERITY"]: "UNKNOWN",
  42. "AUDIT_TYPE_ID" => $arFields["AUDIT_TYPE_ID"] == ''? "UNKNOWN": $arFields["AUDIT_TYPE_ID"],
  43. "MODULE_ID" => $arFields["MODULE_ID"] == ''? "UNKNOWN": $arFields["MODULE_ID"],
  44. "ITEM_ID" => $arFields["ITEM_ID"] == ''? "UNKNOWN": $arFields["ITEM_ID"],
  45. "REMOTE_ADDR" => $_SERVER["REMOTE_ADDR"],
  46. "USER_AGENT" => $_SERVER["HTTP_USER_AGENT"],
  47. "REQUEST_URI" => $url,
  48. "SITE_ID" => $arFields["SITE_ID"] == '' ? $SITE_ID : $arFields["SITE_ID"],
  49. "USER_ID" => is_object($USER) && ($USER->GetID() > 0)? $USER->GetID(): false,
  50. "GUEST_ID" => ($session->isStarted() && $session->has("SESS_GUEST_ID") && $session["SESS_GUEST_ID"] > 0? $session["SESS_GUEST_ID"]: false),
  51. "DESCRIPTION" => $arFields["DESCRIPTION"],
  52. "~TIMESTAMP_X" => $DB->GetNowFunction(),
  53. );
  54. return $DB->Add("b_event_log", $arFields, array("DESCRIPTION"), "", false, "", array("ignore_dml"=>true));
  55. }
  56. //Agent
  57. public static function CleanUpAgent()
  58. {
  59. global $DB;
  60. $cleanup_days = COption::GetOptionInt("main", "event_log_cleanup_days", 7);
  61. if($cleanup_days > 0)
  62. {
  63. $arDate = localtime(time());
  64. $date = mktime(0, 0, 0, $arDate[4]+1, $arDate[3]-$cleanup_days, 1900+$arDate[5]);
  65. $DB->Query("DELETE FROM b_event_log WHERE TIMESTAMP_X <= ".$DB->CharToDateFunction(ConvertTimeStamp($date, "FULL")));
  66. }
  67. $historyCleanupDays = (int)COption::GetOptionInt("main", "profile_history_cleanup_days", 0);
  68. if($historyCleanupDays > 0)
  69. {
  70. $date = new \Bitrix\Main\Type\Date();
  71. $date->add("-{$historyCleanupDays}D");
  72. \Bitrix\Main\UserProfileHistoryTable::deleteByFilter(["<DATE_INSERT" => $date]);
  73. }
  74. return "CEventLog::CleanUpAgent();";
  75. }
  76. public static function GetList($arOrder = Array("ID" => "DESC"), $arFilter = array(), $arNavParams = false)
  77. {
  78. global $DB;
  79. $err_mess = "FILE: ".__FILE__."<br>LINE: ";
  80. $arSqlSearch = array();
  81. $arSqlOrder = array();
  82. $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");
  83. $arOFields = array(
  84. "ID" => "L.ID",
  85. "TIMESTAMP_X" => "L.TIMESTAMP_X",
  86. );
  87. foreach($arFilter as $key => $val)
  88. {
  89. if(is_array($val))
  90. {
  91. if(count($val) <= 0)
  92. continue;
  93. }
  94. elseif((string)$val == '')
  95. {
  96. continue;
  97. }
  98. $key = mb_strtoupper($key);
  99. switch($key)
  100. {
  101. case "ID":
  102. $arSqlSearch[] = "L.ID=".intval($val);
  103. break;
  104. case "TIMESTAMP_X_1":
  105. $arSqlSearch[] = "L.TIMESTAMP_X >= ".$DB->CharToDateFunction($DB->ForSql($val), "FULL");
  106. break;
  107. case "TIMESTAMP_X_2":
  108. $arSqlSearch[] = "L.TIMESTAMP_X <= ".$DB->CharToDateFunction($DB->ForSql($val), "FULL");
  109. break;
  110. case "=AUDIT_TYPE_ID":
  111. $arValues = array();
  112. if(is_array($val))
  113. {
  114. foreach($val as $value)
  115. {
  116. $value = trim($value);
  117. if($value <> '')
  118. {
  119. $arValues[$value] = $DB->ForSQL($value);
  120. }
  121. }
  122. }
  123. elseif(is_string($val))
  124. {
  125. $value = trim($val);
  126. if($value <> '')
  127. {
  128. $arValues[$value] = $DB->ForSQL($value);
  129. }
  130. }
  131. if(!empty($arValues))
  132. $arSqlSearch[] = "L.AUDIT_TYPE_ID in ('".implode("', '", $arValues)."')";
  133. break;
  134. case "=MODULE_ITEM":
  135. if(is_array($val))
  136. {
  137. $arSqlSearch2 = array();
  138. foreach($val as $value)
  139. {
  140. $arSqlSearchTmp = array();
  141. foreach($value as $item2 => $value2)
  142. {
  143. if (in_array($item2, $arFields))
  144. $arSqlSearchTmp[] = "L.".$item2." = '".$DB->ForSQL($value2)."'";
  145. }
  146. if(count($arSqlSearchTmp) > 0)
  147. $arSqlSearch2[] = implode(" AND ", $arSqlSearchTmp);
  148. }
  149. if(count($arSqlSearch2) > 0)
  150. $arSqlSearch[] = "(".implode(" OR ", $arSqlSearch2).")";
  151. }
  152. break;
  153. case "SEVERITY":
  154. case "AUDIT_TYPE_ID":
  155. case "MODULE_ID":
  156. case "ITEM_ID":
  157. case "SITE_ID":
  158. case "REMOTE_ADDR":
  159. case "USER_AGENT":
  160. case "REQUEST_URI":
  161. $arSqlSearch[] = GetFilterQuery("L.".$key, $val);
  162. break;
  163. case "USER_ID":
  164. case "GUEST_ID":
  165. $arSqlSearch[] = "L.".$key." = ".intval($val)."";
  166. break;
  167. }
  168. }
  169. foreach($arOrder as $by => $order)
  170. {
  171. $by = mb_strtoupper($by);
  172. $order = mb_strtoupper($order);
  173. if (array_key_exists($by, $arOFields))
  174. {
  175. if ($order != "ASC")
  176. $order = "DESC";
  177. else
  178. $order = "ASC";
  179. $arSqlOrder[$by] = $arOFields[$by]." ".$order;
  180. }
  181. }
  182. $strSql = "
  183. FROM
  184. b_event_log L
  185. ";
  186. if(!empty($arSqlSearch))
  187. $strSql .= " WHERE ".implode(" AND ", $arSqlSearch);
  188. if(is_array($arNavParams))
  189. {
  190. $res_cnt = $DB->Query("SELECT count(1) C".$strSql);
  191. $res_cnt = $res_cnt->Fetch();
  192. $cnt = $res_cnt["C"];
  193. if(!empty($arSqlOrder))
  194. $strSql .= " ORDER BY ".implode(", ", $arSqlOrder);
  195. $res = new CDBResult();
  196. $res->NavQuery("
  197. SELECT
  198. ID
  199. ,".$DB->DateToCharFunction("L.TIMESTAMP_X")." as TIMESTAMP_X
  200. ,SEVERITY
  201. ,AUDIT_TYPE_ID
  202. ,MODULE_ID
  203. ,ITEM_ID
  204. ,REMOTE_ADDR
  205. ,USER_AGENT
  206. ,REQUEST_URI
  207. ,SITE_ID
  208. ,USER_ID
  209. ,GUEST_ID
  210. ,DESCRIPTION
  211. ".$strSql, $cnt, $arNavParams);
  212. return $res;
  213. }
  214. else
  215. {
  216. if(!empty($arSqlOrder))
  217. $strSql .= " ORDER BY ".implode(", ", $arSqlOrder);
  218. return $DB->Query("SELECT L.*, ".$DB->DateToCharFunction("L.TIMESTAMP_X")." as TIMESTAMP_X".$strSql, false, $err_mess.__LINE__);
  219. }
  220. }
  221. public static function GetEventTypes()
  222. {
  223. $arAuditTypes = array(
  224. "USER_AUTHORIZE" => "[USER_AUTHORIZE] ".GetMessage("MAIN_EVENTLOG_USER_AUTHORIZE"),
  225. "USER_DELETE" => "[USER_DELETE] ".GetMessage("MAIN_EVENTLOG_USER_DELETE"),
  226. "USER_INFO" => "[USER_INFO] ".GetMessage("MAIN_EVENTLOG_USER_INFO"),
  227. "USER_LOGIN" => "[USER_LOGIN] ".GetMessage("MAIN_EVENTLOG_USER_LOGIN"),
  228. "USER_LOGINBYHASH" => "[USER_LOGINBYHASH] ".GetMessage("MAIN_EVENTLOG_USER_LOGINBYHASH_FAILED"),
  229. "USER_LOGOUT" => "[USER_LOGOUT] ".GetMessage("MAIN_EVENTLOG_USER_LOGOUT"),
  230. "USER_PASSWORD_CHANGED" => "[USER_PASSWORD_CHANGED] ".GetMessage("MAIN_EVENTLOG_USER_PASSWORD_CHANGED"),
  231. "USER_BLOCKED" => "[USER_BLOCKED] ".GetMessage("MAIN_EVENTLOG_USER_BLOCKED"),
  232. "USER_PERMISSIONS_FAIL" => "[USER_PERMISSIONS_FAIL] ".GetMessage("MAIN_EVENTLOG_USER_PERMISSIONS_FAIL"),
  233. "USER_REGISTER" => "[USER_REGISTER] ".GetMessage("MAIN_EVENTLOG_USER_REGISTER"),
  234. "USER_REGISTER_FAIL" => "[USER_REGISTER_FAIL] ".GetMessage("MAIN_EVENTLOG_USER_REGISTER_FAIL"),
  235. "USER_GROUP_CHANGED" => "[USER_GROUP_CHANGED] ".GetMessage("MAIN_EVENTLOG_GROUP"),
  236. "GROUP_POLICY_CHANGED" => "[GROUP_POLICY_CHANGED] ".GetMessage("MAIN_EVENTLOG_GROUP_POLICY"),
  237. "MODULE_RIGHTS_CHANGED" => "[MODULE_RIGHTS_CHANGED] ".GetMessage("MAIN_EVENTLOG_MODULE"),
  238. "FILE_PERMISSION_CHANGED" => "[FILE_PERMISSION_CHANGED] ".GetMessage("MAIN_EVENTLOG_FILE"),
  239. "TASK_CHANGED" => "[TASK_CHANGED] ".GetMessage("MAIN_EVENTLOG_TASK"),
  240. "MP_MODULE_INSTALLED" => "[MP_MODULE_INSTALLED] ".GetMessage("MAIN_EVENTLOG_MP_MODULE_INSTALLED"),
  241. "MP_MODULE_UNINSTALLED" => "[MP_MODULE_UNINSTALLED] ".GetMessage("MAIN_EVENTLOG_MP_MODULE_UNINSTALLED"),
  242. "MP_MODULE_DELETED" => "[MP_MODULE_DELETED] ".GetMessage("MAIN_EVENTLOG_MP_MODULE_DELETED"),
  243. "MP_MODULE_DOWNLOADED" => "[MP_MODULE_DOWNLOADED] ".GetMessage("MAIN_EVENTLOG_MP_MODULE_DOWNLOADED"),
  244. );
  245. foreach(GetModuleEvents("main", "OnEventLogGetAuditTypes", true) as $arEvent)
  246. {
  247. $ar = ExecuteModuleEventEx($arEvent);
  248. if(is_array($ar))
  249. $arAuditTypes = array_merge($ar, $arAuditTypes);
  250. }
  251. ksort($arAuditTypes);
  252. return $arAuditTypes;
  253. }
  254. }
  255. class CEventMain
  256. {
  257. public static function MakeMainObject()
  258. {
  259. $obj = new CEventMain;
  260. return $obj;
  261. }
  262. public static function GetFilter()
  263. {
  264. $arFilter = array();
  265. 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")
  266. {
  267. $arFilter["USERS"] = GetMessage("LOG_TYPE_USERS");
  268. }
  269. return $arFilter;
  270. }
  271. public static function GetAuditTypes()
  272. {
  273. return array(
  274. "USER_REGISTER" => "[USER_REGISTER] ".GetMessage("LOG_TYPE_NEW_USERS"),
  275. "USER_DELETE" => "[USER_DELETE] ".GetMessage("LOG_TYPE_USER_DELETE"),
  276. "USER_EDIT" => "[USER_EDIT] ".GetMessage("LOG_TYPE_USER_EDIT"),
  277. "USER_GROUP_CHANGED" => "[USER_GROUP_CHANGED] ".GetMessage("LOG_TYPE_USER_GROUP_CHANGED"),
  278. "BACKUP_ERROR" => "[BACKUP_ERROR] ".GetMessage("LOG_TYPE_BACKUP_ERROR"),
  279. "BACKUP_SUCCESS" => "[BACKUP_SUCCESS] ".GetMessage("LOG_TYPE_BACKUP_SUCCESS"),
  280. "SITE_CHECKER_SUCCESS" => "[SITE_CHECKER_SUCCESS] ".GetMessage("LOG_TYPE_SITE_CHECK_SUCCESS"),
  281. "SITE_CHECKER_ERROR" => "[SITE_CHECKER_ERROR] ".GetMessage("LOG_TYPE_SITE_CHECK_ERROR"),
  282. );
  283. }
  284. public static function GetEventInfo($row, $arParams)
  285. {
  286. $DESCRIPTION = unserialize($row["DESCRIPTION"], ['allowed_classes' => false]);
  287. $userURL = $EventPrint = "";
  288. $rsUser = CUser::GetByID($row['ITEM_ID']);
  289. if($arUser = $rsUser->GetNext())
  290. $userURL = SITE_DIR.CComponentEngine::MakePathFromTemplate($arParams['USER_PATH'], array("user_id" => $row['ITEM_ID'], "SITE_ID" => ""));
  291. $EventName = $DESCRIPTION["user"];
  292. switch($row['AUDIT_TYPE_ID'])
  293. {
  294. case "USER_REGISTER":
  295. $EventPrint = GetMessage("LOG_USER_REGISTER");
  296. break;
  297. case "USER_DELETE":
  298. $EventPrint = GetMessage("LOG_USER_DELETE");
  299. break;
  300. case "USER_EDIT":
  301. $EventPrint = GetMessage("LOG_USER_EDIT");
  302. break;
  303. case "USER_GROUP_CHANGED":
  304. $EventPrint = GetMessage("LOG_USER_GROUP_CHANGED");
  305. break;
  306. }
  307. return array(
  308. "eventType" => $EventPrint,
  309. "eventName" => $EventName,
  310. "eventURL" => $userURL,
  311. );
  312. }
  313. public static function GetFilterSQL($var)
  314. {
  315. $ar[] = array("AUDIT_TYPE_ID" => "USER_REGISTER");
  316. $ar[] = array("AUDIT_TYPE_ID" => "USER_DELETE");
  317. $ar[] = array("AUDIT_TYPE_ID" => "USER_EDIT");
  318. $ar[] = array("AUDIT_TYPE_ID" => "USER_GROUP_CHANGED");
  319. return $ar;
  320. }
  321. }