Skip to content
Snippets Groups Projects
Unverified Commit 16285fea authored by Matthias Urhahn's avatar Matthias Urhahn Committed by GitHub
Browse files

Add missing censor for raw teletan input (EXPOSUREAPP-7551) (#3322)

parent 6a8cc5e6
No related branches found
No related tags found
No related merge requests found
...@@ -13,6 +13,7 @@ import de.rki.coronawarnapp.bugreporting.censors.presencetracing.CheckInsCensor ...@@ -13,6 +13,7 @@ import de.rki.coronawarnapp.bugreporting.censors.presencetracing.CheckInsCensor
import de.rki.coronawarnapp.bugreporting.censors.presencetracing.TraceLocationCensor import de.rki.coronawarnapp.bugreporting.censors.presencetracing.TraceLocationCensor
import de.rki.coronawarnapp.bugreporting.censors.submission.CoronaTestCensor import de.rki.coronawarnapp.bugreporting.censors.submission.CoronaTestCensor
import de.rki.coronawarnapp.bugreporting.censors.submission.PcrQrCodeCensor import de.rki.coronawarnapp.bugreporting.censors.submission.PcrQrCodeCensor
import de.rki.coronawarnapp.bugreporting.censors.submission.PcrTeleTanCensor
import de.rki.coronawarnapp.bugreporting.censors.submission.RACoronaTestCensor import de.rki.coronawarnapp.bugreporting.censors.submission.RACoronaTestCensor
import de.rki.coronawarnapp.bugreporting.censors.submission.RatProfileCensor import de.rki.coronawarnapp.bugreporting.censors.submission.RatProfileCensor
import de.rki.coronawarnapp.bugreporting.censors.submission.RatQrCodeCensor import de.rki.coronawarnapp.bugreporting.censors.submission.RatQrCodeCensor
...@@ -83,6 +84,10 @@ class BugReportingSharedModule { ...@@ -83,6 +84,10 @@ class BugReportingSharedModule {
@IntoSet @IntoSet
fun pcrQrCodeCensor(censor: PcrQrCodeCensor): BugCensor = censor fun pcrQrCodeCensor(censor: PcrQrCodeCensor): BugCensor = censor
@Provides
@IntoSet
fun pcrTeleTanCensor(censor: PcrTeleTanCensor): BugCensor = censor
@Provides @Provides
@IntoSet @IntoSet
fun ratQrCodeCensor(censor: RatQrCodeCensor): BugCensor = censor fun ratQrCodeCensor(censor: RatQrCodeCensor): BugCensor = censor
......
package de.rki.coronawarnapp.bugreporting.censors.submission
import dagger.Reusable
import de.rki.coronawarnapp.bugreporting.censors.BugCensor
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import javax.inject.Inject
@Reusable
class PcrTeleTanCensor @Inject constructor() : BugCensor {
override suspend fun checkLog(message: String): BugCensor.CensorContainer? = mutex.withLock {
if (transientTeleTans.isEmpty()) return null
var container = BugCensor.CensorContainer(message)
transientTeleTans.forEach {
container = container.censor(it, PLACEHOLDER + it.takeLast(3))
}
return container.nullIfEmpty()
}
companion object {
private val mutex = Mutex()
private val transientTeleTans = mutableSetOf<String>()
suspend fun addTan(tan: String) = mutex.withLock {
transientTeleTans.add(tan)
}
suspend fun clearTans() = mutex.withLock {
transientTeleTans.clear()
}
private const val PLACEHOLDER = "#######"
}
}
...@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData ...@@ -4,6 +4,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.asLiveData import androidx.lifecycle.asLiveData
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.bugreporting.censors.submission.PcrTeleTanCensor
import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN
import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.coronatest.type.CoronaTest
import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.ExceptionCategory
...@@ -53,6 +54,8 @@ class SubmissionTanViewModel @AssistedInject constructor( ...@@ -53,6 +54,8 @@ class SubmissionTanViewModel @AssistedInject constructor(
} }
launch { launch {
PcrTeleTanCensor.addTan(teletan.value)
val pcrTestAlreadyStored = submissionRepository.testForType(CoronaTest.Type.PCR).first() val pcrTestAlreadyStored = submissionRepository.testForType(CoronaTest.Type.PCR).first()
if (pcrTestAlreadyStored != null) { if (pcrTestAlreadyStored != null) {
val coronaTestTAN = CoronaTestTAN.PCR(tan = teletan.value) val coronaTestTAN = CoronaTestTAN.PCR(tan = teletan.value)
......
package de.rki.coronawarnapp.bugreporting.censors
import de.rki.coronawarnapp.bugreporting.censors.submission.PcrTeleTanCensor
import io.kotest.matchers.shouldBe
import io.mockk.MockKAnnotations
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import testhelpers.BaseTest
class PcrTeleTanCensorTest : BaseTest() {
private val testTans = listOf(
"WF894R5XX5",
"XJYNJU3MTB",
"2MU6N6JRE5",
"ZX3EWW4JX7",
"5ARBA4W2NC",
"FQEKD78DVC",
"WBNNPG3HGF",
"E856RHPKY9",
)
@BeforeEach
fun setup() {
MockKAnnotations.init(this)
}
@AfterEach
fun teardown() {
runBlocking { PcrTeleTanCensor.clearTans() }
}
private fun createInstance() = PcrTeleTanCensor()
@Test
fun `censoring replaces the logline message`() = runBlockingTest {
val instance = createInstance()
testTans.forEach {
PcrTeleTanCensor.addTan(it)
val toCensor = "I'm a shy teletan: $it"
instance.checkLog(toCensor)!!
.compile()!!.censored shouldBe "I'm a shy teletan: #######${it.takeLast(3)}"
}
}
@Test
fun `censoring replaces the logline message - multiple instances`() = runBlockingTest {
testTans.forEach {
PcrTeleTanCensor.addTan(it)
val toCensor = "I'm a shy teletan: $it"
createInstance().checkLog(toCensor)!!
.compile()!!.censored shouldBe "I'm a shy teletan: #######${it.takeLast(3)}"
}
}
@Test
fun `censoring returns null if there is no match`() = runBlockingTest {
val instance = createInstance()
testTans.map { it.substring(2) }.forEach {
PcrTeleTanCensor.addTan(it)
val toCensor = "I'm a shy teletan: $it"
instance.checkLog(toCensor)!!
.compile()!!.censored shouldBe "I'm a shy teletan: #######${it.takeLast(3)}"
}
}
@Test
fun `censoring aborts if no teletan was set`() = runBlockingTest {
val instance = createInstance()
testTans.forEach {
val toCensor = "I'm a shy teletan: $it"
instance.checkLog(toCensor) shouldBe null
}
}
}
package de.rki.coronawarnapp.coronatest.type.pcr package de.rki.coronawarnapp.coronatest.type.pcr
import de.rki.coronawarnapp.bugreporting.censors.submission.PcrTeleTanCensor
import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode
import de.rki.coronawarnapp.coronatest.server.CoronaTestResult import de.rki.coronawarnapp.coronatest.server.CoronaTestResult
import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.PCR_INVALID import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.PCR_INVALID
...@@ -27,9 +28,11 @@ import io.mockk.coEvery ...@@ -27,9 +28,11 @@ import io.mockk.coEvery
import io.mockk.every import io.mockk.every
import io.mockk.impl.annotations.MockK import io.mockk.impl.annotations.MockK
import io.mockk.just import io.mockk.just
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runBlockingTest import kotlinx.coroutines.test.runBlockingTest
import org.joda.time.Duration import org.joda.time.Duration
import org.joda.time.Instant import org.joda.time.Instant
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import testhelpers.BaseTest import testhelpers.BaseTest
...@@ -82,6 +85,11 @@ class PCRProcessorTest : BaseTest() { ...@@ -82,6 +85,11 @@ class PCRProcessorTest : BaseTest() {
} }
} }
@AfterEach
fun teardown() {
runBlocking { PcrTeleTanCensor.clearTans() }
}
fun createInstance() = PCRProcessor( fun createInstance() = PCRProcessor(
timeStamper = timeStamper, timeStamper = timeStamper,
submissionService = submissionService, submissionService = submissionService,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment