]> granicus.if.org Git - ejabberd/commitdiff
Rolled back the previous IP getting patch, and Report connection's IP address
authorChristophe Romain <christophe.romain@process-one.net>
Wed, 16 Jul 2008 13:29:57 +0000 (13:29 +0000)
committerChristophe Romain <christophe.romain@process-one.net>
Wed, 16 Jul 2008 13:29:57 +0000 (13:29 +0000)
SVN Revision: 1451

ChangeLog
src/ejabberd_c2s.erl
src/ejabberd_sm.erl
src/web/ejabberd_http_poll.erl

index 018668e338bca392609b26ccc647de4bf303309d..eeff65e7a1a8396bdd57c9add6332a91ad744fd2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-07-16  Alexey Shchepin  <alexey@process-one.net>
+
+       * src/web/ejabberd_http_poll.erl: Report connection's IP address 
+
+       * src/ejabberd_c2s.erl: Rolled back the previous IP getting patch
+       * src/ejabberd_sm.erl: Likewise
+       * src/ejabberd_receiver.erl: Likewise
+       * src/web/ejabberd_http_poll.erl: Likewise
+
 2008-07-16  Badlop  <badlop@process-one.net>
 
        * doc/guide.tex: Improve explanation of option 'hosts' in
index 2d8e315e16f456cdc241df3b7365441159233005..edb297344a68cbbb9c0ec91d039e0005eb8a58ce 100644 (file)
@@ -1262,9 +1262,6 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
 handle_info({'DOWN', Monitor, _Type, _Object, _Info}, _StateName, StateData)
   when Monitor == StateData#state.socket_monitor ->
     {stop, normal, StateData};
-handle_info({peername, IP}, StateName, StateData) ->
-    ejabberd_sm:set_session_ip(StateData#state.sid, IP),
-    fsm_next_state(StateName, StateData#state{ip = IP});
 handle_info(Info, StateName, StateData) ->
     ?ERROR_MSG("Unexpected info: ~p", [Info]),
     fsm_next_state(StateName, StateData).
index bb543707f8cb9721a886b611c21b6aa167174e43..2d4b7c5b970ec097a66704a3c32f9d782d08c654 100644 (file)
@@ -49,8 +49,7 @@
         ctl_process/2,
         get_session_pid/3,
         get_user_info/3,
-        get_user_ip/3,
-        set_session_ip/2
+        get_user_ip/3
        ]).
 
 %% gen_server callbacks
@@ -165,18 +164,6 @@ get_user_info(User, Server, Resource) ->
            [{node, Node}, {conn, Conn}, {ip, IP}]
     end.
 
-set_session_ip(SID, IP) ->
-    case mnesia:dirty_read(session, SID) of
-    [#session{info = Info} = Session] ->
-       NewInfo = case lists:keymember(ip, 1, Info) of
-       true -> lists:keyreplace(ip, 1, Info, {ip, IP});
-       false -> [{ip, IP}|Info]
-       end,
-       mnesia:dirty_write(Session#session{info = NewInfo});
-    _ ->
-       ok
-    end.
-
 set_presence(SID, User, Server, Resource, Priority, Presence, Info) ->
     set_session(SID, User, Server, Resource, Priority, Info),
     ejabberd_hooks:run(set_presence_hook, jlib:nameprep(Server),
index ad6c46b778a2cd49eefca0a18509efb874d6ebef..2b36136cdd3e4f40a7fde8c70e72c4782445b3b3 100644 (file)
@@ -30,7 +30,7 @@
 -behaviour(gen_fsm).
 
 %% External exports
--export([start_link/2,
+-export([start_link/3,
         init/1,
         handle_event/3,
         handle_sync_event/4,
 
 -record(http_poll, {id, pid}).
 
--define(NULL_PEER, {{0, 0, 0, 0}, 0}).
-
 -record(state, {id,
                key,
+               socket,
                output = "",
                input = "",
                waiting_input = false, %% {ReceiverPid, Tag}
                last_receiver,
-               timer,
-               ip = ?NULL_PEER }).
+               timer}).
 
 %-define(DBGFSM, true).
 
 %%%----------------------------------------------------------------------
 %%% API
 %%%----------------------------------------------------------------------
-start(ID, Key) ->
+start(ID, Key, IP) ->
     mnesia:create_table(http_poll,
                        [{ram_copies, [node()]},
                         {attributes, record_info(fields, http_poll)}]),
-    supervisor:start_child(ejabberd_http_poll_sup, [ID, Key]).
+    supervisor:start_child(ejabberd_http_poll_sup, [ID, Key, IP]).
 
-start_link(ID, Key) ->
-    gen_fsm:start_link(?MODULE, [ID, Key], ?FSMOPTS).
+start_link(ID, Key, IP) ->
+    gen_fsm:start_link(?MODULE, [ID, Key, IP], ?FSMOPTS).
 
-send({http_poll, FsmRef}, Packet) ->
+send({http_poll, FsmRef, _IP}, Packet) ->
     gen_fsm:sync_send_all_state_event(FsmRef, {send, Packet}).
 
-setopts({http_poll, FsmRef}, Opts) ->
+setopts({http_poll, FsmRef, _IP}, Opts) ->
     case lists:member({active, once}, Opts) of
        true ->
            gen_fsm:send_all_state_event(FsmRef, {activate, self()});
@@ -97,31 +95,27 @@ setopts({http_poll, FsmRef}, Opts) ->
            ok
     end.
 
-sockname(_) ->
-    {ok, ?NULL_PEER}.
+sockname(_Socket) ->
+    {ok, {{0, 0, 0, 0}, 0}}.
 
-peername({http_poll, FsmRef}) ->
-    case catch gen_fsm:sync_send_all_state_event(FsmRef, peername, 1000) of
-       {ok, IP} -> {ok, IP};
-       _ -> {ok, ?NULL_PEER}
-    end;
-peername(_) ->
-    {ok, ?NULL_PEER}.
+peername({http_poll, _FsmRef, IP}) ->
+    {ok, IP}.
 
 controlling_process(_Socket, _Pid) ->
     ok.
 
-close({http_poll, FsmRef}) ->
+close({http_poll, FsmRef, _IP}) ->
     catch gen_fsm:sync_send_all_state_event(FsmRef, close).
 
 
-process([], #request{data = Data, ip = IP} = _Request) ->
+process([], #request{data = Data,
+                    ip = IP} = _Request) ->
     case catch parse_request(Data) of
        {ok, ID1, Key, NewKey, Packet} ->
            ID = if
                     (ID1 == "0") or (ID1 == "mobile") ->
                         NewID = sha:sha(term_to_binary({now(), make_ref()})),
-                        {ok, Pid} = start(NewID, ""),
+                        {ok, Pid} = start(NewID, "", IP),
                         mnesia:transaction(
                           fun() ->
                                   mnesia:write(#http_poll{id = NewID,
@@ -131,7 +125,7 @@ process([], #request{data = Data, ip = IP} = _Request) ->
                     true ->
                         ID1
                 end,
-           case http_put(ID, Key, NewKey, Packet, IP) of
+           case http_put(ID, Key, NewKey, Packet) of
                {error, not_exists} ->
                    {200, ?BAD_REQUEST, ""};
                {error, bad_key} ->
@@ -176,8 +170,8 @@ process(_, _Request) ->
 %%          ignore                              |
 %%          {stop, StopReason}                   
 %%----------------------------------------------------------------------
-init([ID, Key]) ->
-    ?INFO_MSG("started: ~p", [{ID, Key}]),
+init([ID, Key, IP]) ->
+    ?INFO_MSG("started: ~p", [{ID, Key, IP}]),
 
     %% Read c2s options from the first ejabberd_c2s configuration in
     %% the config file listen section
@@ -187,12 +181,12 @@ init([ID, Key]) ->
     %% connector.
     Opts = ejabberd_c2s_config:get_c2s_limits(),
 
-    ejabberd_socket:start(ejabberd_c2s, ?MODULE, {http_poll, self()}, Opts),
-    %{ok, C2SPid} = ejabberd_c2s:start({?MODULE, {http_poll, self()}}, Opts),
-    %ejabberd_c2s:become_controller(C2SPid),
+    Socket = {http_poll, self(), IP},
+    ejabberd_socket:start(ejabberd_c2s, ?MODULE, Socket, Opts),
     Timer = erlang:start_timer(?HTTP_POLL_TIMEOUT, self(), []),
     {ok, loop, #state{id = ID,
                      key = Key,
+                     socket = Socket,
                      timer = Timer}}.
 
 %%----------------------------------------------------------------------
@@ -229,7 +223,7 @@ handle_event({activate, From}, StateName, StateData) ->
             StateData#state{waiting_input = {From, ok}}};
        Input ->
             Receiver = From,
-           Receiver ! {tcp, {http_poll, self()}, list_to_binary(Input)},
+           Receiver ! {tcp, StateData#state.socket, list_to_binary(Input)},
            {next_state, StateName, StateData#state{input = "",
                                                    waiting_input = false,
                                                    last_receiver = Receiver
@@ -257,7 +251,7 @@ handle_sync_event(stop, _From, _StateName, StateData) ->
     Reply = ok,
     {stop, normal, Reply, StateData};
 
-handle_sync_event({http_put, Key, NewKey, Packet, IP},
+handle_sync_event({http_put, Key, NewKey, Packet},
                  _From, StateName, StateData) ->
     Allow = case StateData#state.key of
                "" ->
@@ -279,10 +273,9 @@ handle_sync_event({http_put, Key, NewKey, Packet, IP},
                    Input = [StateData#state.input|Packet],
                    Reply = ok,
                    {reply, Reply, StateName, StateData#state{input = Input,
-                                                             key = NewKey,
-                                                             ip = IP}};
+                                                             key = NewKey}};
                {Receiver, _Tag} ->
-                   Receiver ! {tcp, {http_poll, self()},
+                   Receiver ! {tcp, StateData#state.socket,
                                list_to_binary(Packet)},
                    cancel_timer(StateData#state.timer),
                    Timer = erlang:start_timer(?HTTP_POLL_TIMEOUT, self(), []),
@@ -291,8 +284,7 @@ handle_sync_event({http_put, Key, NewKey, Packet, IP},
                     StateData#state{waiting_input = false,
                                     last_receiver = Receiver,
                                     key = NewKey,
-                                    timer = Timer,
-                                    ip = IP}}
+                                    timer = Timer}}
            end;
        true ->
            Reply = {error, bad_key},
@@ -303,10 +295,6 @@ handle_sync_event(http_get, _From, StateName, StateData) ->
     Reply = {ok, StateData#state.output},
     {reply, Reply, StateName, StateData#state{output = ""}};
 
-handle_sync_event(peername, _From, StateName, StateData) ->
-    Reply = {ok, StateData#state.ip},
-    {reply, Reply, StateName, StateData};
-
 handle_sync_event(_Event, _From, StateName, StateData) ->
     Reply = ok,
     {reply, Reply, StateName, StateData}.
@@ -345,10 +333,10 @@ terminate(_Reason, _StateName, StateData) ->
            case StateData#state.last_receiver of
                undefined -> ok;
                Receiver  ->
-                   Receiver ! {tcp_closed, {http_poll, self()}}
+                   Receiver ! {tcp_closed, StateData#state.socket}
            end;
        {Receiver, _Tag} ->
-           Receiver ! {tcp_closed, {http_poll, self()}}
+           Receiver ! {tcp_closed, StateData#state.socket}
     end,
     catch resend_messages(StateData#state.output),
     ok.
@@ -357,13 +345,13 @@ terminate(_Reason, _StateName, StateData) ->
 %%% Internal functions
 %%%----------------------------------------------------------------------
 
-http_put(ID, Key, NewKey, Packet, IP) ->
+http_put(ID, Key, NewKey, Packet) ->
     case mnesia:dirty_read({http_poll, ID}) of
        [] ->
            {error, not_exists};
        [#http_poll{pid = FsmRef}] ->
            gen_fsm:sync_send_all_state_event(
-             FsmRef, {http_put, Key, NewKey, Packet, IP})
+             FsmRef, {http_put, Key, NewKey, Packet})
     end.
 
 http_get(ID) ->