mirror of
https://github.com/pfsense/pfsense.git
synced 2025-10-26 11:38:35 +00:00
Various updates to PR
1) convert echo to print, and add infobox, as requested in PR comments
2) If no identifiable line number, say so
3) EVAL gives an error message format that wasn't picked up, it is now. Test case - enter as the code: eval("X");
4) Warn that EVAL gives a "spurious" "error at line 1" as well, the real error is in the (...). See above test case for this.
5) Simplify translators' job a bit
6) Try to reduce errors in user code giving NOTICES (see PR comments). Start by defining a dir for user code (only) and putting code in it.
(cherry picked from commit 1155cd6318)
This commit is contained in:
parent
ad6be377ed
commit
39dc4fc510
@ -305,7 +305,8 @@ if ($_POST['submit'] == "EXEC" && !isBlank($_POST['txtCommand'])):?>
|
||||
// This is intended to prevent bad code from breaking the GUI
|
||||
if ($_POST['submit'] == "EXECPHP" && !isBlank($_POST['txtPHPCommand'])) {
|
||||
|
||||
$tmpfile = tempnam("/tmp", "");
|
||||
safe_mkdir($g[tmp_path_user_code]); //create if doesn't exist
|
||||
$tmpfile = tempnam($g[tmp_path_user_code], "");
|
||||
$phpcode = <<<END_FILE
|
||||
<?php
|
||||
require_once("/etc/inc/config.inc");
|
||||
@ -327,36 +328,36 @@ END_FILE;
|
||||
puts('<div class="panel panel-success responsive"><div class="panel-heading"><h2 class="panel-title">PHP Response</h2></div>');
|
||||
|
||||
// Help user to find bad code line, if it gave an error
|
||||
|
||||
$errmsg_found = preg_match("`error.*:.* (?:in|File:) {$tmpfile}(?: on line|, Line:) (\d+)(?:$|, Message:)`i", implode("\n", $output), $matches);
|
||||
|
||||
$errmsg_found = preg_match("`error.*:.* (?:in|File:) {$tmpfile}(?:\(| on line |, Line: )(\d+)(?:, Message:|\).* eval\(\)'d code|$)`i", implode("\n", $output), $matches);
|
||||
if ($retval || $errmsg_found) {
|
||||
/* Trap failed code - test both retval and output message
|
||||
* Typical messages as at 2.3.x:
|
||||
* "Parse error: syntax error, ERR_DETAILS in FILE on line NN"
|
||||
* "PHP ERROR: Type: NN, File: FILE, Line: NN, Message: ERR_DETAILS"
|
||||
* "Parse error: syntax error, unexpected end of file in FILE(NN) : eval()'d code on line 1" [the number in (..) is the error line]
|
||||
*/
|
||||
$errline = $matches[1] - $lineno_correction;
|
||||
if ($matches[1] > $lineno_correction) {
|
||||
$errline = $matches[1] - $lineno_correction;
|
||||
$errtext = sprintf(gettext('Line %s appears to have generated an error, and has been highlighted. The full response is below.'), $errline);
|
||||
} else {
|
||||
$errline = -1;
|
||||
$errtext = gettext('The code appears to have generated an error, but the line responsible cannot be identified. The full response is below.');
|
||||
}
|
||||
$errtext .= '<br/>' . sprintf(gettext('Note that the line number in the full PHP response will be %s lines too large. Nested code and eval() errors may incorrectly point to "line 1".'), $lineno_correction);
|
||||
$syntax_output = array();
|
||||
$html = "";
|
||||
exec("/usr/local/bin/php -s -d log_errors=off {$tmpfile}", $syntax_output);
|
||||
// Lines 0, 2 and 3 are CSS wrapper for the syntax highlighted code which is at line 1 <br> separated.
|
||||
$syntax_output = explode("<br />", $syntax_output[1]);
|
||||
// Align line numbers right padded when building html
|
||||
$chars = strlen(count($syntax_output)) + 1;
|
||||
$margin_layout = '%3s %' . strlen(count($syntax_output)) . 'd:';
|
||||
for ($lineno = 1; $lineno < count($syntax_output) - $lineno_correction; $lineno++) {
|
||||
if ($lineno == $errline) {
|
||||
$lineno_prefix = ">>>" . str_repeat(' ', $chars - strlen($lineno));
|
||||
} else {
|
||||
$lineno_prefix = str_repeat(' ', ($chars + 3) - strlen($lineno));
|
||||
}
|
||||
$html .= "<span style='color:black;backgroundcolor:lightgrey'><tt>" . $lineno_prefix . $lineno . ":</tt></span> {$syntax_output[$lineno + $lineno_correction - 1]}<br/>\n";
|
||||
$margin = str_replace(' ', ' ', sprintf($margin_layout, ($lineno == $errline ? '>>>' : ''), $lineno));
|
||||
$html .= "<span style='color:black;backgroundcolor:lightgrey'><tt>{$margin}</tt></span> {$syntax_output[$lineno + $lineno_correction - 1]}<br/>\n";
|
||||
}
|
||||
echo sprintf(gettext('Line %s appears to have generated an error, and has been highlighted. The full response is below.<br/>' .
|
||||
'Note that the line number in the full PHP response will be %s lines too large.'), $errline, $lineno_correction);
|
||||
echo "<div style='margin:20px'><b>" . gettext("Error locator:") . "</b>\n";
|
||||
echo "<div id='errdiv' style='height:7em; width:60%; overflow:auto; white-space: nowrap; border:darkgrey solid 1px; margin-top: 20px'>\n";
|
||||
echo $html . "\n</div></div>\n";
|
||||
print_info_box($errtext, 'danger');
|
||||
print "<div style='margin:20px'><b>" . gettext("Error locator:") . "</b>\n";
|
||||
print "<div id='errdiv' style='height:7em; width:60%; overflow:auto; white-space: nowrap; border:darkgrey solid 1px; margin-top: 20px'>\n";
|
||||
print $html . "\n</div></div>\n";
|
||||
}
|
||||
|
||||
$output = implode("\n", $output);
|
||||
@ -379,7 +380,6 @@ END_FILE;
|
||||
});
|
||||
//]]>
|
||||
</script>
|
||||
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user