49
|
1 |
|
|
2 |
-- IN-BAND REGISTRATION (XEP-0077) |
|
3 |
|
|
4 |
-- FIXME this is not yet finished, as format of form is undecided yet |
|
5 |
|
|
6 |
-- library |
|
7 |
|
|
8 |
require 'lm' |
|
9 |
require 'iq' |
|
10 |
require 'x_data' |
|
11 |
|
|
12 |
-- public |
|
13 |
|
|
14 |
iq_register = { } |
|
15 |
|
|
16 |
function iq_register.parse ( query ) |
|
17 |
local form = { xmlns = 'jabber:iq:register', type = 'form' } |
|
18 |
|
|
19 |
local instructions = query:child ( 'instructions' ) |
|
20 |
if instructions then |
|
21 |
form.instructions = instructions:value () |
|
22 |
end |
|
23 |
-- XXX how it can be mapped to common form? |
|
24 |
-- and needs it be supplied? |
|
25 |
if query:child ( 'registered' ) then |
|
26 |
form.registered = true |
|
27 |
end |
|
28 |
|
|
29 |
local x = query:child ( 'x' ) |
|
30 |
if x:attribute ( 'xmlns' ) == 'jabber:x:data' then |
|
31 |
form = form.parse ( x ) |
|
32 |
local format = form.format |
|
33 |
form.format = |
|
34 |
function ( form, root ) |
|
35 |
root.query = format ( form, { xmlns = 'jabber:iq:register' } ) |
|
36 |
return root |
|
37 |
end |
|
38 |
return form |
|
39 |
end |
|
40 |
|
|
41 |
local field = query:children () |
|
42 |
while field do |
|
43 |
local name = field:name () |
|
44 |
if name ~= 'instructions' and name ~= 'registered' then |
|
45 |
table.insert ( form, { type = 'text-single', var = name, value = { field:value () or '' } } ) |
|
46 |
end |
|
47 |
field = field:next () |
|
48 |
end |
|
49 |
form.format = |
|
50 |
function ( form, root ) |
|
51 |
root.query = { xmlns = 'jabber:iq:register' } |
|
52 |
for index, field in ipairs ( form ) do |
|
53 |
root.query[field.var] = field.value |
|
54 |
end |
|
55 |
return root |
|
56 |
end |
|
57 |
return form |
|
58 |
end |
|
59 |
|
|
60 |
function iq_register.register ( conn, to, success, fail ) |
|
61 |
iq.send ( conn, to, 'get', |
|
62 |
{ |
|
63 |
query = { xmlns = 'jabber:iq:register' }, |
|
64 |
}, |
|
65 |
function ( mess ) |
|
66 |
local query = mess:child ( 'query' ) |
|
67 |
if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then |
|
68 |
success ( iq_register.parse ( query ), |
|
69 |
function ( form, success, fail ) |
|
70 |
form.type = 'submit' -- XXX |
|
71 |
iq.send ( conn, to, 'set', form.format ( form, { } ), success , fail ) |
|
72 |
end, |
|
73 |
function ( form, success, fail ) |
|
74 |
success () |
|
75 |
end ) |
|
76 |
end |
|
77 |
end, fail ) |
|
78 |
end |
|
79 |
|
|
80 |
function iq_register.unregister ( conn, to, success, fail ) |
|
81 |
iq.send ( conn, to, 'set', |
|
82 |
{ |
|
83 |
query = { xmlns = 'jabber:iq:register', |
|
84 |
remove = { }, |
|
85 |
}, |
|
86 |
}, |
|
87 |
function ( mess ) |
|
88 |
success () |
|
89 |
end, |
|
90 |
function ( mesg, mess ) |
|
91 |
local query = mess:child ( 'query' ) |
|
92 |
if query and query:attribute ( 'xmlns' ) == 'jabber:iq:register' then |
|
93 |
success ( iq_register.parse ( query ), |
|
94 |
function ( form, success, fail ) |
|
95 |
form.type = 'submit' -- XXX |
|
96 |
iq.send ( conn, to, 'set', form.format ( form, { } ), success, fail ) |
|
97 |
end, |
|
98 |
function ( form, success, fail ) |
|
99 |
success () |
|
100 |
end ) |
|
101 |
else |
|
102 |
fail ( mesg ) |
|
103 |
end |
|
104 |
end ) |
|
105 |
end |
|
106 |
|
|
107 |
-- mcabber |
|
108 |
|
|
109 |
main.command ( 'register', |
|
110 |
function ( args ) |
|
111 |
local who |
|
112 |
if args and args ~= '' then |
|
113 |
who = args |
|
114 |
else |
|
115 |
who = main.full_jid () |
|
116 |
end |
|
117 |
iq_register.register ( lm.connection.bless ( main.connection () ), who, |
|
118 |
function ( form, submit, reject ) |
|
119 |
local id = #forms + 1 |
|
120 |
forms[id] = { |
|
121 |
form = form, |
|
122 |
submit = |
|
123 |
function ( form ) |
|
124 |
submit ( form, |
|
125 |
function () |
|
126 |
main.print_info ( who, 'Successfully registered' ) |
|
127 |
end, |
|
128 |
function ( mesg ) |
|
129 |
main.print_info ( who, 'Registration failed: ' .. mesg ) |
|
130 |
end ) |
|
131 |
end, |
|
132 |
reject = |
|
133 |
function ( form ) |
|
134 |
reject ( form, |
|
135 |
function () |
|
136 |
main.print_info ( who, 'Registration cancelled' ) |
|
137 |
end, |
|
138 |
function ( mesg ) |
|
139 |
main.print_info ( who, 'Registration cancellation failed: ' .. mesg ) |
|
140 |
end ) |
|
141 |
end, |
|
142 |
} |
|
143 |
print ( 'You have new form ' .. id ) |
|
144 |
end, |
|
145 |
function ( mesg ) |
|
146 |
main.print_info ( who, 'Registration failed: ' .. mesg ) |
|
147 |
end ) |
|
148 |
end, false, 'jid' ) |
|
149 |
main.command ( 'cancel', |
|
150 |
function ( args ) |
|
151 |
local who |
|
152 |
if args and args ~= '' then |
|
153 |
who = args |
|
154 |
else |
|
155 |
who = main.full_jid () |
|
156 |
end |
|
157 |
iq_register.unregister ( lm.connection.bless ( main.connection () ), who, |
|
158 |
function ( form, submit, reject ) |
|
159 |
if not form then |
|
160 |
main.print_info ( who, 'Successfully unregistered' ) |
|
161 |
else |
|
162 |
local id = #forms + 1 |
|
163 |
forms[id] = { |
|
164 |
form = form, |
|
165 |
submit = |
|
166 |
function ( form ) |
|
167 |
submit ( form, |
|
168 |
function () |
|
169 |
main.print_info ( who, 'Successfully unregistered' ) |
|
170 |
end, |
|
171 |
function ( mesg ) |
|
172 |
main.print_info ( who, 'Unregistrering failed: ' .. mesg ) |
|
173 |
end ) |
|
174 |
end, |
|
175 |
reject = |
|
176 |
function ( form ) |
|
177 |
reject ( form, |
|
178 |
function () |
|
179 |
main.print_info ( who, 'Unregistration cancelled' ) |
|
180 |
end, |
|
181 |
function ( mesg ) |
|
182 |
main.print_info ( who, 'Unregistration cancellation failed: ' .. mesg ) |
|
183 |
end ) |
|
184 |
end, |
|
185 |
} |
|
186 |
print ( 'You have new form ' .. id ) |
|
187 |
end |
|
188 |
end, |
|
189 |
function ( mesg ) |
|
190 |
main.print_info ( who, 'Unregistering failed: ' .. mesg ) |
|
191 |
end ) |
|
192 |
end, false, 'jid' ) |
|
193 |
|
|
194 |
commands_help['register'] = "[jid]\n\nSends registration request to jid (or current buddy). You, probably, then will need to fill and send some form." |
|
195 |
commands_help['cancel'] = "[jid]\n\nSends registration cancellation request to jid (or current buddy). May require a form filling." |
|
196 |
|
|
197 |
-- vim: se ts=4: -- |