X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fjid.lua;h=069817c6167c46d0fffbe2a4e98bb71f604474b2;hb=492c253d150aeb7edb6687eb9bf085be6c33133a;hp=9d01e2afa4966f2b2676fda15415f06b678b268d;hpb=d0a4f8f2fb4b0927a67ebc7428d6c5cb66d2fbd4;p=prosody.git diff --git a/util/jid.lua b/util/jid.lua index 9d01e2af..069817c6 100644 --- a/util/jid.lua +++ b/util/jid.lua @@ -1,8 +1,94 @@ +-- 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" -function split(jid) - return match(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;