Software /
code /
prosody
File
util/jid.lua @ 6340:7e820979fd9b
util.jid: Optimize bare
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 07 Aug 2014 17:43:28 +0200 |
parent | 6339:1c19464cde77 |
child | 6777:5de6b93d0190 |
line wrap: on
line source
-- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- 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 host, hostpos = match(jid, "^([^@/]+)()", nodepos) if node and not host then return nil, nil, nil; end local resource = match(jid, "^/(.+)$", hostpos); if (not host) or ((not resource) and #jid >= hostpos) then return nil, nil, nil; end return node, host, resource; end split = _split; function bare(jid) return jid and match(jid, "^[^/]+"); 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 node = nodeprep(node); if not node then return; end end if resource then resource = resourceprep(resource); if not resource then return; end end return node, host, resource; end end prepped_split = _prepped_split; local function _join(node, host, resource) if not host then return end if node and resource then return node.."@"..host.."/"..resource; elseif node then return node.."@"..host; elseif resource then return host.."/"..resource; end return host; end join = _join; function prep(jid) local node, host, resource = _prepped_split(jid); return _join(node, host, resource); end function compare(jid, acl) -- compare jid to single acl rule -- TODO compare to table of rules? local jid_node, jid_host, jid_resource = _split(jid); local acl_node, acl_host, acl_resource = _split(acl); if ((acl_node ~= nil and acl_node == jid_node) or acl_node == nil) and ((acl_host ~= nil and acl_host == jid_host) or acl_host == nil) and ((acl_resource ~= nil and acl_resource == jid_resource) or acl_resource == nil) then return true end 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;