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
my %manualpages = ();
&General::readhash("${General::swroot}/main/manualpages", \%manualpages);
&_read_manualpage_hash("${General::swroot}/main/manualpages");
### Load selected language and theme functions
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() {
my ($cgi_page) = @_;
my ($cgifile) = @_;
$cgifile //= substr($ENV{'SCRIPT_NAME'}, 9); # remove fixed "/cgi-bin/" path
# Ensure base url is configured
return unless($manualpages{'BASE_URL'});
# Return URL
if($cgi_page && defined($manualpages{$cgi_page})) {
return "$manualpages{'BASE_URL'}/$manualpages{$cgi_page}";
if($cgifile && defined($manualpages{$cgifile})) {
return "$manualpages{'BASE_URL'}/$manualpages{$cgifile}";
}
# No manual page configured, return nothing
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"

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
index=configuration/system/startpage
# System menu
index=configuration/system/startpage
mail=configuration/system/mail_service
remote=configuration/system/ssh
backup=configuration/system/backup
gui=configuration/system/userinterface
fireinfo=fireinfo
vulnerabilities=configuration/system/vulnerabilities
shutdown=configuration/system/shutdown
credits=configuration/system/credits
index.cgi=configuration/system/startpage
mail.cgi=configuration/system/mail_service
remote.cgi=configuration/system/ssh
backup.cgi=configuration/system/backup
gui.cgi=configuration/system/userinterface
fireinfo.cgi=fireinfo
vulnerabilities.cgi=configuration/system/vulnerabilities
shutdown.cgi=configuration/system/shutdown
credits.cgi=configuration/system/credits
# Status menu
system=configuration/status/system
memory=configuration/status/memory
services=configuration/status/services
media=configuration/status/drives
netexternal=configuration/status/network_ext
netinternal=configuration/status/network_int
netother=configuration/status/network_int
netovpnrw=configuration/status/network_ovpnrw
#netovpnsrv=
wio=addons/wio
hardwaregraphs=configuration/status/hardware_diagrams
entropy=configuration/status/entropy
connections=configuration/status/connections
traffic=configuration/status/nettraffic
#mdstat=
system.cgi=configuration/status/system
memory.cgi=configuration/status/memory
services.cgi=configuration/status/services
media.cgi=configuration/status/drives
netexternal.cgi=configuration/status/network_ext
netinternal.cgi=configuration/status/network_int
netother.cgi=configuration/status/network_int
netovpnrw.cgi=configuration/status/network_ovpnrw
#netovpnsrv.cgi=
wio.cgi=addons/wio
hardwaregraphs.cgi=configuration/status/hardware_diagrams
entropy.cgi=configuration/status/entropy
connections.cgi=configuration/status/connections
traffic.cgi=configuration/status/nettraffic
#mdstat.cgi=
# Network menu
zoneconf=configuration/network/zoneconf
dns=dns
proxy=configuration/network/proxy
urlfilter=configuration/network/proxy/url-filter
#updatexlrator=configuration/network/proxy/update_accelerator
dhcp=configuration/network/dhcp
captive=configuration/network/captive
connscheduler=configuration/network/connectionscheduler
hosts=configuration/network/hosts
dnsforward=configuration/network/dnsforward
routing=configuration/network/static
mac=configuration/network/mac-address
wakeonlan=configuration/network/wake-on-lan
zoneconf.cgi=configuration/network/zoneconf
dns.cgi=dns
proxy.cgi=configuration/network/proxy
urlfilter.cgi=configuration/network/proxy/url-filter
#updatexlrator.cgi=configuration/network/proxy/update_accelerator
dhcp.cgi=configuration/network/dhcp
captive.cgi=configuration/network/captive
connscheduler.cgi=configuration/network/connectionscheduler
hosts.cgi=configuration/network/hosts
dnsforward.cgi=configuration/network/dnsforward
routing.cgi=configuration/network/static
mac.cgi=configuration/network/mac-address
wakeonlan.cgi=configuration/network/wake-on-lan
# Services menu
vpnmain=configuration/services/ipsec
ovpnmain=configuration/services/openvpn
ddns=configuration/services/dyndns
time=configuration/services/ntp
qos=configuration/services/qos
guardian=addons/guardian
extrahd=configuration/services/extrahd
vpnmain.cgi=configuration/services/ipsec
ovpnmain.cgi=configuration/services/openvpn
ddns.cgi=configuration/services/dyndns
time.cgi=configuration/services/ntp
qos.cgi=configuration/services/qos
guardian.cgi=addons/guardian
extrahd.cgi=configuration/services/extrahd
# Firewall menu
firewall=configuration/firewall
fwhosts=configuration/firewall/fwgroups
optionsfw=configuration/firewall/options
ids=configuration/firewall/ips
location-block=configuration/firewall/geoip-block
wireless=configuration/firewall/accesstoblue
iptables=configuration/firewall/iptables
firewall.cgi=configuration/firewall
fwhosts.cgi=configuration/firewall/fwgroups
optionsfw.cgi=configuration/firewall/options
ids.cgi=configuration/firewall/ips
location-block.cgi=configuration/firewall/geoip-block
wireless.cgi=configuration/firewall/accesstoblue
iptables.cgi=configuration/firewall/iptables
# IPfire menu
pakfire=configuration/ipfire/pakfire
wlanap=addons/wireless
tor=addons/tor
mpfire=addons/mpfire
samba=addons/samba
pakfire.cgi=configuration/ipfire/pakfire
wlanap.cgi=addons/wireless
tor.cgi=addons/tor
mpfire.cgi=addons/mpfire
samba.cgi=addons/samba
# Logs menu
summary=configuration/logs/summary
config=configuration/logs/logsettings
proxylog=configuration/logs/proxy
calamaris=configuration/logs/proxyreports
accounting=addons/squid-accounting
firewalllog=configuration/logs/firewall
firewalllogip=configuration/logs/firewall-ip
firewalllogport=configuration/logs/firewall-port
firewalllogcountry=configuration/logs/firewall-country
ids=configuration/logs/ips
#ovpnclients=
urlfilter=configuration/logs/url-filter
log=configuration/logs/system
logs.cgi/summary.dat=configuration/logs/summary
logs.cgi/config.dat=configuration/logs/logsettings
logs.cgi/proxylog.dat=configuration/logs/proxy
logs.cgi/calamaris.dat=configuration/logs/proxyreports
logs.cgi/accounting.dat=addons/squid-accounting
logs.cgi/firewalllog.dat=configuration/logs/firewall
logs.cgi/firewalllogip.dat=configuration/logs/firewall-ip
logs.cgi/firewalllogport.dat=configuration/logs/firewall-port
logs.cgi/firewalllogcountry.dat=configuration/logs/firewall-country
logs.cgi/ids.dat=configuration/logs/ips
#logs.cgi/ovpnclients.dat=
logs.cgi/urlfilter.dat=configuration/logs/url-filter
logs.cgi/log.dat=configuration/logs/system

View File

@@ -100,8 +100,6 @@ sub openpage {
my $boh = shift;
my $extrahead = shift;
my $suppressMenu = shift // 0;
my @tmp = split(/\./, basename($0));
my $scriptName = @tmp[0];
my $headline = "IPFire";
if (($settings{'WINDOWWITHHOSTNAME'} eq 'on') || ($settings{'WINDOWWITHHOSTNAME'} eq '')) {
@@ -172,7 +170,7 @@ END
;
# Print user manual link
my $manual_url = &Header::get_manualpage_url($scriptName);
my $manual_url = &Header::get_manualpage_url();
if($manual_url) {
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>

View File

@@ -25,18 +25,19 @@ use strict;
# Import make.sh environment
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 %manualpages = ();
open(my $file, "<", $configfile) or die "ERROR: Can't read from file '$configfile'!\n";
while(my $line = <$file>) {
$line =~ s/\R//g;
next unless($line =~ /=/);
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 =~ /(^[A-Za-z0-9_-]+$)/) {
my $key = $1; # Got alphanumeric key
if($left =~ /^([[:alnum:]\/._-]+)$/) {
my $key = $1;
$manualpages{$key} = $value;
}
}
@@ -55,11 +56,11 @@ if ($baseurl =~ /\/\s*$/) {
# Loop trough configured manual pages
foreach my $page (keys %manualpages) {
# Build absolute path and URL
my $cgifile = "${basedir}/html/cgi-bin/${page}.cgi";
# Build absolute path (inside cgi-bin) and URL
my $cgifile = "${basedir}/html/cgi-bin/${page}";
my $url = "${baseurl}/$manualpages{$page}";
print "${page}.cgi -> '$url'\n";
print "cgi-bin/${page} -> '$url'\n";
# Check CGI file exists
if(! -f $cgifile) {