Browse Source

Fix issue with multibyte chars in CTCPs

Mixing substrings and byte array offsets is bad...
tags/v0.10.3
Chris Smith 5 years ago
parent
commit
0631aed46e

+ 2
- 0
CHANGELOG View File

@@ -1,5 +1,7 @@
1 1
 vNEXT (in development)
2 2
 
3
+ * Fix issue parsing CTCPs when the content contained multi-byte chars
4
+
3 5
 v0.10.2
4 6
 
5 7
  * Fix handling of multiple long lines sometimes dropping part of the line

+ 1
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/processors/NoticeProcessor.kt View File

@@ -18,7 +18,7 @@ internal class NoticeProcessor : MessageProcessor {
18 18
 
19 19
     private fun handleCtcp(message: IrcMessage, user: User?): List<IrcEvent> {
20 20
         user ?: return emptyList()
21
-        val content = String(message.params[1]).substring(1 until message.params[1].size - 1)
21
+        val content = String(message.params[1].sliceArray(1 until message.params[1].size - 1))
22 22
         val parts = content.split(' ', limit=2)
23 23
         val body = if (parts.size == 2) parts[1] else ""
24 24
         return listOf(CtcpReplyReceived(message.metadata, user, String(message.params[0]), parts[0], body))

+ 1
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/processors/PrivmsgProcessor.kt View File

@@ -20,7 +20,7 @@ internal class PrivmsgProcessor : MessageProcessor {
20 20
     } ?: emptyList()
21 21
 
22 22
     private fun handleCtcp(message: IrcMessage, user: User): IrcEvent {
23
-        val content = String(message.params[1]).substring(1 until message.params[1].size - 1)
23
+        val content = String(message.params[1].sliceArray(1 until message.params[1].size - 1))
24 24
         val parts = content.split(' ', limit=2)
25 25
         val body = if (parts.size == 2) parts[1] else ""
26 26
         return when (parts[0].toUpperCase()) {

+ 14
- 0
src/test/kotlin/com/dmdirc/ktirc/messages/processors/NoticeProcessorTest.kt View File

@@ -58,6 +58,20 @@ internal class NoticeProcessorTest {
58 58
         assertEquals("12345", event.content)
59 59
     }
60 60
 
61
+    @Test
62
+    fun `raises CTCP reply received event with content when containing unicode chars`() {
63
+        val events = PrivmsgProcessor().process(
64
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "NOTICE", params("#crashandburn", "\u0001PING 👩‍💻\u0001")))
65
+        assertEquals(1, events.size)
66
+
67
+        val event = events[0] as CtcpReplyReceived
68
+        assertEquals(TestConstants.time, event.metadata.time)
69
+        assertEquals(User("acidburn", "libby", "root.localhost"), event.user)
70
+        assertEquals("#crashandburn", event.target)
71
+        assertEquals("PING", event.type)
72
+        assertEquals("👩‍💻", event.content)
73
+    }
74
+
61 75
     @Test
62 76
     fun `raises CTCP reply received event without content`() {
63 77
         val events = NoticeProcessor().process(

+ 14
- 0
src/test/kotlin/com/dmdirc/ktirc/messages/processors/PrivmsgProcessorTest.kt View File

@@ -85,6 +85,20 @@ internal class PrivmsgProcessorTest {
85 85
         assertEquals("12345", event.content)
86 86
     }
87 87
 
88
+    @Test
89
+    fun `raises CTCP received event with content when containing unicode chars`() {
90
+        val events = PrivmsgProcessor().process(
91
+                IrcMessage(emptyMap(), "acidburn!libby@root.localhost".toByteArray(), "PRIVMSG", params("#crashandburn", "\u0001PING 👩‍💻\u0001")))
92
+        assertEquals(1, events.size)
93
+
94
+        val event = events[0] as CtcpReceived
95
+        assertEquals(TestConstants.time, event.metadata.time)
96
+        assertEquals(User("acidburn", "libby", "root.localhost"), event.user)
97
+        assertEquals("#crashandburn", event.target)
98
+        assertEquals("PING", event.type)
99
+        assertEquals("👩‍💻", event.content)
100
+    }
101
+
88 102
     @Test
89 103
     fun `raises CTCP received event without content`() {
90 104
         val events = PrivmsgProcessor().process(

Loading…
Cancel
Save