From 3a2310f50a97c551317fa3622e17feb3d6445b99 Mon Sep 17 00:00:00 2001
From: Nigel Kukard <nkukard@lbsd.net>
Date: Tue, 26 Nov 2013 21:29:28 +0000
Subject: [PATCH] Better URI parsing

---
 .../plugins/webserver/pages/configmanager.pm       |  8 ++++----
 .../plugins/webserver/pages/limits.pm              | 10 +++++-----
 .../plugins/webserver/pages/statistics.pm          |  6 +++---
 opentrafficshaper/utils.pm                         | 14 ++++++++++----
 4 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/opentrafficshaper/plugins/webserver/pages/configmanager.pm b/opentrafficshaper/plugins/webserver/pages/configmanager.pm
index b180a9f..08be843 100644
--- a/opentrafficshaper/plugins/webserver/pages/configmanager.pm
+++ b/opentrafficshaper/plugins/webserver/pages/configmanager.pm
@@ -211,7 +211,7 @@ sub override_addedit
 		# We need a ID first of all...
 		if (defined($queryParams->{'oid'})) {
 			# Check if we get some data back when pulling the override from the backend
-			if (defined($formData = getOverride($queryParams->{'oid'}))) {
+			if (defined($formData = getOverride($queryParams->{'oid'}->{'value'}))) {
 				# Setup our checkboxes
 				foreach my $checkbox (@formElementCheckboxes) {
 					if (defined($formData->{$checkbox})) {
@@ -223,7 +223,7 @@ sub override_addedit
 				# XXX - TODO
 			# If we didn't get any data, then something went wrong
 			} else {
-				my $encodedID = encode_entities($queryParams->{'oid'});
+				my $encodedID = encode_entities($queryParams->{'oid'}->{'value'});
 				push(@errors,"Override data could not be loaded using oid '$encodedID'");
 			}
 			# Lastly if we were given a oid, this is actually an edit
@@ -600,10 +600,10 @@ EOF
 	}
 
 	# Grab the override
-	my $override = getOverride($queryParams->{'oid'});
+	my $override = getOverride($queryParams->{'oid'}->{'value'});
 
 	# Make the oid safe for HTML
-	my $encodedID = encode_entities($queryParams->{'oid'});
+	my $encodedID = encode_entities($queryParams->{'oid'}->{'value'});
 
 	# Make sure the oid was valid... we would have an override now if it was
 	if (!defined($override)) {
diff --git a/opentrafficshaper/plugins/webserver/pages/limits.pm b/opentrafficshaper/plugins/webserver/pages/limits.pm
index 9aafe25..b89f14f 100644
--- a/opentrafficshaper/plugins/webserver/pages/limits.pm
+++ b/opentrafficshaper/plugins/webserver/pages/limits.pm
@@ -110,7 +110,7 @@ EOF
 
 		# Conditionals
 		if (defined($queryParams->{'source'})) {
-			if ($limit->{'Source'} ne $queryParams->{'source'}) {
+			if ($limit->{'Source'} ne $queryParams->{'source'}->{'value'}) {
 				next;
 			}
 		}
@@ -323,7 +323,7 @@ sub limit_addedit
 		# We need a key first of all...
 		if (defined($queryParams->{'lid'})) {
 			# Check if we get some data back when pulling the limit from the backend
-			if (defined($formData = getLimit($queryParams->{'lid'}))) {
+			if (defined($formData = getLimit($queryParams->{'lid'}->{'value'}))) {
 				# We need to make sure we're only editing our own limits
 				if ($formData->{'Source'} ne "plugin.webserver.limits") {
 					return (HTTP_TEMPORARY_REDIRECT,'limits');
@@ -333,7 +333,7 @@ sub limit_addedit
 # XXX - TODO
 			# If we didn't get any data, then something went wrong
 			} else {
-				my $encodedID = encode_entities($queryParams->{'lid'});
+				my $encodedID = encode_entities($queryParams->{'lid'}->{'value'});
 				push(@errors,"Limit data could not be loaded using limit ID '$encodedID'");
 			}
 			# Lastly if we were given a key, this is actually an edit
@@ -702,10 +702,10 @@ EOF
 	}
 
 	# Grab the limit
-	my $limit = getLimit($queryParams->{'lid'});
+	my $limit = getLimit($queryParams->{'lid'}->{'value'});
 
 	# Make the key safe for HTML
-	my $encodedLID = encode_entities($queryParams->{'lid'});
+	my $encodedLID = encode_entities($queryParams->{'lid'}->{'value'});
 
 	# Make sure the limit ID is valid... we would have a limit now if it was
 	if (!defined($limit)) {
diff --git a/opentrafficshaper/plugins/webserver/pages/statistics.pm b/opentrafficshaper/plugins/webserver/pages/statistics.pm
index d3dd930..b5018dc 100644
--- a/opentrafficshaper/plugins/webserver/pages/statistics.pm
+++ b/opentrafficshaper/plugins/webserver/pages/statistics.pm
@@ -74,7 +74,7 @@ EOF
 			goto END;
 		}
 		# Check if we get some data back when pulling the limit from the backend
-		if (!defined($limit = getLimit($queryParams->{'lid'}))) {
+		if (!defined($limit = getLimit($queryParams->{'lid'}->{'value'}))) {
 			$content .=<<EOF;
 				<tr class="info">
 					<td colspan="8"><p class="text-center">No Results</p></td>
@@ -144,12 +144,12 @@ sub databylimit
 	}
 
 	my $limit;
-	if (!defined($limit = getLimit($queryParams->{'lid'}))) {
+	if (!defined($limit = getLimit($queryParams->{'lid'}->{'value'}))) {
 		return (HTTP_OK,{ 'error' => 'Invalid limit' },{ 'type' => 'json' });
 	}
 
 	# Pull in stats data
-	my $statsData = opentrafficshaper::plugins::statistics::getStatsByLID($queryParams->{'lid'});
+	my $statsData = opentrafficshaper::plugins::statistics::getStatsByLID($queryParams->{'lid'}->{'value'});
 
 	# First stage refinement
 	my $rawData;
diff --git a/opentrafficshaper/utils.pm b/opentrafficshaper/utils.pm
index efdbc0c..88589fd 100644
--- a/opentrafficshaper/utils.pm
+++ b/opentrafficshaper/utils.pm
@@ -79,17 +79,23 @@ sub parseFormContent
 	return \%res;
 }
 
+
 # Parse query data
 sub parseURIQuery
 {
 	my $request = shift;
 	my %res;
 
-	use URI::QueryParam;
 
-	# Pull in URL params
-	foreach my $key ($request->uri->query_param) {
-		$res{$key} = $request->uri->query_param($key);
+	# Grab URI components
+	my @components = $request->uri->query_form;
+	# Loop with the components in sets of name & value
+	while (@components) {
+		my ($name,$value) = (shift(@components),shift(@components));
+
+		# Store values and the last value we go
+		push(@{$res{$name}->{'values'}},$value);
+		$res{$name}->{'value'} = $value;
 	}
 
 	return \%res;
-- 
GitLab