2008-04-23 Alexey Shchepin <alexey@process-one.net>
+ * src/treap.erl: Bugfix
+
+ * src/mod_register.erl: Fixed table creation, timeout isn't
+ activated when registration fails
+
* src/mod_register.erl: Restrict registration frequency per IP or
user
* src/ejabberd_c2s.erl: Pass IP to the c2s_unauthenticated_iq hook
[{ram_copies, [node()]},
{local_content, true},
{attributes, [key, value]}]),
+ mnesia:add_table_copy(mod_register_ip, node(), ram_copies),
ok.
stop(Host) ->
send_welcome_message(JID),
send_registration_notifications(JID),
ok;
- {atomic, exists} ->
- {error, ?ERR_CONFLICT};
- {error, invalid_jid} ->
- {error, ?ERR_JID_MALFORMED};
- {error, not_allowed} ->
- {error, ?ERR_NOT_ALLOWED};
- {error, _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR}
+ Error ->
+ remove_timeout(Source),
+ case Error of
+ {atomic, exists} ->
+ {error, ?ERR_CONFLICT};
+ {error, invalid_jid} ->
+ {error, ?ERR_JID_MALFORMED};
+ {error, not_allowed} ->
+ {error, ?ERR_NOT_ALLOWED};
+ {error, _Reason} ->
+ {error, ?ERR_INTERNAL_SERVER_ERROR}
+ end
end;
false ->
{error, ?ERR_RESOURCE_CONSTRAINT}
Treap
end
end.
+
+remove_timeout(undefined) ->
+ true;
+remove_timeout(Source) ->
+ Timeout = case ejabberd_config:get_local_option(registration_timeout) of
+ undefined -> 600;
+ TO -> TO
+ end,
+ if
+ is_integer(Timeout) ->
+ F = fun() ->
+ Treap = case mnesia:read(mod_register_ip, treap,
+ write) of
+ [] ->
+ treap:empty();
+ [{mod_register_ip, treap, T}] -> T
+ end,
+ Treap1 = treap:delete(Source, Treap),
+ mnesia:write({mod_register_ip, treap, Treap1}),
+ ok
+ end,
+ case mnesia:transaction(F) of
+ {atomic, ok} ->
+ ok;
+ {aborted, Reason} ->
+ ?ERROR_MSG("mod_register: timeout remove error: ~p~n",
+ [Reason]),
+ ok
+ end;
+ true ->
+ ok
+ end.
+
delete(Key, Tree) ->
HashKey = {erlang:phash2(Key), Key},
- delete1(Tree, HashKey).
+ delete1(HashKey, Tree).
delete1(HashKey, {HashKey1, Priority1, Value1, Left, Right} = Tree) ->
if