|
1 | 1 | <?php |
2 | 2 |
|
| 3 | +# Moved up here because it is used in several spots. |
| 4 | +# These are the valid columns that you can filter on. |
| 5 | +$filterFields = array( 'Component', 'ServerId', 'Pid', 'Level', 'File', 'Line' ); |
| 6 | + |
3 | 7 | switch ( $_REQUEST['task'] ) |
4 | 8 | { |
5 | 9 | case 'create' : |
|
31 | 35 | if ( !canView( 'System' ) ) |
32 | 36 | ajaxError( 'Insufficient permissions to view log entries' ); |
33 | 37 |
|
34 | | - $servers = Server::find_all(); |
35 | | - $servers_by_Id = array(); |
36 | | - # There is probably a better way to do this. |
37 | | - foreach ( $servers as $server ) { |
38 | | - $servers_by_Id[$server->Id()] = $server; |
39 | | - } |
| 38 | + $servers = Server::find_all(); |
| 39 | + $servers_by_Id = array(); |
| 40 | +# There is probably a better way to do this. |
| 41 | + foreach ( $servers as $server ) { |
| 42 | + $servers_by_Id[$server->Id()] = $server; |
| 43 | + } |
40 | 44 |
|
41 | 45 | $minTime = isset($_POST['minTime'])?$_POST['minTime']:NULL; |
42 | 46 | $maxTime = isset($_POST['maxTime'])?$_POST['maxTime']:NULL; |
43 | | - $limit = isset($_POST['limit'])?$_POST['limit']:100; |
44 | | - $filter = isset($_POST['filter'])?$_POST['filter']:array(); |
45 | | - $sortField = isset($_POST['sortField'])?$_POST['sortField']:'TimeKey'; |
| 47 | + $limit = 100; |
| 48 | + if ( isset($_POST['limit']) ) { |
| 49 | + if ( ( !is_integer( $_POST['limit'] ) and !ctype_digit($_POST['limit']) ) ) { |
| 50 | + Error("Invalid value for limit " . $_POST['limit'] ); |
| 51 | + } else { |
| 52 | + $limit = $_POST['limit']; |
| 53 | + } |
| 54 | + } |
| 55 | + $sortField = 'TimeKey'; |
| 56 | + if ( isset($_POST['sortField']) ) { |
| 57 | + if ( ! in_array( $_POST['sortField'], $filterFields ) and ( $_POST['sortField'] != 'TimeKey' ) ) { |
| 58 | + Error("Invalid sort field " . $_POST['sortField'] ); |
| 59 | + } else { |
| 60 | + $sortField = $_POST['sortField']; |
| 61 | + } |
| 62 | + } |
46 | 63 | $sortOrder = (isset($_POST['sortOrder']) and $_POST['sortOrder']) == 'asc' ? 'asc':'desc'; |
| 64 | + $filter = isset($_POST['filter'])?$_POST['filter']:array(); |
47 | 65 |
|
48 | | - $filterFields = array( 'Component', 'ServerId', 'Pid', 'Level', 'File', 'Line' ); |
49 | | - |
50 | | - $total = dbFetchOne( "SELECT count(*) AS Total FROM Logs", 'Total' ); |
| 66 | + $total = dbFetchOne( 'SELECT count(*) AS Total FROM Logs', 'Total' ); |
51 | 67 | $sql = 'SELECT * FROM Logs'; |
52 | 68 | $where = array(); |
53 | | - $values = array(); |
| 69 | + $values = array(); |
54 | 70 | if ( $minTime ) { |
55 | | - $where[] = "TimeKey > ?"; |
56 | | - $values[] = $minTime; |
| 71 | + $where[] = "TimeKey > ?"; |
| 72 | + $values[] = $minTime; |
57 | 73 | } elseif ( $maxTime ) { |
58 | | - $where[] = "TimeKey < ?"; |
59 | | - $values[] = $maxTime; |
60 | | - } |
| 74 | + $where[] = "TimeKey < ?"; |
| 75 | + $values[] = $maxTime; |
| 76 | + } |
| 77 | + |
61 | 78 | foreach ( $filter as $field=>$value ) { |
62 | | - if ( $field == 'Level' ){ |
63 | | - $where[] = $field." <= ?"; |
64 | | - $values[] = $value; |
65 | | - } else { |
66 | | - $where[] = $field." = ?"; |
67 | | - $values[] = $value; |
68 | | - } |
69 | | - } |
| 79 | + if ( ! in_array( $field, $filterFields ) ) { |
| 80 | + Error("$field is not in valid filter fields"); |
| 81 | + continue; |
| 82 | + } |
| 83 | + if ( $field == 'Level' ){ |
| 84 | + $where[] = $field." <= ?"; |
| 85 | + $values[] = $value; |
| 86 | + } else { |
| 87 | + $where[] = $field." = ?"; |
| 88 | + $values[] = $value; |
| 89 | + } |
| 90 | + } |
70 | 91 | if ( count($where) ) |
71 | | - $sql.= ' WHERE '.join( ' AND ', $where ); |
| 92 | + $sql.= ' WHERE '.join( ' AND ', $where ); |
72 | 93 | $sql .= " order by ".$sortField." ".$sortOrder." limit ".$limit; |
73 | 94 | $logs = array(); |
74 | 95 | foreach ( dbFetchAll( $sql, NULL, $values ) as $log ) { |
75 | 96 | $log['DateTime'] = preg_replace( '/^\d+/', strftime( "%Y-%m-%d %H:%M:%S", intval($log['TimeKey']) ), $log['TimeKey'] ); |
76 | | - $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; |
| 97 | + $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; |
77 | 98 | $logs[] = $log; |
78 | 99 | } |
79 | 100 | $options = array(); |
80 | 101 | $where = array(); |
81 | | - $values = array(); |
| 102 | + $values = array(); |
82 | 103 | foreach( $filter as $field=>$value ) { |
83 | 104 | if ( $field == 'Level' ) { |
84 | 105 | $where[$field] = $field." <= ?"; |
85 | | - $values[$field] = $value; |
| 106 | + $values[$field] = $value; |
86 | 107 | } else { |
87 | 108 | $where[$field] = $field." = ?"; |
88 | | - $values[$field] = $value; |
89 | | - } |
90 | | - } |
| 109 | + $values[$field] = $value; |
| 110 | + } |
| 111 | + } |
91 | 112 | foreach( $filterFields as $field ) |
92 | 113 | { |
93 | 114 | $sql = "SELECT DISTINCT $field FROM Logs WHERE NOT isnull($field)"; |
94 | 115 | $fieldWhere = array_diff_key( $where, array( $field=>true ) ); |
95 | | - $fieldValues = array_diff_key( $values, array( $field=>true ) ); |
| 116 | + $fieldValues = array_diff_key( $values, array( $field=>true ) ); |
96 | 117 | if ( count($fieldWhere) ) |
97 | 118 | $sql.= " AND ".join( ' AND ', $fieldWhere ); |
98 | 119 | $sql.= " ORDER BY $field ASC"; |
|
108 | 129 | { |
109 | 130 | foreach( dbFetchAll( $sql, $field, array_values($fieldValues) ) as $value ) |
110 | 131 | $options['ServerId'][$value] = ( $value and isset($servers_by_Id[$value]) ) ? $servers_by_Id[$value]->Name() : ''; |
111 | | - |
| 132 | + |
112 | 133 | } |
113 | 134 | else |
114 | 135 | { |
|
147 | 168 | } |
148 | 169 | //$limit = isset($_POST['limit'])?$_POST['limit']:1000; |
149 | 170 | $filter = isset($_POST['filter'])?$_POST['filter']:array(); |
150 | | - $sortField = isset($_POST['sortField'])?$_POST['sortField']:'TimeKey'; |
151 | | - $sortOrder = isset($_POST['sortOrder'])?$_POST['sortOrder']:'asc'; |
| 171 | + $sortField = 'TimeKey'; |
| 172 | + if ( isset($_POST['sortField']) ) { |
| 173 | + if ( ! in_array( $_POST['sortField'], $filterFields ) and ( $_POST['sortField'] != 'TimeKey' ) ) { |
| 174 | + Error("Invalid sort field " . $_POST['sortField'] ); |
| 175 | + } else { |
| 176 | + $sortField = $_POST['sortField']; |
| 177 | + } |
| 178 | + } |
| 179 | + $sortOrder = (isset($_POST['sortOrder']) and $_POST['sortOrder']) == 'asc' ? 'asc':'desc'; |
152 | 180 |
|
153 | | - $servers = Server::find_all(); |
154 | | - $servers_by_Id = array(); |
155 | | - # There is probably a better way to do this. |
156 | | - foreach ( $servers as $server ) { |
157 | | - $servers_by_Id[$server->Id()] = $server; |
158 | | - } |
| 181 | + $servers = Server::find_all(); |
| 182 | + $servers_by_Id = array(); |
| 183 | + # There is probably a better way to do this. |
| 184 | + foreach ( $servers as $server ) { |
| 185 | + $servers_by_Id[$server->Id()] = $server; |
| 186 | + } |
159 | 187 |
|
160 | 188 | $sql = "select * from Logs"; |
161 | 189 | $where = array(); |
162 | | - $values = array(); |
| 190 | + $values = array(); |
163 | 191 | if ( $minTime ) |
164 | 192 | { |
165 | 193 | preg_match( '/(.+)(\.\d+)/', $minTime, $matches ); |
166 | 194 | $minTime = strtotime($matches[1]).$matches[2]; |
167 | 195 | $where[] = "TimeKey >= ?"; |
168 | | - $values[] = $minTime; |
| 196 | + $values[] = $minTime; |
169 | 197 | } |
170 | 198 | if ( $maxTime ) |
171 | 199 | { |
172 | 200 | preg_match( '/(.+)(\.\d+)/', $maxTime, $matches ); |
173 | 201 | $maxTime = strtotime($matches[1]).$matches[2]; |
174 | 202 | $where[] = "TimeKey <= ?"; |
175 | | - $values[] = $maxTime; |
| 203 | + $values[] = $maxTime; |
176 | 204 | } |
177 | 205 | foreach ( $filter as $field=>$value ) { |
178 | 206 | if ( $value != '' ) { |
179 | 207 | if ( $field == 'Level' ) { |
180 | 208 | $where[] = $field." <= ?"; |
181 | | - $values[] = $value; |
| 209 | + $values[] = $value; |
182 | 210 | } else { |
183 | 211 | $where[] = $field." = ?'"; |
184 | | - $values[] = $value; |
185 | | - } |
186 | | - } |
187 | | - } |
| 212 | + $values[] = $value; |
| 213 | + } |
| 214 | + } |
| 215 | + } |
188 | 216 | if ( count($where) ) |
189 | 217 | $sql.= " where ".join( " and ", $where ); |
190 | 218 | $sql .= " order by ".$sortField." ".$sortOrder; |
|
216 | 244 | foreach ( dbFetchAll( $sql, NULL, $values ) as $log ) |
217 | 245 | { |
218 | 246 | $log['DateTime'] = preg_replace( '/^\d+/', strftime( "%Y-%m-%d %H:%M:%S", intval($log['TimeKey']) ), $log['TimeKey'] ); |
219 | | - $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; |
| 247 | + $log['Server'] = ( $log['ServerId'] and isset($servers_by_Id[$log['ServerId']]) ) ? $servers_by_Id[$log['ServerId']]->Name() : ''; |
220 | 248 | $logs[] = $log; |
221 | 249 | } |
222 | 250 | switch( $format ) |
|
234 | 262 | } |
235 | 263 | case 'tsv' : |
236 | 264 | { |
237 | | - # This line doesn't need fprintf, it could use fwrite |
| 265 | +# This line doesn't need fprintf, it could use fwrite |
238 | 266 | fprintf( $exportFP, join( "\t", |
239 | | - translate('DateTime'), |
240 | | - translate('Component'), |
241 | | - translate('Server'), |
242 | | - translate('Pid'), |
243 | | - translate('Level'), |
244 | | - translate('Message'), |
245 | | - translate('File'), |
246 | | - translate('Line') |
247 | | - )."\n" ); |
| 267 | + translate('DateTime'), |
| 268 | + translate('Component'), |
| 269 | + translate('Server'), |
| 270 | + translate('Pid'), |
| 271 | + translate('Level'), |
| 272 | + translate('Message'), |
| 273 | + translate('File'), |
| 274 | + translate('Line') |
| 275 | + )."\n" ); |
248 | 276 | foreach ( $logs as $log ) |
249 | 277 | { |
250 | | - fprintf( $exportFP, "%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\n", $log['DateTime'], $log['Component'], $log['Server'], $log['Pid'], $log['Code'], $log['Message'], $log['File'], $log['Line'] ); |
| 278 | + fprintf( $exportFP, "%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\n", $log['DateTime'], $log['Component'], $log['Server'], $log['Pid'], $log['Code'], $log['Message'], $log['File'], $log['Line'] ); |
251 | 279 | } |
252 | 280 | break; |
253 | 281 | } |
|
0 commit comments