Skip to content

Commit d217a4c

Browse files
committed
fix: set meta.pre-auth to skip redirect_url if token validated
otherwise if redirect_url for mod_register is set, then we can't register even if a valid invite token has been presented
1 parent 3b05cb0 commit d217a4c

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

src/mod_invites_register.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ c2s_unauthenticated_packet(#{invite := Invite} = State,
7474
IQ1 = xmpp:set_els(IQ, [Register]),
7575
User = Invite#invite_token.account_name,
7676
IQ2 = xmpp:set_from_to(IQ1, jid:make(User, Server), jid:make(Server)),
77-
ResIQ = mod_register:process_iq(IQ2),
77+
Meta = xmpp:get_meta(IQ2),
78+
ResIQ = mod_register:process_iq(xmpp:set_meta(IQ2, Meta#{pre_auth => true})),
7879
ResIQ1 = xmpp:set_from_to(ResIQ, jid:make(Server), undefined),
7980
{stop, ejabberd_c2s:send(State, ResIQ1)}
8081
end);

src/mod_register.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,9 @@ process_iq(#iq{type = get, from = From, to = To, id = ID, lang = Lang} = IQ,
215215
Instr = translate:translate(
216216
Lang, ?T("Choose a username and password to register "
217217
"with this server")),
218+
IsPreAuth = maps:get(pre_auth, xmpp:get_meta(IQ), false) == true,
218219
URL = mod_register_opt:redirect_url(Server),
219-
if (URL /= undefined) and not IsRegistered ->
220+
if (URL /= undefined) and not IsRegistered and not IsPreAuth ->
220221
Desc = str:translate_and_format(Lang, ?T("To register, visit ~s"), [URL]),
221222
xmpp:make_iq_result(
222223
IQ, #register{instructions = Desc,

test/invites_tests.erl

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,15 +475,34 @@ ibr(Config0) ->
475475
?match(#iq{type = result, sub_els = [#register{username = <<>>}]},
476476
send_get_iq_register(Config3)),
477477
?match(#iq{type = result}, send_iq_register(Config3, <<"some_self_chosen_name">>)),
478+
RedirectUrl = <<"http://localhost">>,
479+
NewRegisterOpts2 = gen_mod:set_opt(redirect_url, RedirectUrl, NewRegisterOpts),
480+
update_module_opts(Server, mod_register, NewRegisterOpts2),
481+
482+
Config4 = reconnect(Config3),
483+
#invite_token{token = Token4} = create_account_invite(Server, {<<>>, Server}),
484+
?match(#iq{type = result}, send_pars(Config4, Token4)),
485+
#iq{type = result, sub_els = [#register{sub_els = SubEls}]} =
486+
send_get_iq_register(Config4),
487+
?match([], lists:filter(fun(El) ->
488+
Decoded = xmpp:decode(El),
489+
case Decoded of
490+
#oob_x{url = RedirectUrl} -> true;
491+
_ -> false
492+
end
493+
end,
494+
SubEls)),
495+
?match(#iq{type = result}, send_iq_register(Config4, <<"yet_another_self_chosen_name">>)),
478496

479497
ejabberd_auth:remove_user(AccountName, Server),
498+
ejabberd_auth:remove_user(<<"yet_another_self_chosen_name">>, Server),
480499
ejabberd_auth:remove_user(<<"some_self_chosen_name">>, Server),
481500
ejabberd_auth:remove_user(<<"some_much_better_name">>, Server),
482501
update_module_opts(Server, mod_register, OldRegisterOpts),
483502
mod_invites:remove_user(<<"inviter">>, Server),
484503
mod_invites:expire_tokens(<<>>, Server),
485-
?match(3, mod_invites:cleanup_expired()),
486-
disconnect(Config3).
504+
?match(4, mod_invites:cleanup_expired()),
505+
disconnect(Config4).
487506

488507
ibr_reserved(Config0) ->
489508
Server = ?config(server, Config0),

0 commit comments

Comments
 (0)