diff --git a/ChangeLog b/ChangeLog index c6586cc25..e2b10f71e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,15 @@ ejabberd_service * doc/guide.html: Likewise +2008-07-15 Alexey Shchepin + + * 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-14 Badlop * doc/guide.tex: Update what permissions does enable-user grant diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 5afd6cc53..358b1fe32 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1267,9 +1267,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). diff --git a/src/ejabberd_receiver.erl b/src/ejabberd_receiver.erl index c178df62a..72b3608d6 100644 --- a/src/ejabberd_receiver.erl +++ b/src/ejabberd_receiver.erl @@ -269,8 +269,7 @@ code_change(_OldVsn, State, _Extra) -> %%-------------------------------------------------------------------- activate_socket(#state{socket = Socket, - sock_mod = SockMod, - c2s_pid = C2SPid}) -> + sock_mod = SockMod}) -> PeerName = case SockMod of gen_tcp -> @@ -283,8 +282,7 @@ activate_socket(#state{socket = Socket, case PeerName of {error, _Reason} -> self() ! {tcp_closed, Socket}; - {ok, IP} -> - C2SPid ! {peername, IP}, + {ok, _} -> ok end. diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index bb543707f..2d4b7c5b9 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -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), diff --git a/src/web/ejabberd_http_poll.erl b/src/web/ejabberd_http_poll.erl index ad6c46b77..2b36136cd 100644 --- a/src/web/ejabberd_http_poll.erl +++ b/src/web/ejabberd_http_poll.erl @@ -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, @@ -50,16 +50,14 @@ -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). @@ -77,19 +75,19 @@ %%%---------------------------------------------------------------------- %%% 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) ->