Skip to content

Commit ce233d3

Browse files
authored
Reject requests with unsupported versions (#313)
* Reject OGC requests with unsupported versions
1 parent f2e040b commit ce233d3

File tree

6 files changed

+40
-12
lines changed

6 files changed

+40
-12
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
## Fixed
10+
11+
- Service endpoints reject requests with unsupported version parameters [#313](https://github.com/geotrellis/geotrellis-server/pull/313)
12+
913
## [4.3.0] - 2021-02-12
1014

1115
## Added

ogc/src/main/scala/geotrellis/server/ogc/params/ParamError.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ object ParamError {
5858
s"""Unsupported format: '$format'"""
5959
}
6060

61+
final case class NoSupportedVersionError(requestedVersions: List[String], supportedVersions: List[String]) extends ParamError {
62+
def errorMessage =
63+
s"""No available version in ${supportedVersions.mkString(", ")}: ${requestedVersions.mkString(", ")}"""
64+
}
65+
6166
def generateErrorMessage(errors: List[ParamError]): String =
6267
errors.map(_.errorMessage).mkString("; ")
6368
}

ogc/src/main/scala/geotrellis/server/ogc/params/ParamMap.scala

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,26 @@ case class ParamMap(params: Map[String, Seq[String]]) {
7878
}).toValidatedNel
7979

8080
def validatedVersion(default: String): ValidatedNel[ParamError, String] =
81+
validatedVersion(default, Set(default))
82+
83+
def validatedVersion(default: String, supportedVersions: Set[String]): ValidatedNel[ParamError, String] =
8184
(getParams("version") match {
82-
case Some(Nil) => Valid(default)
83-
case Some(version :: Nil) => Valid(version)
84-
case Some(_) => Invalid(ParamError.RepeatedParam("version"))
85-
case None =>
85+
case Some(version :: Nil) if supportedVersions.contains(version) => Valid(version)
86+
case Some(Nil) => Valid(default)
87+
case Some(i :: Nil) => Invalid(ParamError.InvalidValue("version", i, supportedVersions.toList))
88+
case None =>
8689
// Can send "acceptversions" instead
8790
getParams("acceptversions") match {
8891
case Some(Nil) =>
8992
Valid(default)
9093
case Some(versions :: Nil) =>
91-
Valid(versions.split(",").max)
94+
val requestedVersions = versions.split(",")
95+
val intersection = requestedVersions.toSet & supportedVersions
96+
if (intersection.isEmpty) {
97+
Invalid(ParamError.NoSupportedVersionError(requestedVersions.toList, supportedVersions.toList))
98+
} else {
99+
Valid(intersection.max)
100+
}
92101
case Some(_) =>
93102
Invalid(ParamError.RepeatedParam("acceptversions"))
94103
case None =>

ogc/src/main/scala/geotrellis/server/ogc/wcs/WcsParams.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ import geotrellis.vector.{Extent, ProjectedExtent}
2626
import cats.data.Validated._
2727
import cats.data.{Validated, ValidatedNel, NonEmptyList => NEL}
2828
import cats.syntax.apply._
29+
import cats.syntax.applicativeError._
2930
import cats.syntax.option._
31+
import cats.syntax.validated._
3032

3133
import scala.util.Try
3234
import java.net.URI
35+
import geotrellis.server.ogc.params.ParamError.MissingParam
3336

3437
abstract sealed class WcsParams {
3538
val version: String
@@ -108,6 +111,8 @@ case class GetCoverageWcsParams(
108111

109112
object WcsParams {
110113

114+
val wcsVersion = "1.1.1"
115+
111116
/** Defines valid request types, and the WcsParams to build from them. */
112117
private val requestMap: Map[String, ParamMap => ValidatedNel[ParamError, WcsParams]] =
113118
Map(
@@ -133,14 +138,14 @@ object WcsParams {
133138

134139
object GetCapabilitiesWcsParams {
135140
def build(params: ParamMap): ValidatedNel[ParamError, WcsParams] = {
136-
val versionParam = params.validatedVersion("1.1.1")
141+
val versionParam = params.validatedVersion(WcsParams.wcsVersion)
137142
versionParam.map { version: String => GetCapabilitiesWcsParams(version) }
138143
}
139144
}
140145

141146
object DescribeCoverageWcsParams {
142147
def build(params: ParamMap): ValidatedNel[ParamError, WcsParams] = {
143-
val versionParam = params.validatedVersion("1.1.1")
148+
val versionParam = params.validatedVersion(WcsParams.wcsVersion)
144149

145150
versionParam
146151
.andThen { version: String =>
@@ -171,7 +176,7 @@ object GetCoverageWcsParams {
171176
)
172177

173178
def build(params: ParamMap): ValidatedNel[ParamError, WcsParams] = {
174-
val versionParam = params.validatedVersion("1.1.1")
179+
val versionParam = params.validatedVersion(WcsParams.wcsVersion)
175180

176181
versionParam
177182
.andThen { version: String =>

ogc/src/main/scala/geotrellis/server/ogc/wms/WmsParams.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ abstract sealed class WmsParams {
3333
}
3434

3535
object WmsParams {
36+
37+
val wmsVersion = "1.3.0"
38+
3639
final case class GetCapabilities(
3740
version: String,
3841
format: Option[String],
@@ -41,7 +44,7 @@ object WmsParams {
4144

4245
object GetCapabilities {
4346
def build(params: ParamMap): ValidatedNel[ParamError, WmsParams] = {
44-
(params.validatedVersion("1.3.0"), params.validatedOptionalParam("format"), params.validatedOptionalParam("updatesequence"))
47+
(params.validatedVersion(wmsVersion), params.validatedOptionalParam("format"), params.validatedOptionalParam("updatesequence"))
4548
.mapN(GetCapabilities.apply)
4649
}
4750
}
@@ -72,7 +75,7 @@ object WmsParams {
7275
object GetMap {
7376
def build(params: ParamMap): ValidatedNel[ParamError, WmsParams] = {
7477
val versionParam =
75-
params.validatedVersion("1.3.0")
78+
params.validatedVersion(wmsVersion)
7679

7780
versionParam
7881
.andThen { version: String =>

ogc/src/main/scala/geotrellis/server/ogc/wmts/WmtsParams.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ abstract sealed class WmtsParams {
3434
object WmtsParams {
3535
lazy val logger = org.log4s.getLogger
3636

37+
val wmtsVersion = "1.0.0"
38+
3739
final case class GetCapabilities(
3840
version: String,
3941
format: Option[String],
@@ -42,7 +44,7 @@ object WmtsParams {
4244

4345
object GetCapabilities {
4446
def build(params: ParamMap): ValidatedNel[ParamError, WmtsParams] = {
45-
(params.validatedVersion("1.0.0"), params.validatedOptionalParam("format"), params.validatedOptionalParam("updatesequence"))
47+
(params.validatedVersion(wmtsVersion), params.validatedOptionalParam("format"), params.validatedOptionalParam("updatesequence"))
4648
.mapN(GetCapabilities.apply)
4749
}
4850
}
@@ -64,7 +66,7 @@ object WmtsParams {
6466
def build(params: ParamMap): ValidatedNel[ParamError, WmtsParams] = {
6567
logger.trace(s"PARAM MAP: ${params.params}")
6668
val versionParam =
67-
params.validatedVersion("1.0.0")
69+
params.validatedVersion(wmtsVersion)
6870

6971
versionParam
7072
.andThen { version: String =>

0 commit comments

Comments
 (0)