PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/concrete/controllers/single_page/dashboard/reports/logs.php

http://github.com/concrete5/concrete5
PHP | 212 lines | 177 code | 34 blank | 1 comment | 37 complexity | c033d6f2901c9d5563a861917bdd68e2 MD5 | raw file
Possible License(s): MIT, LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. <?php
  2. namespace Concrete\Controller\SinglePage\Dashboard\Reports;
  3. use Concrete\Core\Logging\Channels;
  4. use Concrete\Core\Logging\Handler\DatabaseHandler;
  5. use Concrete\Core\Logging\Levels;
  6. use Concrete\Core\Logging\LogEntry;
  7. use Concrete\Core\Logging\LogList;
  8. use Concrete\Core\Page\Controller\DashboardPageController;
  9. use Concrete\Core\Page\Page;
  10. use Concrete\Core\Permission\Checker;
  11. use Concrete\Core\Url\Resolver\Manager\ResolverManagerInterface;
  12. use Concrete\Core\User\User;
  13. use Log;
  14. use Request;
  15. class Logs extends DashboardPageController
  16. {
  17. protected function isReportEnabled()
  18. {
  19. $config = $this->app->make('config');
  20. $enabled = $config->get('concrete.log.enable_dashboard_report');
  21. return $enabled;
  22. }
  23. public function clear($token = '', $channel = false)
  24. {
  25. if ($this->isReportEnabled()) {
  26. $valt = $this->app->make('helper/validation/token');
  27. if ($valt->validate('', $token)) {
  28. if (!$channel) {
  29. DatabaseHandler::clearAll();
  30. } else {
  31. DatabaseHandler::clearByChannel($channel);
  32. }
  33. $this->redirect('/dashboard/reports/logs');
  34. } else {
  35. $this->redirect('/dashboard/reports/logs');
  36. }
  37. }
  38. $this->view();
  39. }
  40. public function view($page = 0)
  41. {
  42. $this->set('isReportEnabled', $this->isReportEnabled());
  43. $this->requireAsset('selectize');
  44. $levels = [];
  45. foreach (Log::getLevels() as $level) {
  46. $levels[$level] = Levels::getLevelDisplayName($level);
  47. }
  48. $channels = ['' => t('All Channels')];
  49. foreach (Channels::getChannels() as $channel) {
  50. $channels[$channel] = Channels::getChannelDisplayName($channel);
  51. }
  52. $r = Request::getInstance();
  53. $wdt = $this->app->make('helper/form/date_time');
  54. $date_from = $wdt->translate('date_from', $r->query->all());
  55. $date_to = $wdt->translate('date_to', $r->query->all());
  56. $query = http_build_query([
  57. 'channel' => $r->query->get('channel'),
  58. 'keywords' => $r->query->get('keywords'),
  59. 'level' => $r->query->get('level'),
  60. 'date_from' => $date_from,
  61. 'date_to' => $date_to,
  62. ]);
  63. $list = $this->getFilteredList();
  64. $entries = $list->getPage();
  65. $this->set('list', $list);
  66. $this->set('entries', $entries);
  67. $this->set('levels', $levels);
  68. $this->set('channels', $channels);
  69. $this->set('wdt', $wdt);
  70. $this->set('date_from', $date_from);
  71. $this->set('date_to', $date_to);
  72. $this->set('query', $query);
  73. $settingsPage = Page::getByPath('/dashboard/system/environment/logging');
  74. $settingsPagePermissions = $settingsPage && !$settingsPage->isError() ? new Checker($settingsPage) : null;
  75. if ($settingsPagePermissions !== null && $settingsPagePermissions->canViewPage()) {
  76. $this->set('settingsPage', (string) $this->app->make(ResolverManagerInterface::class)->resolve([$settingsPage]));
  77. } else {
  78. $this->set('settingsPage', null);
  79. }
  80. }
  81. public function csv($token = '')
  82. {
  83. if ($this->isReportEnabled()) {
  84. $valt = $this->app->make('helper/validation/token');
  85. if (!$valt->validate('', $token)) {
  86. $this->redirect('/dashboard/reports/logs');
  87. } else {
  88. $list = $this->getFilteredList();
  89. $entries = $list->get(0);
  90. $fileName = 'Log Search Results';
  91. header('Content-Type: text/csv');
  92. header('Cache-control: private');
  93. header('Pragma: public');
  94. $date = date('Ymd');
  95. header('Content-Disposition: attachment; filename=' . $fileName . "_form_data_{$date}.csv");
  96. $fp = fopen('php://output', 'w');
  97. // write the columns
  98. $row = [
  99. t('Date'),
  100. t('Level'),
  101. t('Channel'),
  102. t('User'),
  103. t('Message'),
  104. ];
  105. fputcsv($fp, $row);
  106. foreach ($entries as $ent) {
  107. $uID = $ent->getUserID();
  108. if (empty($uID)) {
  109. $user = t('Guest');
  110. } else {
  111. $u = User::getByUserID($uID);
  112. if (is_object($u)) {
  113. $user = $u->getUserName();
  114. } else {
  115. $user = tc('Deleted user', 'Deleted (id: %s)', $uID);
  116. }
  117. }
  118. $row = [
  119. $ent->getDisplayTimestamp(),
  120. $ent->getLevelName(),
  121. $ent->getChannelDisplayName(),
  122. $user,
  123. $ent->getMessage(),
  124. ];
  125. fputcsv($fp, $row);
  126. }
  127. fclose($fp);
  128. die;
  129. }
  130. }
  131. $this->view();
  132. }
  133. protected function getFilteredList()
  134. {
  135. $list = new LogList();
  136. $r = Request::getInstance();
  137. if ($r->query->has('channel') && $r->query->get('channel') != '') {
  138. $list->filterByChannel($r->query->get('channel'));
  139. $this->set('selectedChannel', h($r->query->get('channel')));
  140. }
  141. if ($r->query->has('level')) {
  142. $selectedlevels = $r->get('level');
  143. if (is_array($selectedlevels) && count($selectedlevels) != 8) {
  144. $list->filterByLevels($selectedlevels);
  145. }
  146. }
  147. if ($r->query->has('keywords') && $r->query->get('keywords') != '') {
  148. $list->filterByKeywords($r->query->get('keywords'));
  149. }
  150. $wdt = $this->app->make('helper/form/date_time');
  151. $date_from = $wdt->translate('date_from', $r->query->all());
  152. $date_to = $wdt->translate('date_to', $r->query->all());
  153. $date = $this->app->make('date');
  154. if ($date_from != '' && $date->toDB($date_from) !== false) {
  155. $list->filterByTime(strtotime($date_from), '>=');
  156. }
  157. if ($date_to != '' && $date->toDB($date_to) !== false) {
  158. $list->filterByTime(strtotime($date_to), '<=');
  159. }
  160. return $list;
  161. }
  162. public function deleteLog($logID, $token = '')
  163. {
  164. if ($this->isReportEnabled()) {
  165. $valt = $this->app->make('helper/validation/token');
  166. if ($valt->validate('', $token) && !empty($logID)) {
  167. $log = LogEntry::getByID($logID);
  168. if (is_object($log)) {
  169. $log->delete();
  170. }
  171. $this->redirect('/dashboard/reports/logs');
  172. } else {
  173. $this->redirect('/dashboard/reports/logs');
  174. }
  175. $this->view();
  176. }
  177. }
  178. }