mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-26 16:26:24 +01:00
exmpp fixes in captcha (thanks to Karim Gemayel)
SVN Revision: 2933
This commit is contained in:
parent
f5e1479afe
commit
e4a6d20328
@ -45,8 +45,23 @@
|
|||||||
-include("web/ejabberd_http.hrl").
|
-include("web/ejabberd_http.hrl").
|
||||||
|
|
||||||
-define(VFIELD(Type, Var, Value),
|
-define(VFIELD(Type, Var, Value),
|
||||||
{xmlelement, "field", [{"type", Type}, {"var", Var}],
|
#xmlel{name = 'field',
|
||||||
[{xmlelement, "value", [], [Value]}]}).
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'type',
|
||||||
|
value = Type
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'var',
|
||||||
|
value = Var
|
||||||
|
}
|
||||||
|
],
|
||||||
|
children = [
|
||||||
|
#xmlel{
|
||||||
|
name = 'value',
|
||||||
|
children = [Value]
|
||||||
|
}
|
||||||
|
]}.
|
||||||
|
|
||||||
-define(CAPTCHA_TEXT(Lang), translate:translate(Lang, "Enter the text you see")).
|
-define(CAPTCHA_TEXT(Lang), translate:translate(Lang, "Enter the text you see")).
|
||||||
-define(CAPTCHA_LIFETIME, 120000). % two minutes
|
-define(CAPTCHA_LIFETIME, 120000). % two minutes
|
||||||
@ -80,28 +95,126 @@ create_captcha(Id, SID, From, To, Lang, Args)
|
|||||||
B64Image = jlib:encode_base64(binary_to_list(Image)),
|
B64Image = jlib:encode_base64(binary_to_list(Image)),
|
||||||
JID = exmpp_jid:to_list(From),
|
JID = exmpp_jid:to_list(From),
|
||||||
CID = "sha1+" ++ sha:sha(Image) ++ "@bob.xmpp.org",
|
CID = "sha1+" ++ sha:sha(Image) ++ "@bob.xmpp.org",
|
||||||
Data = {xmlelement, "data",
|
% Data = {xmlelement, "data",
|
||||||
[{"xmlns", ?NS_BOB}, {"cid", CID},
|
% [{"xmlns", ?NS_BOB}, {"cid", CID},
|
||||||
{"max-age", "0"}, {"type", Type}],
|
% {"max-age", "0"}, {"type", Type}],
|
||||||
[{xmlcdata, B64Image}]},
|
% [{xmlcdata, B64Image}]},
|
||||||
|
Data =
|
||||||
|
#xmlel{
|
||||||
|
name = 'data',
|
||||||
|
ns = ?NS_BOB,
|
||||||
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'cid',
|
||||||
|
value = CID
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'max-age',
|
||||||
|
value = "0"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'type',
|
||||||
|
value = Type
|
||||||
|
}
|
||||||
|
],
|
||||||
|
children = [#xmlcdata{cdata = B64Image}]},
|
||||||
|
% {xmlelement, "captcha", [{"xmlns", ?NS_CAPTCHA}],
|
||||||
|
% %% ?NS_DATA_FORMS is 'jabber:x:data'
|
||||||
|
% [{xmlelement, "x", [{"xmlns", "jabber:x:data"}, {"type", "form"}],
|
||||||
|
% [?VFIELD("hidden", "FORM_TYPE", {xmlcdata, ?NS_CAPTCHA}),
|
||||||
|
% ?VFIELD("hidden", "from", {xmlcdata, exmpp_jid:to_list(To)}),
|
||||||
|
% ?VFIELD("hidden", "challenge", {xmlcdata, Id}),
|
||||||
|
% ?VFIELD("hidden", "sid", {xmlcdata, SID}),
|
||||||
|
% {xmlelement, "field", [{"var", "ocr"}, {"label", ?CAPTCHA_TEXT(Lang)}],
|
||||||
|
% [{xmlelement, "media", [{"xmlns", ?NS_MEDIA}],
|
||||||
|
% [{xmlelement, "uri", [{"type", Type}],
|
||||||
|
% [{xmlcdata, "cid:" ++ CID}]}]}]}]}]},
|
||||||
|
%% TODO : kael : write exmpp_captcha.erl
|
||||||
Captcha =
|
Captcha =
|
||||||
{xmlelement, "captcha", [{"xmlns", ?NS_CAPTCHA}],
|
#xmlel{
|
||||||
%% ?NS_DATA_FORMS is 'jabber:x:data'
|
name = 'captcha',
|
||||||
[{xmlelement, "x", [{"xmlns", "jabber:x:data"}, {"type", "form"}],
|
ns = ?NS_CAPTCHA,
|
||||||
[?VFIELD("hidden", "FORM_TYPE", {xmlcdata, ?NS_CAPTCHA}),
|
children = [
|
||||||
?VFIELD("hidden", "from", {xmlcdata, exmpp_jid:to_list(To)}),
|
#xmlel{
|
||||||
?VFIELD("hidden", "challenge", {xmlcdata, Id}),
|
name = 'x',
|
||||||
?VFIELD("hidden", "sid", {xmlcdata, SID}),
|
ns = ?NS_DATA_FORMS_s,
|
||||||
{xmlelement, "field", [{"var", "ocr"}, {"label", ?CAPTCHA_TEXT(Lang)}],
|
attrs = [
|
||||||
[{xmlelement, "media", [{"xmlns", ?NS_MEDIA}],
|
#xmlattr{
|
||||||
[{xmlelement, "uri", [{"type", Type}],
|
name = 'type',
|
||||||
[{xmlcdata, "cid:" ++ CID}]}]}]}]}]},
|
value = "form"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
children = [
|
||||||
|
?VFIELD("hidden", "FORM_TYPE", #xmlcdata{cdata = ?NS_CAPTCHA}),
|
||||||
|
?VFIELD("hidden", "from", #xmlcdata{cdata = exmpp_jid:to_list(To)}),
|
||||||
|
?VFIELD("hidden", "challenge", #xmlcdata{cdata = Id}),
|
||||||
|
?VFIELD("hidden", "sid", #xmlcdata{cdata = SID}),
|
||||||
|
#xmlel{
|
||||||
|
name = 'field',
|
||||||
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'var',
|
||||||
|
value = "ocr"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'label',
|
||||||
|
value = ?CAPTCHA_TEXT(Lang)
|
||||||
|
}
|
||||||
|
],
|
||||||
|
children = [
|
||||||
|
#xmlel{
|
||||||
|
name = 'media',
|
||||||
|
ns = ?NS_MEDIA,
|
||||||
|
children = [
|
||||||
|
#xmlel{
|
||||||
|
name = 'uri',
|
||||||
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'type',
|
||||||
|
value = Type
|
||||||
|
}
|
||||||
|
],
|
||||||
|
children = [
|
||||||
|
#xmlcdata{cdata = "cid:" ++ CID}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
BodyString1 = translate:translate(Lang, "Your messages to ~s are being blocked. To unblock them, visit ~s"),
|
BodyString1 = translate:translate(Lang, "Your messages to ~s are being blocked. To unblock them, visit ~s"),
|
||||||
BodyString = io_lib:format(BodyString1, [JID, get_url(Id)]),
|
BodyString = io_lib:format(BodyString1, [JID, get_url(Id)]),
|
||||||
Body = {xmlelement, "body", [],
|
Body =
|
||||||
[{xmlcdata, BodyString}]},
|
#xmlel{
|
||||||
OOB = {xmlelement, "x", [{"xmlns", ?NS_OOB}],
|
name = 'body',
|
||||||
[{xmlelement, "url", [], [{xmlcdata, get_url(Id)}]}]},
|
children = [
|
||||||
|
#xmlcdata{
|
||||||
|
cdata = BodyString
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
OOB =
|
||||||
|
#xmlel{
|
||||||
|
name = 'x',
|
||||||
|
ns = ?NS_OOB,
|
||||||
|
children = [
|
||||||
|
#xmlel{
|
||||||
|
name = 'url',
|
||||||
|
children = [
|
||||||
|
#xmlcdata{
|
||||||
|
cdata = get_url(Id)}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
%Body = {xmlelement, "body", [],
|
||||||
|
% [{xmlcdata, BodyString}]},
|
||||||
|
%OOB = {xmlelement, "x", [{"xmlns", ?NS_OOB}],
|
||||||
|
% [{xmlelement, "url", [], [{xmlcdata, get_url(Id)}]}]},
|
||||||
Tref = erlang:send_after(?CAPTCHA_LIFETIME, ?MODULE, {remove_id, Id}),
|
Tref = erlang:send_after(?CAPTCHA_LIFETIME, ?MODULE, {remove_id, Id}),
|
||||||
case ?T(mnesia:write(#captcha{id=Id, pid=self(), key=Key,
|
case ?T(mnesia:write(#captcha{id=Id, pid=self(), key=Key,
|
||||||
tref=Tref, args=Args})) of
|
tref=Tref, args=Args})) of
|
||||||
@ -123,28 +236,125 @@ create_captcha(Id, SID, From, To, Lang, Args)
|
|||||||
build_captcha_html(Id, Lang) ->
|
build_captcha_html(Id, Lang) ->
|
||||||
case mnesia:dirty_read(captcha, Id) of
|
case mnesia:dirty_read(captcha, Id) of
|
||||||
[#captcha{}] ->
|
[#captcha{}] ->
|
||||||
ImgEl = {xmlelement, "img", [{"src", get_url(Id ++ "/image")}], []},
|
%ImgEl = {xmlelement, "img", [{"src", get_url(Id ++ "/image")}], []},
|
||||||
TextEl = {xmlcdata, ?CAPTCHA_TEXT(Lang)},
|
ImgEl =
|
||||||
IdEl = {xmlelement, "input", [{"type", "hidden"},
|
#xmlel{
|
||||||
{"name", "id"},
|
name = 'img',
|
||||||
{"value", Id}], []},
|
attrs = [
|
||||||
KeyEl = {xmlelement, "input", [{"type", "text"},
|
#xmlattr{
|
||||||
{"name", "key"},
|
name = 'src',
|
||||||
{"size", "10"}], []},
|
value = get_url(Id ++ "/image")
|
||||||
FormEl = {xmlelement, "form", [{"action", get_url(Id)},
|
}
|
||||||
{"name", "captcha"},
|
]
|
||||||
{"method", "POST"}],
|
},
|
||||||
[ImgEl,
|
%TextEl = {xmlcdata, ?CAPTCHA_TEXT(Lang)},
|
||||||
{xmlelement, "br", [], []},
|
TextEl = #xmlcdata{cdata = ?CAPTCHA_TEXT(Lang)},
|
||||||
TextEl,
|
%IdEl = {xmlelement, "input", [{"type", "hidden"},
|
||||||
{xmlelement, "br", [], []},
|
% {"name", "id"},
|
||||||
IdEl,
|
% {"value", Id}], []},
|
||||||
KeyEl,
|
IdEl =
|
||||||
{xmlelement, "br", [], []},
|
#xmlel{
|
||||||
{xmlelement, "input", [{"type", "submit"},
|
name = 'input',
|
||||||
{"name", "enter"},
|
attrs = [
|
||||||
{"value", "OK"}], []}
|
#xmlattr{
|
||||||
]},
|
name = 'type',
|
||||||
|
value = "hidden"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'name',
|
||||||
|
value = "id"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'value',
|
||||||
|
value = Id
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
%KeyEl = {xmlelement, "input", [{"type", "text"},
|
||||||
|
% {"name", "key"},
|
||||||
|
% {"size", "10"}], []},
|
||||||
|
KeyEl =
|
||||||
|
#xmlel{
|
||||||
|
name = 'input',
|
||||||
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'type',
|
||||||
|
value = "text"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'name',
|
||||||
|
value = "key"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'size',
|
||||||
|
value = "10"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
%FormEl = {xmlelement, "form", [{"action", get_url(Id)},
|
||||||
|
% {"name", "captcha"},
|
||||||
|
% {"method", "POST"}],
|
||||||
|
% [ImgEl,
|
||||||
|
% {xmlelement, "br", [], []},
|
||||||
|
% TextEl,
|
||||||
|
% {xmlelement, "br", [], []},
|
||||||
|
% IdEl,
|
||||||
|
% KeyEl,
|
||||||
|
% {xmlelement, "br", [], []},
|
||||||
|
% {xmlelement, "input", [{"type", "submit"},
|
||||||
|
% {"name", "enter"},
|
||||||
|
% {"value", "OK"}], []}
|
||||||
|
% ]},
|
||||||
|
FormEl =
|
||||||
|
#xmlel{
|
||||||
|
name = 'form',
|
||||||
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'action',
|
||||||
|
value = get_url(Id)
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'name',
|
||||||
|
value = "captcha"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'method',
|
||||||
|
value = "POST"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
children = [
|
||||||
|
ImgEl,
|
||||||
|
#xmlel{
|
||||||
|
name = 'br'
|
||||||
|
},
|
||||||
|
TextEl,
|
||||||
|
#xmlel{
|
||||||
|
name = 'br'
|
||||||
|
},
|
||||||
|
IdEl,
|
||||||
|
KeyEl,
|
||||||
|
#xmlel{
|
||||||
|
name = 'br'
|
||||||
|
},
|
||||||
|
#xmlel{
|
||||||
|
name = 'input',
|
||||||
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'type',
|
||||||
|
value = "submit"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'name',
|
||||||
|
value = "enter"
|
||||||
|
},
|
||||||
|
#xmlattr{
|
||||||
|
name = 'value',
|
||||||
|
value = "OK"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{FormEl, {ImgEl, TextEl, IdEl, KeyEl}};
|
{FormEl, {ImgEl, TextEl, IdEl, KeyEl}};
|
||||||
_ ->
|
_ ->
|
||||||
captcha_not_found
|
captcha_not_found
|
||||||
@ -203,8 +413,18 @@ process(_Handlers, #request{method='GET', lang=Lang, path=[_, Id]}) ->
|
|||||||
case build_captcha_html(Id, Lang) of
|
case build_captcha_html(Id, Lang) of
|
||||||
{FormEl, _} when is_tuple(FormEl) ->
|
{FormEl, _} when is_tuple(FormEl) ->
|
||||||
Form =
|
Form =
|
||||||
{xmlelement, "div", [{"align", "center"}],
|
%{xmlelement, "div", [{"align", "center"}],
|
||||||
[FormEl]},
|
%[FormEl]},
|
||||||
|
#xmlel{
|
||||||
|
name = 'div',
|
||||||
|
attrs = [
|
||||||
|
#xmlattr{
|
||||||
|
name = 'align',
|
||||||
|
value = "center"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
children = [FormEl]
|
||||||
|
},
|
||||||
ejabberd_web:make_xhtml([Form]);
|
ejabberd_web:make_xhtml([Form]);
|
||||||
captcha_not_found ->
|
captcha_not_found ->
|
||||||
ejabberd_web:error(not_found)
|
ejabberd_web:error(not_found)
|
||||||
@ -232,10 +452,17 @@ process(_Handlers, #request{method='POST', q=Q, lang=Lang, path=[_, Id]}) ->
|
|||||||
case check_captcha(Id, ProvidedKey) of
|
case check_captcha(Id, ProvidedKey) of
|
||||||
captcha_valid ->
|
captcha_valid ->
|
||||||
Form =
|
Form =
|
||||||
{xmlelement, "p", [],
|
%{xmlelement, "p", [],
|
||||||
[{xmlcdata,
|
% [{xmlcdata,
|
||||||
translate:translate(Lang, "The captcha is valid.")
|
% translate:translate(Lang, "The captcha is valid.")
|
||||||
}]},
|
% }]},
|
||||||
|
#xmlel{
|
||||||
|
name = 'p',
|
||||||
|
children = [
|
||||||
|
#xmlcdata{
|
||||||
|
cdata = translate:translate(Lang, "The captcha is valid.")}
|
||||||
|
]
|
||||||
|
},
|
||||||
ejabberd_web:make_xhtml([Form]);
|
ejabberd_web:make_xhtml([Form]);
|
||||||
captcha_non_valid ->
|
captcha_non_valid ->
|
||||||
ejabberd_web:error(not_allowed);
|
ejabberd_web:error(not_allowed);
|
||||||
|
Loading…
Reference in New Issue
Block a user