From 68373909df410fb1be8c664875e7fa4df2f7e2bc Mon Sep 17 00:00:00 2001 From: root Date: Fri, 23 Apr 2021 18:29:21 +0000 Subject: Change directory structure --- lib/Apache/Inject/Handler.pm | 82 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lib/Apache/Inject/Handler.pm (limited to 'lib/Apache/Inject') diff --git a/lib/Apache/Inject/Handler.pm b/lib/Apache/Inject/Handler.pm new file mode 100644 index 0000000..5a40fd8 --- /dev/null +++ b/lib/Apache/Inject/Handler.pm @@ -0,0 +1,82 @@ +package Apache::Inject::Handler; + +use strict; +use warnings FATAL => 'all'; + +use Apache2::RequestRec (); +use Apache2::RequestUtil (); +use Apache2::Const qw/OK DECLINED/; + +my $doc = qr{ + \A + (? \s* + (]*>)? \s* + (]*>)? \s* + ( ]*>.*? \s* + | ( ]*>.*? \s* + | ]*> \s* + | ]*> \s* + | ]*> \s* + | ]*>.*? \s* # n.b. + | ]*>.*? \s* # n.b. + )+ + )? + (]*>)? + )? + (? .*? ) + (? \s* )? + \z +}xmsi; + +sub inject { + my ($r, $var) = @_; + + # Retrieve value implicitly set by Inject directive + return if not (my $val = $r->dir_config($var)); + + # Validate path + if ($val =~ m{^/}) { + warn "$var should not begin with slash, " + . "as it is already always relative to document root"; + } + if ($val =~ m{^../|/../|/..$}) { + warn "$var cannot extend past document root"; + return; + } + + # note: document root has been confirmed not to be empty + my $root = $r->document_root; + + # Read contents of specified file + open my $fh, '<', "$root/$val" or do { + warn "$var $root/$val does not exist"; + return; + }; + print for <$fh>; + close $fh; +} + +sub handler { + my $r = shift; + + return DECLINED if not $r->content_type eq 'text/html'; + + my $content = ${$r->slurp_filename}; + return DECLINED if not $content =~ /$doc/; + + # Or is DocumentRoot guaranteed not to be empty? + if (not $r->document_root) { + warn 'Declining request due to empty document root'; + return DECLINED; + } + + print $+{head} if $+{head}; + inject($r, "InjectHead"); + print $+{body} if $+{body}; + inject($r, "InjectFoot"); + print $+{rest} if $+{rest}; + + return OK; +} + +1; -- cgit v1.2.3