matrix-org / matrix-appservice-irc

Node.js IRC bridge for Matrix
Apache License 2.0
465 stars 151 forks source link

Message splitting error with multi-byte characters #706

Closed zouppen closed 1 year ago

zouppen commented 5 years ago

If the message contains UTF-8 characters which are multi-byte such as umlauted characters (öä) the long message splitting works incorrectly.

IRC server message limits are set in bytes and you are probably splitting by characters and it causes too long line to be sent over the wire.

Proposed fix: First encode the message to UTF-8 and then split the message. When splitting, take care not to make inter-character split (do not split if the next line contains byte starting with bits 10xxxxxx). Try to split between the words if possible. See UTF-8 specification.

To reproduce the bug, use the following Matrix message:

{
    "content": {
        "body": "ostin tyttöystävälleni vhs-nauhurin huuto.netistä muistaakseni 7 eurolla. se oli mukavan pieni, kaukosäädin oli ja aikaisin päivämäärä minkä se huoli oli 1997 eli suhteellisen \"uusi\" laite. pari kasettia katsottiin sillä niin se lakkasi toimimasta, valikot näkyivät mutta kasetit eivät. yksi kasetti mikä katsottiin oli emännän vanhojen tanssien kasetti. lappeenrannan kojekulman omistaja, sellainen noin 70v mies tietää paljon laitteista ja sanoi että todennäköisesti sitä vanhojentanssien kasettia on säilytetty vuosien aikana välillä kylmässä ja välillä lämpimässä ja siitä syystä magneettinen mönjä tukki kuvapäät. laitteen voisi korjata mutta se vaatisi että irrottaa kuvarummun ja liottaa sen. heitin laitteen gigantin romuihin ja ostin emännälle uuden 5 eurolla. siinä on hifi-stereo ääni mutta ei kaukosäädintä ja laite on todella iso. naisille sisustus on tärkeää",
        "external_url": "https://t.me/linkkijkl/5857",
        "m.relates_to": null,
        "msgtype": "m.text"
    },
    "event_id": "$154099536273551vUaVk:hacklab.fi",
    "origin_server_ts": 1540995361000,
    "sender": "@_telegram_386156013:hacklab.fi",
    "type": "m.room.message",
    "unsigned": {
        "age": 3041044
    }
}

It results the folliowing IRC lines:

16:16 < HarriHalinen[t]> ostin tyttöystävälleni vhs-nauhurin huuto.netistä muistaakseni 7 eurolla. se oli mukavan pieni, kaukosäädin oli ja aikaisin päivämäärä minkä se huoli oli 1997 eli suhteellisen "uusi" laite. pari kasettia katsottiin sillä niin se lakkasi toimimasta, valikot näkyivät mutta kasetit eivät. yksi kasetti mikä katsottiin oli emännän vanhojen tanssien kasetti. lappeenrannan kojekulman omistaja, sellainen noin 70v mie
16:16 < HarriHalinen[t]> laitteista ja sanoi että todennäköisesti sitä vanhojentanssien kasettia on säilytetty vuosien aikana välillä kylmässä ja välillä lämpimässä ja siitä syystä magneettinen mönjä tukki kuvapäät. laitteen voisi korjata mutta se vaatisi että irrottaa kuvarummun ja liottaa sen. heitin laitteen gigantin romuihin ja ostin emännälle uuden 5 eurolla. siinä on hifi-stereo ääni mutta ei kaukosäädintä ja laite on

If you look carefully, in the first part there is missing s tietää paljon and on the second message todella iso. naisille sisustus on tärkeää.

14mRh4X0r commented 5 years ago

Some digging through the code reveals that this is actually an issue in node-irc. It seems someone already opened a pull request at matrix-org/node-irc#30.

tadzik commented 3 years ago

This seems to have been fixed along the way, probably by the node-irc changes. I'll add a testcase for it in case it resurfaces – unless you can still reproduce it with some other messages?

Half-Shot commented 1 year ago

Sounds like fixed?