summaryrefslogtreecommitdiff
path: root/classes/pref/system.php
blob: bc3bde16f6eee3b0767dcfa64487d408bfe8d565 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<?php

class Pref_System extends Handler_Protected {

	private $log_page_limit = 15;

	function before($method) {
		if (parent::before($method)) {
			if ($_SESSION["access_level"] < 10) {
				print __("Your access level is insufficient to open this tab.");
				return false;
			}
			return true;
		}
		return false;
	}

	function csrf_ignore($method) {
		$csrf_ignored = array("index");

		return array_search($method, $csrf_ignored) !== false;
	}

	function clearLog() {
		$this->pdo->query("DELETE FROM ttrss_error_log");
	}

	private function log_viewer(int $page, int $severity) {
		$errno_values = [];

		switch ($severity) {
			case E_USER_ERROR:
				$errno_values = [ E_ERROR, E_USER_ERROR, E_PARSE ];
				break;
			case E_USER_WARNING:
				$errno_values = [ E_ERROR, E_USER_ERROR, E_PARSE, E_WARNING, E_USER_WARNING, E_DEPRECATED, E_USER_DEPRECATED ];
				break;
		}

		if (count($errno_values) > 0) {
			$errno_qmarks = arr_qmarks($errno_values);
			$errno_filter_qpart = "errno IN ($errno_qmarks)";
		} else {
			$errno_filter_qpart = "true";
		}

		$limit = $this->log_page_limit;
		$offset = $limit * $page;

		$sth = $this->pdo->prepare("SELECT
				COUNT(id) AS total_pages
			FROM
				ttrss_error_log
			WHERE
				$errno_filter_qpart");

		$sth->execute($errno_values);

		if ($res = $sth->fetch()) {
			$total_pages = (int)($res["total_pages"] / $limit);
		} else {
			$total_pages = 0;
		}

		print "<div dojoType='dijit.layout.BorderContainer' gutters='false'>";

		print "<div region='top' dojoType='fox.Toolbar'>";

		print "<button dojoType='dijit.form.Button'
			onclick='Helpers.EventLog.refresh()'>".__('Refresh')."</button>";

		print "<button dojoType='dijit.form.Button'
			onclick='Helpers.EventLog.prevPage()'>".__('&lt;&lt;')."</button>";

		print "<button dojoType='dijit.form.Button' disabled>".T_sprintf('Page %d of %d', $page+1, $total_pages+1)."</button>";

		$next_page_disabled = $page >= $total_pages ? "disabled" : "";

		print "<button dojoType='dijit.form.Button' $next_page_disabled
			onclick='Helpers.EventLog.nextPage()'>".__('&gt;&gt;')."</button>";

		print "<button dojoType='dijit.form.Button'
			onclick='Helpers.EventLog.clear()'>".__('Clear')."</button>";

		print "<div class='pull-right'>";

		print __("Severity:") . " ";
		print_select_hash("severity", $severity,
			[
				E_USER_ERROR => __("Errors"),
				E_USER_WARNING => __("Warnings"),
				E_USER_NOTICE => __("Everything")
			], 'dojoType="fox.form.Select" onchange="Helpers.EventLog.refresh()"');

		print "</div>"; # pull-right

		print "</div>"; # toolbar

		print '<div style="padding : 0px" dojoType="dijit.layout.ContentPane" region="center">';

		print "<table width='100%' class='event-log'>";

		print "<tr class='title'>
			<td width='5%'>".__("Error")."</td>
			<td>".__("Filename")."</td>
			<td>".__("Message")."</td>
			<td width='5%'>".__("User")."</td>
			<td width='5%'>".__("Date")."</td>
			</tr>";

		$sth = $this->pdo->prepare("SELECT
				errno, errstr, filename, lineno, created_at, login, context
			FROM
				ttrss_error_log LEFT JOIN ttrss_users ON (owner_uid = ttrss_users.id)
			WHERE
				$errno_filter_qpart
			ORDER BY
				ttrss_error_log.id DESC
			LIMIT $limit OFFSET $offset");

		$sth->execute($errno_values);

		while ($line = $sth->fetch()) {
			print "<tr>";

			foreach ($line as $k => $v) {
				$line[$k] = htmlspecialchars($v);
			}

			print "<td class='errno'>" . Logger::$errornames[$line["errno"]] . " (" . $line["errno"] . ")</td>";
			print "<td class='filename'>" . $line["filename"] . ":" . $line["lineno"] . "</td>";
			print "<td class='errstr'>" . $line["errstr"] . "\n" .  $line["context"] . "</td>";
			print "<td class='login'>" . $line["login"] . "</td>";

			print "<td class='timestamp'>" .
				TimeHelper::make_local_datetime($line["created_at"], false) . "</td>";

			print "</tr>";
		}

		print "</table>";
	}

	function index() {

		$severity = (int) ($_REQUEST["severity"] ?? E_USER_WARNING);
		$page = (int) ($_REQUEST["page"] ?? 0);

		print "<div dojoType='dijit.layout.AccordionContainer' region='center'>";
		print "<div dojoType='dijit.layout.AccordionPane' style='padding : 0'
			title='<i class=\"material-icons\">report</i> ".__('Event Log')."'>";

		if (LOG_DESTINATION == "sql") {

			$this->log_viewer($page, $severity);

		} else {
			print_notice("Please set LOG_DESTINATION to 'sql' in config.php to enable database logging.");
		}

		print "</div>"; # content pane
		print "</div>"; # container
		print "</div>"; # accordion pane

		print "<div dojoType='dijit.layout.AccordionPane'
			title='<i class=\"material-icons\">info</i> ".__('PHP Information')."'>";

		ob_start();
		phpinfo();
		$info = ob_get_contents();
		ob_end_clean();

		print "<div class='phpinfo'>";
		print preg_replace( '%^.*<body>(.*)</body>.*$%ms','$1', $info);
		print "</div>";

		print "</div>"; # accordion pane

		PluginHost::getInstance()->run_hooks(PluginHost::HOOK_PREFS_TAB, "prefSystem");

		print "</div>"; #container
	}

}