diff --git a/server/src/kvengine/encoding.rs b/server/src/kvengine/encoding.rs index cef490b9..ae1b28af 100644 --- a/server/src/kvengine/encoding.rs +++ b/server/src/kvengine/encoding.rs @@ -192,18 +192,50 @@ fn test_invalid_b64_len65() { #[test] fn test_the_emojis() { + // use variable width chars for having fun with the validation let emojistr = r#" + πŸ˜πŸ‘©πŸ½πŸ‘¨β€πŸ¦° πŸ‘¨πŸΏβ€πŸ¦° πŸ‘¨β€πŸ¦± πŸ‘¨πŸΏβ€πŸ¦± πŸ¦ΉπŸΏβ€β™‚οΈπŸ‘Ύ πŸ™‡ πŸ’ πŸ™… πŸ™† πŸ™‹ πŸ™Ž πŸ™πŸ΅ πŸ™ˆ πŸ™‰ πŸ™Šβ€οΈ πŸ’” πŸ’Œ πŸ’• πŸ’ž πŸ’“ πŸ’— πŸ’– πŸ’˜ πŸ’ + πŸ’Ÿ πŸ’œ πŸ’› πŸ’š πŸ’™βœ‹πŸΏπŸ’ͺπŸΏπŸ‘πŸΏπŸ™ŒπŸΏπŸ‘πŸΏπŸ™πŸΏπŸ‘¨β€πŸ‘©β€πŸ‘¦πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦πŸ‘¨β€πŸ‘¨β€πŸ‘¦πŸ‘©β€πŸ‘©β€πŸ‘§πŸ‘¨β€πŸ‘¦πŸ‘¨β€πŸ‘§β€πŸ‘¦πŸ‘©β€πŸ‘¦πŸ‘©β€πŸ‘§β€πŸ‘¦πŸšΎπŸ†’πŸ†“πŸ†•πŸ†–πŸ†—πŸ†™πŸ§0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9οΈβƒ£πŸ”Ÿ So, what's up πŸ”Ίfolks. This text will have a bunch πŸ’ of emojis πŸ˜‚πŸ˜„πŸ˜ŠπŸ˜€. Trust me, 🀠 it's really useless. I mean, I don't even know πŸ€” why it exists. It has to have random ones like these πŸ‘¦πŸ‘ΌπŸ‘©πŸ‘¨πŸ‘§. Don't ask me why. It's unicode afterall 😏. But yeah, it's nice. They say a pictureπŸ€³πŸ“ΈπŸ“ΈπŸ–Ό tells a thousand 1⃣0⃣0⃣0⃣ words πŸ“‘πŸ“•πŸ“—πŸ“˜πŸ“™πŸ““πŸ“”πŸ“”πŸ“’πŸ“šπŸ“– while emojis make us parse a thousand codepoints. But guess what, it's a fun form of expression 😍. - Sometimes even more 😘😘😚...umm never mind that. Do you know how to say hello - in Greek πŸ‡¬πŸ‡·? Ξ³Ξ΅ΞΉΞ±πŸ‘‹. Nice! How about some.....Hej! That's πŸ‡ΈπŸ‡ͺ. But yeah, - I'll keep saying "hello" because it's my default language (en-US πŸ‡ΊπŸ‡Έ). + Sometimes even more 😘😘😚...umm never mind that.α›’Ζ†Γ’αš’Η„MαšΈΗ°ΓšΗ–Δ β±ͺΔ±β±ΎΗ“[α›„β±ΎΔŒE\n + Δ¨Γžβ±ΊΓΏΖΉΝ΅Ε‚α›ŽΕ‘Vα›©{mɏȜČƿƑɏ4ᛍg*[ΘšΔΌαš§Γ’Ε†Ι„Ε…ΕŠΘ„Ζ΄AüȍcᚷƐȎβ±₯Θ”!Ε !Δ¨Γžβ±ΊΓΏΖΉΝ΅Ε‚α›ŽΕ‘Vα›©{mɏȜČƿƑɏ4ᛍg*[ΘšΔΌαš§Γ’Ε†Ι„Ε…ΕŠΘ„Ζ΄AüȍcᚷƐ + Ȏβ±₯Θ”!Ε !α›žΕ™η”°δΈ­γ•γ‚“γ«γ‚γ’γ¦δΈ‹γ•γ„γƒ‘γƒΌγƒ†γ‚£γƒΌγΈθ‘Œγ‹γͺγ„γ‹ε’Œθ£½ζΌ’θͺžιƒ¨θ½ζ Όμ‚¬νšŒκ³Όν•™μ›μ–΄ν•™μ—°κ΅¬μ†Œ + μ°¦μ°¨λ₯Όνƒ€κ³ μ˜¨νŽ²μ‹œλ§¨κ³Όμ‘›λ‹€λ¦¬λ˜ λ°©κ°ν•˜η€Ύζœƒη§‘ε­Έι™’θͺžε­Έη ”η©Άζ‰€μšΈλž€λ°”ν† λ₯΄π œŽπ œ±π Ήπ ±“𠱸𠲖𠳏Variable length ftw! That was entirely random πŸ€ͺπŸ₯΄οΈπŸ˜œ. Yes, very randomπŸ‡ΊπŸ‡³πŸ¦…. Afterall, we're just testingπŸ§ͺ️πŸͺ§ our validation state machineβš™οΈπŸ“ πŸͺ‘. - "#; + "#.as_bytes().to_owned(); assert!(is_utf8(emojistr)); } + +#[test] +fn test_the_emojis_with_invalid_codepoint() { + // make sure we use bytes instead of strs because pushing into a raw string + // will automatically escape the bad codepoints + let mut emojistr = r#" + πŸ˜πŸ‘©πŸ½πŸ‘¨β€πŸ¦° πŸ‘¨πŸΏβ€πŸ¦° πŸ‘¨β€πŸ¦± πŸ‘¨πŸΏβ€πŸ¦± πŸ¦ΉπŸΏβ€β™‚οΈπŸ‘Ύ πŸ™‡ πŸ’ πŸ™… πŸ™† πŸ™‹ πŸ™Ž πŸ™πŸ΅ πŸ™ˆ πŸ™‰ πŸ™Šβ€οΈ πŸ’” πŸ’Œ πŸ’• πŸ’ž πŸ’“ πŸ’— πŸ’– πŸ’˜ πŸ’ + πŸ’Ÿ πŸ’œ πŸ’› πŸ’š πŸ’™βœ‹πŸΏπŸ’ͺπŸΏπŸ‘πŸΏπŸ™ŒπŸΏπŸ‘πŸΏπŸ™πŸΏπŸ‘¨β€πŸ‘©β€πŸ‘¦πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦πŸ‘¨β€πŸ‘¨β€πŸ‘¦πŸ‘©β€πŸ‘©β€πŸ‘§πŸ‘¨β€πŸ‘¦πŸ‘¨β€πŸ‘§β€πŸ‘¦πŸ‘©β€πŸ‘¦πŸ‘©β€πŸ‘§β€πŸ‘¦πŸšΎπŸ†’πŸ†“πŸ†•πŸ†–πŸ†—πŸ†™πŸ§0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9οΈβƒ£πŸ”Ÿ + So, what's up πŸ”Ίfolks. This text will have a bunch πŸ’ of emojis πŸ˜‚πŸ˜„πŸ˜ŠπŸ˜€. + Trust me, 🀠 it's really useless. I mean, I don't even know πŸ€” why it exists. + It has to have random ones like these πŸ‘¦πŸ‘ΌπŸ‘©πŸ‘¨πŸ‘§. Don't ask me why. + It's unicode afterall 😏. But yeah, it's nice. They say a pictureπŸ€³πŸ“ΈπŸ“ΈπŸ–Ό tells + a thousand 1⃣0⃣0⃣0⃣ words πŸ“‘πŸ“•πŸ“—πŸ“˜πŸ“™πŸ““πŸ“”"#.as_bytes().to_owned(); + // add the offending codepoints + emojistr.extend(b"\xF0\x99"); + // and some more for spamming + let rem = r#"πŸ“”πŸ“’πŸ“šπŸ“– while emojis make us parse a + thousand codepoints. But guess what, it's a fun form of expression 😍. + Sometimes even more 😘😘😚...umm never mind that.α›’Ζ†Γ’αš’Η„MαšΈΗ°ΓšΗ–Δ β±ͺΔ±β±ΎΗ“[α›„β±ΎΔŒE\n + Δ¨Γžβ±ΊΓΏΖΉΝ΅Ε‚α›ŽΕ‘Vα›©{mɏȜČƿƑɏ4ᛍg*[ΘšΔΌαš§Γ’Ε†Ι„Ε…ΕŠΘ„Ζ΄AüȍcᚷƐȎβ±₯Θ”!Ε !Δ¨Γžβ±ΊΓΏΖΉΝ΅Ε‚α›ŽΕ‘Vα›©{mɏȜČƿƑɏ4ᛍg*[ΘšΔΌαš§Γ’Ε†Ι„Ε…ΕŠΘ„Ζ΄AüȍcᚷƐ + Ȏβ±₯Θ”!Ε !α›žΕ™η”°δΈ­γ•γ‚“γ«γ‚γ’γ¦δΈ‹γ•γ„γƒ‘γƒΌγƒ†γ‚£γƒΌγΈθ‘Œγ‹γͺγ„γ‹ε’Œθ£½ζΌ’θͺžιƒ¨θ½ζ Όμ‚¬νšŒκ³Όν•™μ›μ–΄ν•™μ—°κ΅¬μ†Œ + μ°¦μ°¨λ₯Όνƒ€κ³ μ˜¨νŽ²μ‹œλ§¨κ³Όμ‘›λ‹€λ¦¬λ˜ λ°©κ°ν•˜η€Ύζœƒη§‘ε­Έι™’θͺžε­Έη ”η©Άζ‰€μšΈλž€λ°”ν† λ₯΄π œŽπ œ±π Ήπ ±“𠱸𠲖𠳏Variable length ftw! + That was entirely random πŸ€ͺπŸ₯΄οΈπŸ˜œ. Yes, very randomπŸ‡ΊπŸ‡³πŸ¦…. Afterall, we're just + testingπŸ§ͺ️πŸͺ§ our validation state machineβš™οΈπŸ“ πŸͺ‘. + "#.as_bytes().to_owned(); + emojistr.extend(rem); + assert!(!is_utf8(emojistr)); +}