X-Git-Url: https://git.deb.at/?p=pkg%2Fblosxom.git;a=blobdiff_plain;f=blosxom.cgi;h=37480ba3cb53f0508f1d36a852a13820b700e1f6;hp=e57ab4bd01bad5ce1fa117a1dc7f9b4d4bd1fbf3;hb=ed493039e11072b3467498307b38c849dee0c2a0;hpb=3965f3e5f1d327b951bf946120d5598a594d4b8c diff --git a/blosxom.cgi b/blosxom.cgi index e57ab4b..37480ba 100755 --- a/blosxom.cgi +++ b/blosxom.cgi @@ -79,7 +79,7 @@ $static_entries = 0; # -------------------------------- use vars - qw! $version $blog_title $blog_description $blog_language $blog_encoding $datadir $url %template $template $depth $num_entries $file_extension $default_flavour $static_or_dynamic $config_dir $plugin_list $plugin_path $plugin_dir $plugin_state_dir @plugins %plugins $static_dir $static_password @static_flavours $static_entries $path_info $path_info_yr $path_info_mo $path_info_da $path_info_mo_num $flavour $static_or_dynamic %month2num @num2month $interpolate $entries $output $header $show_future_entries %files %indexes %others !; + qw! $version $blog_title $blog_description $blog_language $blog_encoding $datadir $url %template $template $depth $num_entries $file_extension $default_flavour $static_or_dynamic $config_dir $plugin_list $plugin_path $plugin_dir $plugin_state_dir @plugins %plugins $static_dir $static_password @static_flavours $static_entries $path_info $path_info_yr $path_info_mo $path_info_da $path_info_mo_num $flavour $static_or_dynamic %month2num @num2month $interpolate $entries $output $header $show_future_entries %files %indexes %others $encode_xml_entities !; use strict; use FileHandle; @@ -90,6 +90,9 @@ use CGI qw/:standard :netscape/; $version = "2.0.2"; +# Should I encode entities for xml content-types? (plugins can turn this off if they do it themselves) +$encode_xml_entities = 1; + # Load configuration from $ENV{BLOSXOM_CONFIG_DIR}/blosxom.conf, if it exists my $blosxom_config; if ( $ENV{BLOSXOM_CONFIG_FILE} && -r $ENV{BLOSXOM_CONFIG_FILE} ) { @@ -251,15 +254,19 @@ my @plugin_list = (); my %plugin_hash = (); # If $plugin_list is set, read plugins to use from that file -$plugin_list = "$config_dir/$plugin_list" - if $plugin_list && $plugin_list !~ m!^\s*/!; -if ( $plugin_list and -r $plugin_list and $fh->open("< $plugin_list") ) { - @plugin_list = map { chomp $_; $_ } grep { /\S/ && !/^#/ } <$fh>; - $fh->close; +if ( $plugin_list ) { + if ( -r $plugin_list and $fh->open("< $plugin_list") ) { + @plugin_list = map { chomp $_; $_ } grep { /\S/ && !/^#/ } <$fh>; + $fh->close; + } + else { + warn "unable to read or open plugin_list '$plugin_list': $!"; + $plugin_list = ''; + } } # Otherwise walk @plugin_dirs to get list of plugins to use -elsif (@plugin_dirs) { +if ( ! @plugin_list && @plugin_dirs ) { for my $plugin_dir (@plugin_dirs) { next unless -d $plugin_dir; if ( opendir PLUGINS, $plugin_dir ) { @@ -285,18 +292,21 @@ elsif (@plugin_dirs) { unshift @INC, @plugin_dirs; foreach my $plugin (@plugin_list) { my ( $plugin_name, $off ) = $plugin =~ /^\d*([\w:]+?)(_?)$/; + my $plugin_file = $plugin_list ? $plugin_name : $plugin; my $on_off = $off eq '_' ? -1 : 1; # Allow perl module plugins - if ( $plugin =~ m/::/ && -z $plugin_hash{$plugin} ) { + # The -z test is a hack to allow a zero-length placeholder file in a + # $plugin_path directory to indicate an @INC module should be loaded + if ( $plugin =~ m/::/ && ( $plugin_list || -z $plugin_hash{$plugin} ) ) { # For Blosxom::Plugin::Foo style plugins, we need to use a string require - eval "require $plugin_name"; + eval "require $plugin_file"; } else { # we try first to load from $plugin_dir before attempting from $plugin_path - eval { require "$plugin_dir/$plugin" } - or eval { require $plugin }; + eval { require "$plugin_dir/$plugin_file" } + or eval { require $plugin_file }; } if ($@) { @@ -457,7 +467,7 @@ else { my $content_type = ( &$template( $path_info, 'content_type', $flavour ) ); $content_type =~ s!\n.*!!s; - $content_type =~ s/(\$\w+(?:::)?\w*)/"defined $1 ? $1 : ''"/gee; + $content_type =~ s/(\$\w+(?:::\w+)*)/"defined $1 ? $1 : ''"/gee; $header = { -type => $content_type }; print generate( 'dynamic', $path_info, @@ -503,10 +513,10 @@ sub generate { # Define default interpolation subroutine $interpolate = sub { - package blosxom; my $template = shift; - $template =~ s/(\$\w+(?:::)?\w*)/"defined $1 ? $1 : ''"/gee; + # Interpolate scalars, namespaced scalars, and hash/hashref scalars + $template =~ s/(\$\w+(?:::\w+)*(?:(?:->)?{(['"]?)[-\w]+\2})?)/"defined $1 ? $1 : ''"/gee; return $template; }; @@ -641,7 +651,7 @@ sub generate { } } - if ( $content_type =~ m{\bxml\b} ) { + if ( $encode_xml_entities && $content_type =~ m{\bxml\b} ) { # Escape <, >, and &, and to produce valid RSS my %escape = ( @@ -696,16 +706,16 @@ sub nice_date { my ($unixtime) = @_; my $c_time = CORE::localtime($unixtime); - my ( $dw, $mo, $da, $hr, $min, $yr ) + my ( $dw, $mo, $da, $hr, $min, $sec, $yr ) = ( $c_time - =~ /(\w{3}) +(\w{3}) +(\d{1,2}) +(\d{2}):(\d{2}):\d{2} +(\d{4})$/ + =~ /(\w{3}) +(\w{3}) +(\d{1,2}) +(\d{2}):(\d{2}):(\d{2}) +(\d{4})$/ ); $ti = "$hr:$min"; $da = sprintf( "%02d", $da ); my $mo_num = $month2num{$mo}; my $offset - = timegm( 00, $min, $hr, $da, $mo_num - 1, $yr - 1900 ) - $unixtime; + = timegm( $sec, $min, $hr, $da, $mo_num - 1, $yr - 1900 ) - $unixtime; my $utc_offset = sprintf( "%+03d", int( $offset / 3600 ) ) . sprintf( "%02d", ( $offset % 3600 ) / 60 ); @@ -719,7 +729,7 @@ html content_type text/html; charset=$blog_encoding html head html head html head -html head +html head html head $blog_title $path_info_da $path_info_mo $path_info_yr html head html head