util/jid: string prepping functions added: prepped_split and prep
[prosody.git] / util / jid.lua
1 -- Prosody IM v0.2
2 -- Copyright (C) 2008 Matthew Wild
3 -- Copyright (C) 2008 Waqas Hussain
4 -- 
5 -- This program is free software; you can redistribute it and/or
6 -- modify it under the terms of the GNU General Public License
7 -- as published by the Free Software Foundation; either version 2
8 -- of the License, or (at your option) any later version.
9 -- 
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 -- GNU General Public License for more details.
14 -- 
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18 --
19
20
21
22 local match = string.match;
23 local nodeprep = require "util.encodings".stringprep.nodeprep;
24 local nameprep = require "util.encodings".stringprep.nameprep;
25 local resourceprep = require "util.encodings".stringprep.resourceprep;
26
27 module "jid"
28
29 function split(jid)
30         if not jid then return; end
31         local node, nodepos = match(jid, "^([^@]+)@()");
32         local host, hostpos = match(jid, "^([^@/]+)()", nodepos)
33         if node and not host then return nil, nil, nil; end
34         local resource = match(jid, "^/(.+)$", hostpos);
35         if (not host) or ((not resource) and #jid >= hostpos) then return nil, nil, nil; end
36         return node, host, resource;
37 end
38
39 function bare(jid)
40         local node, host = split(jid);
41         if node and host then
42                 return node.."@"..host;
43         end
44         return host;
45 end
46
47 function prepped_split(jid)
48         local node, host, resource = split(jid);
49         if host then
50                 host = nameprep(host);
51                 if not host then return; end
52                 if node then
53                         node = nodeprep(node);
54                         if not node then return; end
55                 end
56                 if resource then
57                         resource = resourceprep(resource);
58                         if not resource then return; end
59                 end
60                 return node, host, resource;
61         end
62 end
63
64 function prep(jid)
65         local node, host, resource = prepped_split(jid);
66         if host then
67                 if node then
68                         host = node .. "@" .. host;
69                 end
70                 if resource then
71                         host = host .. "/" .. resource;
72                 end
73         end
74         return host;
75 end
76
77 return _M;