1 |
|
2 -- IN-BAND REGISTRATION (XEP-0077) |
|
3 |
|
4 -- library |
|
5 |
|
6 local iq = require 'iq' |
|
7 local x_data = require 'x_data' |
|
8 local form_field = require 'form_field' |
|
9 |
|
10 -- |
|
11 |
|
12 local F = { } |
|
13 local M = { } |
|
14 M.__index = M |
|
15 |
|
16 function F.new ( args ) |
|
17 local form = { |
|
18 xmlns = 'jabber:iq:register', |
|
19 ftype = args.type or 'form', |
|
20 registered = args.registered, |
|
21 -- XXX title |
|
22 instructions = args.instructions, |
|
23 x_data = args.x_data, |
|
24 f = { }, |
|
25 } |
|
26 setmetatable ( form, M ) |
|
27 return form |
|
28 end |
|
29 |
|
30 function F.parse ( query ) |
|
31 local instructions = query:child ( 'instructions' ) |
|
32 if instructions then |
|
33 instructions = instructions:value () |
|
34 end |
|
35 |
|
36 local registered |
|
37 if query:child ( 'registered' ) then |
|
38 registered = true |
|
39 end |
|
40 |
|
41 local x = query:child ( 'x' ) |
|
42 if x and x:attribute ( 'xmlns' ) == 'jabber:x:data' then |
|
43 return F.new { type = 'form', registered = registered, instructions = instructions, x_data = x_data.parse ( x ) } |
|
44 end |
|
45 |
|
46 local form = F.new { type = 'form', registered = registered, instructions = instructions } |
|
47 |
|
48 local field = query:child () |
|
49 while field do |
|
50 local name = field:name () |
|
51 if name ~= 'instructions' and name ~= 'registered' then |
|
52 form:add ( name, { type = 'text-single', value = field:value () or '' } ) |
|
53 end |
|
54 field = field:next () |
|
55 end |
|
56 |
|
57 return form |
|
58 end |
|
59 |
|
60 function M.type ( form ) |
|
61 return form.ftype |
|
62 end |
|
63 |
|
64 function M.desc ( form ) |
|
65 if form.x_data then |
|
66 return form.x_data:desc () |
|
67 else |
|
68 return form.title, form.instructions |
|
69 end |
|
70 end |
|
71 |
|
72 function M.format ( form, root, format_as ) |
|
73 local ft = format_as or form:type () |
|
74 |
|
75 if form.x_data then |
|
76 root.query = form.x_data:format ( { xmlns = 'jabber:iq:register' }, ft ) |
|
77 else |
|
78 root.query = { xmlns = 'jabber:iq:register' } |
|
79 for index, field in form:fields () do |
|
80 root.query[field:name ()] = field:value () |
|
81 end |
|
82 end |
|
83 |
|
84 if ft == 'form' then |
|
85 local title, instructions = form:desc () |
|
86 if instructions then |
|
87 root.query.instructions = { instructions } |
|
88 end |
|
89 if form.registered then |
|
90 root.query.registered = { } |
|
91 end |
|
92 end |
|
93 |
|
94 return root |
|
95 end |
|
96 |
|
97 function M.fields ( form ) |
|
98 if form.x_data then |
|
99 return form.x_data:fields () |
|
100 else |
|
101 return ipairs ( form.f ) |
|
102 end |
|
103 end |
|
104 |
|
105 function M.add ( form, name, fld ) |
|
106 if form.x_data then |
|
107 return form.x_data:add ( name, fld ) |
|
108 else |
|
109 fld.var = name |
|
110 fld.index = #form.f + 1 |
|
111 local obj = form_field.new ( fld ) |
|
112 table.insert ( form.f, obj ) |
|
113 form.f[name] = obj |
|
114 return obj |
|
115 end |
|
116 end |
|
117 |
|
118 function M.field ( form, name ) |
|
119 if form.x_data then |
|
120 return form.x_data:field ( name ) |
|
121 else |
|
122 return form.f[name] |
|
123 end |
|
124 end |
|
125 |
|
126 function F.register ( conn, to, success, fail ) |
|
127 iq.send ( conn, to, 'get', |
|
128 { |
|
129 query = { xmlns = 'jabber:iq:register' }, |
|
130 }, |
|
131 function ( mess ) |
|
132 local query = mess:child ( 'query' ) |
|
133 if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then |
|
134 success ( F.parse ( query ), |
|
135 function ( form, success, fail ) |
|
136 iq.send ( conn, to, 'set', form:format ( form, { }, 'submit' ), success , fail ) |
|
137 end, |
|
138 function ( form, success, fail ) |
|
139 success () |
|
140 end ) |
|
141 end |
|
142 end, fail ) |
|
143 end |
|
144 |
|
145 function F.unregister ( conn, to, success, fail ) |
|
146 iq.send ( conn, to, 'set', |
|
147 { |
|
148 query = { xmlns = 'jabber:iq:register', |
|
149 remove = { }, |
|
150 }, |
|
151 }, |
|
152 function ( mess ) |
|
153 success () |
|
154 end, |
|
155 function ( mesg, mess ) |
|
156 local query = mess:child ( 'query' ) |
|
157 if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then |
|
158 success ( F.parse ( query ), |
|
159 function ( form, success, fail ) |
|
160 iq.send ( conn, to, 'set', form:format ( form, { }, 'submit' ), success, fail ) |
|
161 end, |
|
162 function ( form, success, fail ) |
|
163 success () |
|
164 end ) |
|
165 else |
|
166 fail ( mesg ) |
|
167 end |
|
168 end ) |
|
169 end |
|
170 |
|
171 return F |
|
172 |
|
173 -- vim: se ts=4: -- |
|