🐛 Fix breaking parser on invalid SSK/USKs
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 17 Jun 2020 17:47:28 +0000 (19:47 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 17 Jun 2020 17:47:28 +0000 (19:47 +0200)
src/main/kotlin/net/pterodactylus/sone/text/SoneTextParser.kt
src/test/kotlin/net/pterodactylus/sone/text/SoneTextParserTest.kt

index 24b04fa..c97a1fc 100644 (file)
@@ -66,13 +66,15 @@ class SoneTextParser @Inject constructor(private val soneProvider: SoneProvider?
                }
                SSK, USK ->
                        try {
-                               FreenetURI(linkWithoutBacklink).let { uri ->
-                                       uri.allMetaStrings
-                                                       ?.takeIf { (it.size > 1) || ((it.size == 1) && (it.single() != "")) }
-                                                       ?.lastOrNull()
-                                                       ?: uri.docName
-                                                       ?: "${uri.keyType}@${uri.routingKey.asFreenetBase64}"
-                               }.let { FreenetLinkPart(linkWithoutBacklink.removeSuffix("/"), it, trusted = context?.routingKey?.contentEquals(FreenetURI(linkWithoutBacklink).routingKey) == true) }
+                               FreenetURI(linkWithoutBacklink)
+                                               .workaroundForFaultyConstructorInFred1485AndBelow()
+                                               .let { uri ->
+                                                       uri.allMetaStrings
+                                                                       ?.takeIf { (it.size > 1) || ((it.size == 1) && (it.single() != "")) }
+                                                                       ?.lastOrNull()
+                                                                       ?: uri.docName
+                                                                       ?: "${uri.keyType}@${uri.routingKey.asFreenetBase64}"
+                                               }.let { FreenetLinkPart(linkWithoutBacklink.removeSuffix("/"), it, trusted = context?.routingKey?.contentEquals(FreenetURI(linkWithoutBacklink).routingKey) == true) }
                        } catch (e: MalformedURLException) {
                                PlainTextPart(linkWithoutBacklink)
                        }
@@ -93,6 +95,9 @@ class SoneTextParser @Inject constructor(private val soneProvider: SoneProvider?
 
 }
 
+private fun FreenetURI.workaroundForFaultyConstructorInFred1485AndBelow() =
+       also { if (it.routingKey == null) throw MalformedURLException("SSK/USK without routing key") }
+
 private fun List<String>.mergeMultipleEmptyLines() = fold(emptyList<String>()) { previous, current ->
        if (previous.isEmpty()) {
                previous + current
index 3367faf..bd14858 100644 (file)
@@ -18,6 +18,7 @@
 package net.pterodactylus.sone.text
 
 import com.google.inject.Guice.*
+import freenet.keys.FreenetURI
 import net.pterodactylus.sone.data.*
 import net.pterodactylus.sone.data.impl.*
 import net.pterodactylus.sone.database.*
@@ -251,6 +252,14 @@ class SoneTextParserTest {
        }
 
        @Test
+       fun `broken usk links is parsed as plain text`() {
+               val context = SoneTextParserContext(IdOnlySone("qM1nmgU-YUnIttmEhqjTl7ifAF3Z6o~5EPwQW03uEQU"))
+               val parts = soneTextParser.parse("USK@/someCrazyName.R1/0", context)
+               FreenetURI("USK@/someCrazyName.R1/0")
+               assertThat("Part Text", convertText(parts), equalTo("USK@/someCrazyName.R1/0"))
+       }
+
+       @Test
        fun `test basic ksk links`() {
                val parts: Iterable<Part> = soneTextParser.parse("KSK@gpl.txt", null)
                assertThat("Part Text", convertText(parts, FreenetLinkPart::class.java), equalTo("[KSK@gpl.txt|KSK@gpl.txt|gpl.txt]"))