# HG changeset patch # User Kim Alvefur # Date 1598633042 -7200 # Node ID 0b0a425424568b8e32a88d4be10ff332314610a2 # Parent 5fb95410f89c128d34fc0533887053e73887f160 util.jid: Fix special escaping of '\' per XEP-0106 From XEP-0106 §2. Requirements: > in certain circumstances, the escaping character itself ("\") might > also be escaped Later in §4.2 Address Transformation Algorithm it is stated that the backslash would only be escaped if it forms an escape sequence. Thus '\foo' is unaltered but '\20' must be escaped into '\5c20'. Thanks to lovetox and jonas’ for brining up. diff -r 5fb95410f89c -r 0b0a42542456 util/jid.lua --- a/util/jid.lua Fri Aug 28 18:43:37 2020 +0200 +++ b/util/jid.lua Fri Aug 28 18:44:02 2020 +0200 @@ -22,7 +22,11 @@ ["@"] = "\\40"; ["\\"] = "\\5c"; }; local unescapes = {}; -for k,v in pairs(escapes) do unescapes[v] = k; end +local backslash_escapes = {}; +for k,v in pairs(escapes) do + unescapes[v] = k; + backslash_escapes[v] = v:gsub("\\", escapes) +end local _ENV = nil; -- luacheck: std none @@ -107,7 +111,7 @@ return (select(3, split(jid))); end -local function escape(s) return s and (s:gsub(".", escapes)); end +local function escape(s) return s and (s:gsub("\\%x%x", backslash_escapes):gsub("[\"&'/:<>@ ]", escapes)); end local function unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end return {