Skip to content

Commit 42d24b8

Browse files
committed
Return error when unknown parameters are passed to API
1 parent 855f9da commit 42d24b8

File tree

3 files changed

+57
-9
lines changed

3 files changed

+57
-9
lines changed

src/jvmMain/kotlin/Application.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ fun Application.main() {
277277
get("/${EVENT_ENTITY_API_NAME}") {
278278
// no role checking here - any user allowed
279279
val parameterBundle = ParameterBundle.buildFromCall(call, page)
280-
if (parameterBundle.hasInvalidParameters()) {
280+
if (parameterBundle.hasInvalidParameters(call, page)) {
281281
call.respond(HttpStatusCode.BadRequest, "Invalid parameters detected in request")
282282
return@get
283283
}
@@ -329,7 +329,7 @@ fun Application.main() {
329329

330330
get("/${EVENT_COUNT_API_NAME}") {
331331
val parameterBundle = ParameterBundle.buildFromCall(call, page)
332-
if (parameterBundle.hasInvalidParameters()) {
332+
if (parameterBundle.hasInvalidParameters(call, page)) {
333333
call.respond(HttpStatusCode.BadRequest, "Invalid parameters detected in request")
334334
return@get
335335
}

src/jvmMain/kotlin/ParameterBundle.kt

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ru.mipt.npm.nica.ems
22

33
import io.ktor.server.application.*
4+
import io.ktor.util.*
45

56
class ParameterBundle(
67
val period_number: Parameter?,
@@ -44,14 +45,41 @@ class ParameterBundle(
4445
}
4546
}
4647

47-
fun hasInvalidParameters(): Boolean {
48-
if (period_number?.validParameter == false || run_number?.validParameter == false
49-
// software_version TODO ?
50-
|| beam_particle?.validParameter == false || target_particle?.validParameter == false ||
51-
energy?.validParameter == false || limit?.validParameter == false ||
52-
offset?.validParameter == false) return true
48+
fun hasInvalidParameters(call: ApplicationCall, page: PageConfig): Boolean {
49+
// Note that parameter can be invalid either if its value is invalid (e.g. incorrect range),
50+
// or if parameter name is just unknown
51+
52+
if (period_number?.validParameter == false ||
53+
run_number?.validParameter == false ||
54+
software_version?.validParameter == false ||
55+
beam_particle?.validParameter == false ||
56+
target_particle?.validParameter == false ||
57+
energy?.validParameter == false ||
58+
limit?.validParameter == false ||
59+
offset?.validParameter == false
60+
) return true
61+
5362
parametersSupplied.forEach { (_ /* name */, value) ->
54-
if (value.validParameter == false) return true
63+
if (!value.validParameter) return true
64+
}
65+
66+
val allowedPageParameters =
67+
page.parameters.map { it.name } +
68+
listOf(
69+
periodConfig.name,
70+
runConfig.name,
71+
softwareConfig.name,
72+
beamParticleConfig.name,
73+
targetParticleConfig.name,
74+
energyConfig.name,
75+
limitConfig.name,
76+
offsetConfig.name
77+
)
78+
79+
for (param in call.parameters.toMap().keys) {
80+
if (param !in allowedPageParameters) {
81+
return true
82+
}
5583
}
5684
return false
5785
}

src/jvmTest/kotlin/TestREST.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,11 +405,31 @@ class RestApiTest {
405405
contentType(ContentType.Application.Json)
406406
}
407407
eventsArray = gson.fromJson(response.bodyAsText(), EventListRepr::class.java)
408+
println(response.status)
409+
println(response.bodyAsText())
408410
assert(event1 in eventsArray.events)
409411
assert(event1_mod_event_num in eventsArray.events)
410412
assertFalse(event2 in eventsArray.events)
411413
assertFalse(event3 in eventsArray.events)
412414

415+
println("************************************************************")
416+
println("Doing incorrect filtering expression")
417+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN&track_number=|") {
418+
contentType(ContentType.Application.Json)
419+
}
420+
println(response.status)
421+
println(response.bodyAsText())
422+
assertEquals(response.status, HttpStatusCode.BadRequest)
423+
424+
println("************************************************************")
425+
println("Doing filtering with unknown parameter")
426+
response = authenticatedClient().get("$BASE_URL/event?period_number=$PERIOD&run_number=$RUN&unknown_param=90") {
427+
contentType(ContentType.Application.Json)
428+
}
429+
println(response.status)
430+
println(response.bodyAsText())
431+
assertEquals(response.status, HttpStatusCode.BadRequest)
432+
413433
println("************************************************************")
414434
println("Delete events")
415435
response = authenticatedClient().delete("$BASE_URL/event") {

0 commit comments

Comments
 (0)