X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fjid.lua;h=ccc8309c3a23a411315c6aa6bb332d5c84c1b429;hb=650cac31220d89553405fe6b1301fd3d2e2b7bc2;hp=c9ea5b736f7a3b3a445c13141bbad4446d209625;hpb=b233f991f9dea008982a90c5f785fa021dd87558;p=prosody.git diff --git a/util/jid.lua b/util/jid.lua index c9ea5b73..ccc8309c 100644 --- a/util/jid.lua +++ b/util/jid.lua @@ -1,20 +1,68 @@ +-- Prosody IM +-- Copyright (C) 2008-2009 Matthew Wild +-- Copyright (C) 2008-2009 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) +local function _split(jid) if not jid then return; end - -- TODO verify JID, and return; if invalid - local node = match(jid, "^([^@]+)@"); - local server = (node and match(jid, ".-@([^@/]+)")) or match(jid, "^([^@/]+)"); - local resource = match(jid, "/(.+)$"); - return node, server, resource; + 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); - return node.."@"..host; + 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 -return _M; \ No newline at end of file +return _M;