IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
prosody/util/jid.lua

94 lines
2.3 KiB

-- 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 = string.match;
local nodeprep = require "util.encodings".stringprep.nodeprep;
local nameprep = require "util.encodings".stringprep.nameprep;
local resourceprep = require "util.encodings".stringprep.resourceprep;
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)
local node, host = _split(jid);
if node and host then
return node.."@"..host;
end
return host;
end
local function _prepped_split(jid)
local node, host, resource = _split(jid);
if host then
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;
function prep(jid)
local node, host, resource = _prepped_split(jid);
if host then
if node then
host = node .. "@" .. host;
end
if resource then
host = host .. "/" .. resource;
end
end
return host;
end
function join(node, host, resource)
if node and host and resource then
return node.."@"..host.."/"..resource;
elseif node and host then
return node.."@"..host;
elseif host and resource then
return host.."/"..resource;
elseif host then
return host;
end
return nil; -- Invalid JID
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
return _M;