[10/11] ipinfo.cgi: Allow to display multiple flags.

Message ID 20200922182509.18643-10-stefan.schantl@ipfire.org
State Accepted
Commit 33975f578d4aefdd5737b4eddc39e033e77d8ad0
Headers
Series [01/11] location-functions.pl: Refactor get_locations() function to use the Location module. |

Commit Message

Stefan Schantl Sept. 22, 2020, 6:25 p.m. UTC
  Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
---
 config/cfgroot/location-functions.pl | 17 +++++++---
 html/cgi-bin/ipinfo.cgi              | 48 ++++++++++++++++++++++++----
 2 files changed, 55 insertions(+), 10 deletions(-)
  

Patch

diff --git a/config/cfgroot/location-functions.pl b/config/cfgroot/location-functions.pl
index b0b8cd086..2cfe7f908 100644
--- a/config/cfgroot/location-functions.pl
+++ b/config/cfgroot/location-functions.pl
@@ -190,10 +190,13 @@  sub get_locations() {
 	return @sorted_locations;
 }
 
-# Function to check if a given address has a special flag.
-sub address_has_flag($) {
+# Function to check if a given address has one ore more special flags.
+sub address_has_flags($) {
 	my ($address) = @_;
 
+	# Array to store the flags of the address.
+	my @flags;
+
 	# Init libloc database handle.
 	my $db_handle = &init();
 
@@ -206,10 +209,16 @@  sub address_has_flag($) {
 			# Grab the mapped location code for this flag.
 			$mapped_code = $network_flags{$flag};
 
-			# Return the code.
-			return $mapped_code;
+			# Add the mapped code to the array of flags.
+			push(@flags, $mapped_code);
 		}
 	}
+
+	# Sort the array of flags.
+	@flags = sort(@flags);
+
+	# Return the array of flags.
+	return @flags;
 }
 
 1;
diff --git a/html/cgi-bin/ipinfo.cgi b/html/cgi-bin/ipinfo.cgi
index cce6097ff..d8cb6c6b7 100644
--- a/html/cgi-bin/ipinfo.cgi
+++ b/html/cgi-bin/ipinfo.cgi
@@ -64,7 +64,7 @@  if (&General::validip($addr)) {
 	# enumerate location information for IP address...
 	my $db_handle = &Location::Functions::init();
 	my $ccode = &Location::Functions::lookup_country_code($db_handle, $addr);
-	my $network_flag = &Location::Functions::address_has_flag($addr);
+	my @network_flags = &Location::Functions::address_has_flags($addr);
 
 	# Try to get the continent of the country code.
 	my $continent = &Location::get_continent_code($db_handle, $ccode);
@@ -111,12 +111,48 @@  if (&General::validip($addr)) {
 	&Header::openbox('100%', 'left', $addr . " <a href='country.cgi#$ccode'><img src='$flag_icon' border='0' align='absmiddle' alt='$ccode' title='$ccode' /></a> (" . $hostname . ') : '.$whois_server);
 
 	# Check if the address has a flag.
-	if ($network_flag) {
-		# Get
-		my $network_flag_name = &Location::Functions::get_full_country_name($network_flag);
+	if (@network_flags) {
+		# Get amount of flags for this network.
+		my $flags_amount = @network_flags;
+		my $processed_flags;
+
+		# The message string which will be displayed.
+		my $message_string = "This address is marked as";
+
+		# Loop through the array of network_flags.
+		foreach my $network_flag (@network_flags) {
+			# Increment value of processed flags.
+			$processed_flags++;
+
+			# Get the network flag name.
+			my $network_flag_name = &Location::Functions::get_full_country_name($network_flag);
+
+			# Add the flag name to the message string.
+			$message_string = "$message_string" . " $network_flag_name";
+
+			# Check if multiple flags are set for this network.
+			if ($flags_amount gt "1") {
+				# Check if the the current flag is the next-to-last one.
+				if ($processed_flags eq $flags_amount - 1) {
+					$message_string = "$message_string" . " and ";
+
+				# Check if the current flag it the last one.
+				} elsif ($processed_flags eq $flags_amount) {
+					# The message is finished add a dot for ending the sentence.
+					$message_string = "$message_string" . ".";
+
+				# Otherwise add a simple comma to the message string.
+				} else {
+					$message_string = "$message_string" . ", ";
+				}
+			} else {
+				# Nothing special to do, simple add a dot to finish the sentence.
+				$message_string = "$message_string" . ".";
+			}
+		}
 
-		# Display notice.
-		print "<h3>This address is marked as $network_flag_name.</h3>\n";
+		# Display the generated notice.
+		print "<h3>$message_string</h3>\n";
 		print "<br>\n";
 	}