manualpages: Add path and file extension to the configuration

This allows to correctly assign an URL to a file without relying
on unique base names.
A custom read function is required because General::readhash()
doesn't allow paths as hash keys. Modifying the existing functions
could affect other CGIs and was therefore dismissed.

Fixes: #12806

Signed-off-by: Leo-Andres Hofmann <hofmann@leo-andres.de>
This commit is contained in:
Leo-Andres Hofmann
2022-04-25 21:12:45 +02:00
committed by Peter Müller
parent 5f8a1acfe9
commit 64db1faf67
4 changed files with 110 additions and 88 deletions

View File

@@ -93,7 +93,7 @@ if ( -d "/var/ipfire/langs/${language}/" ) {
### Initialize user manual ### Initialize user manual
my %manualpages = (); my %manualpages = ();
&General::readhash("${General::swroot}/main/manualpages", \%manualpages); &_read_manualpage_hash("${General::swroot}/main/manualpages");
### Load selected language and theme functions ### Load selected language and theme functions
require "${swroot}/langs/en.pl"; require "${swroot}/langs/en.pl";
@@ -558,20 +558,43 @@ sub colorize {
} }
} }
# Get user manual URL for the specified configuration page, returns empty if no entry is configured # Get user manual URL for a configuration page inside the "/cgi-bin/"
# (reads current page from the environment variables unless defined)
# Returns empty if no URL is available
sub get_manualpage_url() { sub get_manualpage_url() {
my ($cgi_page) = @_; my ($cgifile) = @_;
$cgifile //= substr($ENV{'SCRIPT_NAME'}, 9); # remove fixed "/cgi-bin/" path
# Ensure base url is configured # Ensure base url is configured
return unless($manualpages{'BASE_URL'}); return unless($manualpages{'BASE_URL'});
# Return URL # Return URL
if($cgi_page && defined($manualpages{$cgi_page})) { if($cgifile && defined($manualpages{$cgifile})) {
return "$manualpages{'BASE_URL'}/$manualpages{$cgi_page}"; return "$manualpages{'BASE_URL'}/$manualpages{$cgifile}";
} }
# No manual page configured, return nothing # No manual page configured, return nothing
return; return;
} }
# Private function to load a hash of configured user manual pages from file
# (run check_manualpages.pl to make sure the file is correct)
sub _read_manualpage_hash() {
my ($filename) = @_;
open(my $file, "<", $filename) or return; # Fail silent
while(my $line = <$file>) {
chomp($line);
next if(substr($line, 0, 1) eq '#'); # Skip comments
next if(index($line, '=', 1) == -1); # Skip incomplete lines
my($left, $value) = split(/=/, $line, 2);
if($left =~ /^([[:alnum:]\/._-]+)$/) {
my $key = $1;
$manualpages{$key} = $value;
}
}
close($file);
}
1; # End of package "Header" 1; # End of package "Header"

View File

@@ -1,88 +1,88 @@
# Assign manual page URL path to CGI file ([cgi basename]=[path/to/page]) # Assign manual page URL path to CGI file ([cgi file]=[path/to/page])
# The CGI files are referenced relative to the "/cgi-bin/" path
# Base URL (without trailing slash) # Fixed base URL (without trailing slash)
BASE_URL=https://wiki.ipfire.org BASE_URL=https://wiki.ipfire.org
index=configuration/system/startpage
# System menu # System menu
index=configuration/system/startpage index.cgi=configuration/system/startpage
mail=configuration/system/mail_service mail.cgi=configuration/system/mail_service
remote=configuration/system/ssh remote.cgi=configuration/system/ssh
backup=configuration/system/backup backup.cgi=configuration/system/backup
gui=configuration/system/userinterface gui.cgi=configuration/system/userinterface
fireinfo=fireinfo fireinfo.cgi=fireinfo
vulnerabilities=configuration/system/vulnerabilities vulnerabilities.cgi=configuration/system/vulnerabilities
shutdown=configuration/system/shutdown shutdown.cgi=configuration/system/shutdown
credits=configuration/system/credits credits.cgi=configuration/system/credits
# Status menu # Status menu
system=configuration/status/system system.cgi=configuration/status/system
memory=configuration/status/memory memory.cgi=configuration/status/memory
services=configuration/status/services services.cgi=configuration/status/services
media=configuration/status/drives media.cgi=configuration/status/drives
netexternal=configuration/status/network_ext netexternal.cgi=configuration/status/network_ext
netinternal=configuration/status/network_int netinternal.cgi=configuration/status/network_int
netother=configuration/status/network_int netother.cgi=configuration/status/network_int
netovpnrw=configuration/status/network_ovpnrw netovpnrw.cgi=configuration/status/network_ovpnrw
#netovpnsrv= #netovpnsrv.cgi=
wio=addons/wio wio.cgi=addons/wio
hardwaregraphs=configuration/status/hardware_diagrams hardwaregraphs.cgi=configuration/status/hardware_diagrams
entropy=configuration/status/entropy entropy.cgi=configuration/status/entropy
connections=configuration/status/connections connections.cgi=configuration/status/connections
traffic=configuration/status/nettraffic traffic.cgi=configuration/status/nettraffic
#mdstat= #mdstat.cgi=
# Network menu # Network menu
zoneconf=configuration/network/zoneconf zoneconf.cgi=configuration/network/zoneconf
dns=dns dns.cgi=dns
proxy=configuration/network/proxy proxy.cgi=configuration/network/proxy
urlfilter=configuration/network/proxy/url-filter urlfilter.cgi=configuration/network/proxy/url-filter
#updatexlrator=configuration/network/proxy/update_accelerator #updatexlrator.cgi=configuration/network/proxy/update_accelerator
dhcp=configuration/network/dhcp dhcp.cgi=configuration/network/dhcp
captive=configuration/network/captive captive.cgi=configuration/network/captive
connscheduler=configuration/network/connectionscheduler connscheduler.cgi=configuration/network/connectionscheduler
hosts=configuration/network/hosts hosts.cgi=configuration/network/hosts
dnsforward=configuration/network/dnsforward dnsforward.cgi=configuration/network/dnsforward
routing=configuration/network/static routing.cgi=configuration/network/static
mac=configuration/network/mac-address mac.cgi=configuration/network/mac-address
wakeonlan=configuration/network/wake-on-lan wakeonlan.cgi=configuration/network/wake-on-lan
# Services menu # Services menu
vpnmain=configuration/services/ipsec vpnmain.cgi=configuration/services/ipsec
ovpnmain=configuration/services/openvpn ovpnmain.cgi=configuration/services/openvpn
ddns=configuration/services/dyndns ddns.cgi=configuration/services/dyndns
time=configuration/services/ntp time.cgi=configuration/services/ntp
qos=configuration/services/qos qos.cgi=configuration/services/qos
guardian=addons/guardian guardian.cgi=addons/guardian
extrahd=configuration/services/extrahd extrahd.cgi=configuration/services/extrahd
# Firewall menu # Firewall menu
firewall=configuration/firewall firewall.cgi=configuration/firewall
fwhosts=configuration/firewall/fwgroups fwhosts.cgi=configuration/firewall/fwgroups
optionsfw=configuration/firewall/options optionsfw.cgi=configuration/firewall/options
ids=configuration/firewall/ips ids.cgi=configuration/firewall/ips
location-block=configuration/firewall/geoip-block location-block.cgi=configuration/firewall/geoip-block
wireless=configuration/firewall/accesstoblue wireless.cgi=configuration/firewall/accesstoblue
iptables=configuration/firewall/iptables iptables.cgi=configuration/firewall/iptables
# IPfire menu # IPfire menu
pakfire=configuration/ipfire/pakfire pakfire.cgi=configuration/ipfire/pakfire
wlanap=addons/wireless wlanap.cgi=addons/wireless
tor=addons/tor tor.cgi=addons/tor
mpfire=addons/mpfire mpfire.cgi=addons/mpfire
samba=addons/samba samba.cgi=addons/samba
# Logs menu # Logs menu
summary=configuration/logs/summary logs.cgi/summary.dat=configuration/logs/summary
config=configuration/logs/logsettings logs.cgi/config.dat=configuration/logs/logsettings
proxylog=configuration/logs/proxy logs.cgi/proxylog.dat=configuration/logs/proxy
calamaris=configuration/logs/proxyreports logs.cgi/calamaris.dat=configuration/logs/proxyreports
accounting=addons/squid-accounting logs.cgi/accounting.dat=addons/squid-accounting
firewalllog=configuration/logs/firewall logs.cgi/firewalllog.dat=configuration/logs/firewall
firewalllogip=configuration/logs/firewall-ip logs.cgi/firewalllogip.dat=configuration/logs/firewall-ip
firewalllogport=configuration/logs/firewall-port logs.cgi/firewalllogport.dat=configuration/logs/firewall-port
firewalllogcountry=configuration/logs/firewall-country logs.cgi/firewalllogcountry.dat=configuration/logs/firewall-country
ids=configuration/logs/ips logs.cgi/ids.dat=configuration/logs/ips
#ovpnclients= #logs.cgi/ovpnclients.dat=
urlfilter=configuration/logs/url-filter logs.cgi/urlfilter.dat=configuration/logs/url-filter
log=configuration/logs/system logs.cgi/log.dat=configuration/logs/system

View File

@@ -100,8 +100,6 @@ sub openpage {
my $boh = shift; my $boh = shift;
my $extrahead = shift; my $extrahead = shift;
my $suppressMenu = shift // 0; my $suppressMenu = shift // 0;
my @tmp = split(/\./, basename($0));
my $scriptName = @tmp[0];
my $headline = "IPFire"; my $headline = "IPFire";
if (($settings{'WINDOWWITHHOSTNAME'} eq 'on') || ($settings{'WINDOWWITHHOSTNAME'} eq '')) { if (($settings{'WINDOWWITHHOSTNAME'} eq 'on') || ($settings{'WINDOWWITHHOSTNAME'} eq '')) {
@@ -172,7 +170,7 @@ END
; ;
# Print user manual link # Print user manual link
my $manual_url = &Header::get_manualpage_url($scriptName); my $manual_url = &Header::get_manualpage_url();
if($manual_url) { if($manual_url) {
print <<END print <<END
<span><a href="$manual_url" title="$Lang::tr{'online help en'}" target="_blank"><img src="/images/help-browser.png" alt="$Lang::tr{'online help en'}"></a></span> <span><a href="$manual_url" title="$Lang::tr{'online help en'}" target="_blank"><img src="/images/help-browser.png" alt="$Lang::tr{'online help en'}"></a></span>

View File

@@ -25,18 +25,19 @@ use strict;
# Import make.sh environment # Import make.sh environment
my $basedir = $ENV{'BASEDIR'}; my $basedir = $ENV{'BASEDIR'};
# Load configuration file (General::readhash isn't available yet) # Load configuration file (Header::_read_manualpage_hash() isn't available yet)
my $configfile = "${basedir}/config/cfgroot/manualpages"; my $configfile = "${basedir}/config/cfgroot/manualpages";
my %manualpages = (); my %manualpages = ();
open(my $file, "<", $configfile) or die "ERROR: Can't read from file '$configfile'!\n"; open(my $file, "<", $configfile) or die "ERROR: Can't read from file '$configfile'!\n";
while(my $line = <$file>) { while(my $line = <$file>) {
$line =~ s/\R//g; chomp($line);
next unless($line =~ /=/); next if(substr($line, 0, 1) eq '#'); # Skip comments
next if(index($line, '=', 1) == -1); # Skip incomplete lines
my($left, $value) = split(/=/, $line, 2); my($left, $value) = split(/=/, $line, 2);
if($left =~ /(^[A-Za-z0-9_-]+$)/) { if($left =~ /^([[:alnum:]\/._-]+)$/) {
my $key = $1; # Got alphanumeric key my $key = $1;
$manualpages{$key} = $value; $manualpages{$key} = $value;
} }
} }
@@ -55,11 +56,11 @@ if ($baseurl =~ /\/\s*$/) {
# Loop trough configured manual pages # Loop trough configured manual pages
foreach my $page (keys %manualpages) { foreach my $page (keys %manualpages) {
# Build absolute path and URL # Build absolute path (inside cgi-bin) and URL
my $cgifile = "${basedir}/html/cgi-bin/${page}.cgi"; my $cgifile = "${basedir}/html/cgi-bin/${page}";
my $url = "${baseurl}/$manualpages{$page}"; my $url = "${baseurl}/$manualpages{$page}";
print "${page}.cgi -> '$url'\n"; print "cgi-bin/${page} -> '$url'\n";
# Check CGI file exists # Check CGI file exists
if(! -f $cgifile) { if(! -f $cgifile) {