mod_saslauth: Only do c2s SASL on normal VirtualHosts
[prosody.git] / util / jid.lua
index 9128ce4e0a73c8f219331da5114d34539b12f5fd..8e0a784cc49abb3a0a25531043f993e23ed0cf13 100644 (file)
@@ -8,16 +8,26 @@
 
 
 
-local match = string.match;
+local match, sub = string.match, string.sub;
 local nodeprep = require "util.encodings".stringprep.nodeprep;
 local nameprep = require "util.encodings".stringprep.nameprep;
 local resourceprep = require "util.encodings".stringprep.resourceprep;
 
+local escapes = {
+       [" "] = "\\20"; ['"'] = "\\22";
+       ["&"] = "\\26"; ["'"] = "\\27";
+       ["/"] = "\\2f"; [":"] = "\\3a";
+       ["<"] = "\\3c"; [">"] = "\\3e";
+       ["@"] = "\\40"; ["\\"] = "\\5c";
+};
+local unescapes = {};
+for k,v in pairs(escapes) do unescapes[v] = k; end
+
 module "jid"
 
 local function _split(jid)
        if not jid then return; end
-       local node, nodepos = match(jid, "^([^@]+)@()");
+       local node, nodepos = match(jid, "^([^@/]+)@()");
        local host, hostpos = match(jid, "^([^@/]+)()", nodepos)
        if node and not host then return nil, nil, nil; end
        local resource = match(jid, "^/(.+)$", hostpos);
@@ -37,6 +47,9 @@ end
 local function _prepped_split(jid)
        local node, host, resource = _split(jid);
        if host then
+               if sub(host, -1, -1) == "." then -- Strip empty root label
+                       host = sub(host, 1, -2);
+               end
                host = nameprep(host);
                if not host then return; end
                if node then
@@ -91,4 +104,7 @@ function compare(jid, acl)
        return false
 end
 
+function escape(s) return s and (s:gsub(".", escapes)); end
+function unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end
+
 return _M;