]> granicus.if.org Git - ejabberd/commitdiff
* src/treap.erl: Bugfix
authorAlexey Shchepin <alexey@process-one.net>
Wed, 23 Apr 2008 13:14:08 +0000 (13:14 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Wed, 23 Apr 2008 13:14:08 +0000 (13:14 +0000)
* src/mod_register.erl: Fixed table creation, timeout isn't
activated when registration fails

SVN Revision: 1300

ChangeLog
src/mod_register.erl
src/treap.erl

index 1c8cdf018b775ec8e7287ca54ea123275876dacf..cbd370e02bea22ee7345e534de6a76c72962c5f1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 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
index b8f99df3f60590ae716dc386c82e3ba4837218f3..36f3e54625467c2ef35993a3b61d660ab4d1fc5f 100644 (file)
@@ -52,6 +52,7 @@ start(Host, Opts) ->
                        [{ram_copies, [node()]},
                         {local_content, true},
                         {attributes, [key, value]}]),
+    mnesia:add_table_copy(mod_register_ip, node(), ram_copies),
     ok.
 
 stop(Host) ->
@@ -212,14 +213,18 @@ try_register(User, Server, Password, Source) ->
                                    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}
@@ -327,3 +332,36 @@ clean_treap(Treap, CleanPriority) ->
                    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.
+
index d7b070b9e31066719e8e1fa6b34b8efeaeae511b..48361d17d511424183bbead8c79a5dc0fdd84c79 100644 (file)
@@ -103,7 +103,7 @@ heapify({HashKey, Priority, Value,
 
 delete(Key, Tree) ->
     HashKey = {erlang:phash2(Key), Key},
-    delete1(Tree, HashKey).
+    delete1(HashKey, Tree).
 
 delete1(HashKey, {HashKey1, Priority1, Value1, Left, Right} = Tree) ->
     if