util/jid.lua
changeset 6780 5de6b93d0190
parent 6340 7e820979fd9b
child 6892 7f7920f2aebf
equal deleted inserted replaced
6777:3965662ae091 6780:5de6b93d0190
    21 	["@"] = "\\40"; ["\\"] = "\\5c";
    21 	["@"] = "\\40"; ["\\"] = "\\5c";
    22 };
    22 };
    23 local unescapes = {};
    23 local unescapes = {};
    24 for k,v in pairs(escapes) do unescapes[v] = k; end
    24 for k,v in pairs(escapes) do unescapes[v] = k; end
    25 
    25 
    26 module "jid"
    26 local _ENV = nil;
    27 
    27 
    28 local function _split(jid)
    28 local function split(jid)
    29 	if not jid then return; end
    29 	if not jid then return; end
    30 	local node, nodepos = match(jid, "^([^@/]+)@()");
    30 	local node, nodepos = match(jid, "^([^@/]+)@()");
    31 	local host, hostpos = match(jid, "^([^@/]+)()", nodepos)
    31 	local host, hostpos = match(jid, "^([^@/]+)()", nodepos)
    32 	if node and not host then return nil, nil, nil; end
    32 	if node and not host then return nil, nil, nil; end
    33 	local resource = match(jid, "^/(.+)$", hostpos);
    33 	local resource = match(jid, "^/(.+)$", hostpos);
    34 	if (not host) or ((not resource) and #jid >= hostpos) then return nil, nil, nil; end
    34 	if (not host) or ((not resource) and #jid >= hostpos) then return nil, nil, nil; end
    35 	return node, host, resource;
    35 	return node, host, resource;
    36 end
    36 end
    37 split = _split;
       
    38 
    37 
    39 function bare(jid)
    38 local function bare(jid)
    40 	return jid and match(jid, "^[^/]+");
    39 	return jid and match(jid, "^[^/]+");
    41 end
    40 end
    42 
    41 
    43 local function _prepped_split(jid)
    42 local function prepped_split(jid)
    44 	local node, host, resource = _split(jid);
    43 	local node, host, resource = split(jid);
    45 	if host then
    44 	if host then
    46 		if sub(host, -1, -1) == "." then -- Strip empty root label
    45 		if sub(host, -1, -1) == "." then -- Strip empty root label
    47 			host = sub(host, 1, -2);
    46 			host = sub(host, 1, -2);
    48 		end
    47 		end
    49 		host = nameprep(host);
    48 		host = nameprep(host);
    57 			if not resource then return; end
    56 			if not resource then return; end
    58 		end
    57 		end
    59 		return node, host, resource;
    58 		return node, host, resource;
    60 	end
    59 	end
    61 end
    60 end
    62 prepped_split = _prepped_split;
       
    63 
    61 
    64 local function _join(node, host, resource)
    62 local function join(node, host, resource)
    65 	if not host then return end
    63 	if not host then return end
    66 	if node and resource then
    64 	if node and resource then
    67 		return node.."@"..host.."/"..resource;
    65 		return node.."@"..host.."/"..resource;
    68 	elseif node then
    66 	elseif node then
    69 		return node.."@"..host;
    67 		return node.."@"..host;
    70 	elseif resource then
    68 	elseif resource then
    71 		return host.."/"..resource;
    69 		return host.."/"..resource;
    72 	end
    70 	end
    73 	return host;
    71 	return host;
    74 end
    72 end
    75 join = _join;
       
    76 
    73 
    77 function prep(jid)
    74 local function prep(jid)
    78 	local node, host, resource = _prepped_split(jid);
    75 	local node, host, resource = prepped_split(jid);
    79 	return _join(node, host, resource);
    76 	return join(node, host, resource);
    80 end
    77 end
    81 
    78 
    82 function compare(jid, acl)
    79 local function compare(jid, acl)
    83 	-- compare jid to single acl rule
    80 	-- compare jid to single acl rule
    84 	-- TODO compare to table of rules?
    81 	-- TODO compare to table of rules?
    85 	local jid_node, jid_host, jid_resource = _split(jid);
    82 	local jid_node, jid_host, jid_resource = split(jid);
    86 	local acl_node, acl_host, acl_resource = _split(acl);
    83 	local acl_node, acl_host, acl_resource = split(acl);
    87 	if ((acl_node ~= nil and acl_node == jid_node) or acl_node == nil) and
    84 	if ((acl_node ~= nil and acl_node == jid_node) or acl_node == nil) and
    88 		((acl_host ~= nil and acl_host == jid_host) or acl_host == nil) and
    85 		((acl_host ~= nil and acl_host == jid_host) or acl_host == nil) and
    89 		((acl_resource ~= nil and acl_resource == jid_resource) or acl_resource == nil) then
    86 		((acl_resource ~= nil and acl_resource == jid_resource) or acl_resource == nil) then
    90 		return true
    87 		return true
    91 	end
    88 	end
    92 	return false
    89 	return false
    93 end
    90 end
    94 
    91 
    95 function escape(s) return s and (s:gsub(".", escapes)); end
    92 local function escape(s) return s and (s:gsub(".", escapes)); end
    96 function unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end
    93 local function unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end
    97 
    94 
    98 return _M;
    95 return {
       
    96 	split = split;
       
    97 	bare = bare;
       
    98 	prepped_split = prepped_split;
       
    99 	join = join;
       
   100 	prep = prep;
       
   101 	compare = compare;
       
   102 	escape = escape;
       
   103 	unescape = unescape;
       
   104 };