Drop Apache comment preservation from this PR

This commit is contained in:
Ilia Ross
2026-09-17 00:01:01 +02:00
parent 3d27aca04a
commit faaef530f2
2 changed files with 4 additions and 79 deletions

View File

@@ -126,7 +126,6 @@ if (&read_file($site_file, \%site)) {
# value - Value (possibly with spaces)
# members - For type 1, a reference to the array of members
# indent - Number of spaces before the name
# comment - Full text for a comment stored as a dummy directive
sub parse_config_file
{
local($fh, @rv, $line, %dummy);
@@ -147,22 +146,8 @@ foreach my $d (&get_httpd_defines()) {
}
while($line = <$fh>) {
$line =~ s/\r|\n//g;
if ($line =~ /^(\s*)(#.*)$/) {
# Keep comments in the structure so block rewrites preserve them
local(%dir);
%dir = ('line', $_[1],
'eline', $_[1],
'file', $_[2],
'type', 0,
'name', 'dummy',
'comment', $2);
local $indent = $1;
$indent =~ s/\t/ /g;
$dir{'indent'} = length($indent);
push(@rv, \%dir);
$_[1]++;
}
elsif ($line =~ /^\s*<\/(\S+)\s*(.*)>/) {
$line =~ s/^\s*#.*$//g;
if ($line =~ /^\s*<\/(\S+)\s*(.*)>/) {
# end of a container directive. This can only happen in a
# recursive call to this function
$_[1]++;
@@ -799,7 +784,7 @@ foreach my $dir (@$dirs) {
$line+1, $file);
}
$dir->{'eline'} = $line;
$line++ if ($dir->{'name'} ne 'dummy' || defined($dir->{'comment'}));
$line++ if ($dir->{'name'} ne 'dummy');
}
return $line;
}
@@ -1945,13 +1930,7 @@ sub directive_lines
{
my @rv;
foreach my $d (@_) {
if ($d->{'name'} eq 'dummy') {
if (defined($d->{'comment'})) {
my $indent = (" " x $d->{'indent'});
push(@rv, $indent.$d->{'comment'});
}
next;
}
next if ($d->{'name'} eq 'dummy');
my $indent = (" " x $d->{'indent'});
if ($d->{'type'}) {
push(@rv, $indent."<$d->{'name'} $d->{'value'}>");

View File

@@ -28,16 +28,6 @@ print $fh $text;
close($fh) || die "Failed to close $file: $!";
}
sub read_text
{
my ($file) = @_;
open(my $fh, '<', $file) || die "Failed to read $file: $!";
local $/ = undef;
my $text = <$fh>;
close($fh) || die "Failed to close $file: $!";
return $text;
}
# Load the Apache module with an isolated Webmin configuration.
write_text(File::Spec->catfile($webmin_config, 'config'),
"os_type=debian-linux\n".
@@ -98,48 +88,4 @@ is($directory->{'eline'}, 15, 'outer block includes the nested closing line');
is($alias->{'line'}, 16, 'following directive starts after the outer block');
is($next, 10 + scalar(@lines), 'returned line follows serialized output');
# Parsed comments are not Apache directives, but block rewrites must retain
# their text and indentation around nested containers.
my $roundtrip = File::Spec->catfile($tmp, 'comments.conf');
my $roundtrip_text =
"# outer comment\n".
"<Directory /srv/example>\n".
" # nested comment\n".
" <Files *.php>\n".
" Require all denied\n".
" </Files>\n".
"</Directory>\n";
write_text($roundtrip, $roundtrip_text);
open(my $fh, '<', $roundtrip) || die "Failed to read $roundtrip: $!";
my $line = 0;
my @parsed = main::parse_config_file($fh, $line, $roundtrip);
close($fh) || die "Failed to close $roundtrip: $!";
is(join("\n", main::directive_lines(@parsed))."\n", $roundtrip_text,
'comments survive parsing and serialization');
# Removing one of two parsed virtual hosts must use spans that include their
# comments, or remnants of the removed block will make Apache invalid.
my $vhosts_file = File::Spec->catfile($tmp, 'vhosts.conf');
my $first_vhost =
"<VirtualHost *:80>\n".
" # first comment\n".
" ServerName first.example\n".
"</VirtualHost>\n";
my $second_vhost =
"<VirtualHost *:443>\n".
" # second comment\n".
" ServerName second.example\n".
"</VirtualHost>\n";
write_text($vhosts_file, $first_vhost.$second_vhost);
open($fh, '<', $vhosts_file) || die "Failed to read $vhosts_file: $!";
$line = 0;
my @vhost_config = main::parse_config_file($fh, $line, $vhosts_file);
close($fh) || die "Failed to close $vhosts_file: $!";
my @vhosts = main::find_directive_struct('VirtualHost', \@vhost_config);
main::save_directive_struct($vhosts[1], undef,
\@vhost_config, \@vhost_config);
main::flush_file_lines($vhosts_file);
is(read_text($vhosts_file), $first_vhost,
'removing a block also removes all of its comments');
done_testing();