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
 vNEXT (in development)
1
 vNEXT (in development)
2
 
2
 
3
+ * Fix issue parsing CTCPs when the content contained multi-byte chars
4
+
3
 v0.10.2
5
 v0.10.2
4
 
6
 
5
  * Fix handling of multiple long lines sometimes dropping part of the line
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
 
18
 
19
     private fun handleCtcp(message: IrcMessage, user: User?): List<IrcEvent> {
19
     private fun handleCtcp(message: IrcMessage, user: User?): List<IrcEvent> {
20
         user ?: return emptyList()
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
         val parts = content.split(' ', limit=2)
22
         val parts = content.split(' ', limit=2)
23
         val body = if (parts.size == 2) parts[1] else ""
23
         val body = if (parts.size == 2) parts[1] else ""
24
         return listOf(CtcpReplyReceived(message.metadata, user, String(message.params[0]), parts[0], body))
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
     } ?: emptyList()
20
     } ?: emptyList()
21
 
21
 
22
     private fun handleCtcp(message: IrcMessage, user: User): IrcEvent {
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
         val parts = content.split(' ', limit=2)
24
         val parts = content.split(' ', limit=2)
25
         val body = if (parts.size == 2) parts[1] else ""
25
         val body = if (parts.size == 2) parts[1] else ""
26
         return when (parts[0].toUpperCase()) {
26
         return when (parts[0].toUpperCase()) {

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

58
         assertEquals("12345", event.content)
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
     @Test
75
     @Test
62
     fun `raises CTCP reply received event without content`() {
76
     fun `raises CTCP reply received event without content`() {
63
         val events = NoticeProcessor().process(
77
         val events = NoticeProcessor().process(

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

85
         assertEquals("12345", event.content)
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
     @Test
102
     @Test
89
     fun `raises CTCP received event without content`() {
103
     fun `raises CTCP received event without content`() {
90
         val events = PrivmsgProcessor().process(
104
         val events = PrivmsgProcessor().process(

Loading…
Cancel
Save