]> granicus.if.org Git - ejabberd/commitdiff
* src/ejabberd_sm.erl: Updated the session table to store
authorAlexey Shchepin <alexey@process-one.net>
Mon, 21 May 2007 03:21:34 +0000 (03:21 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Mon, 21 May 2007 03:21:34 +0000 (03:21 +0000)
additional session info
* src/ejabberd_c2s.erl: Report IP address to ejabberd_sm (thanks
to Christophe Romain)

SVN Revision: 772

ChangeLog
src/ejabberd_c2s.erl
src/ejabberd_sm.erl

index be47d292a268e51688e3bb52c3f6b79b7d6ae261..dd9b5eb7b2f41a86088e025dffb035f84e2959c8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-05-21  Alexey Shchepin  <alexey@sevcom.net>
+
+       * src/ejabberd_sm.erl: Updated the session table to store
+       additional session info
+       * src/ejabberd_c2s.erl: Report IP address to ejabberd_sm (thanks
+       to Christophe Romain)
+
 2007-05-18  Alexey Shchepin  <alexey@sevcom.net>
 
        * src/msgs/zh.msg: New chinese translation (thanks to Shelley
index af658faf1a17bd0a566f9b229061bf5f0e48eafd..5510cdd7020d9aa35ba9d9188a8b9802d1a2c573 100644 (file)
@@ -64,6 +64,7 @@
                pres_timestamp,
                pres_invis = false,
                privacy_list = none,
+               ip,
                lang}).
 
 %-define(DBGFSM, true).
@@ -136,6 +137,7 @@ init([{SockMod, Socket}, Opts]) ->
     TLSOpts = lists:filter(fun({certfile, _}) -> true;
                              (_) -> false
                           end, Opts),
+    IP = peerip(SockMod, Socket),
     Socket1 =
        if
            TLSEnabled ->
@@ -154,7 +156,8 @@ init([{SockMod, Socket}, Opts]) ->
                                 tls_options    = TLSOpts,
                                 streamid       = new_id(),
                                 access         = Access,
-                                shaper         = Shaper}}.
+                                shaper         = Shaper,
+                                ip             = IP}}.
 
 
 %%----------------------------------------------------------------------
@@ -386,8 +389,9 @@ wait_for_auth({xmlstreamelement, El}, StateData) ->
                               [StateData#state.socket,
                                jlib:jid_to_string(JID)]),
                            SID = {now(), self()},
+                           IP = StateData#state.ip,
                            ejabberd_sm:open_session(
-                             SID, U, StateData#state.server, R),
+                             SID, U, StateData#state.server, R, IP),
                            Res1 = jlib:make_result_iq_reply(El),
                            Res = setelement(4, Res1, []),
                            send_element(StateData, Res),
@@ -717,8 +721,9 @@ wait_for_session({xmlstreamelement, El}, StateData) ->
                              [StateData#state.socket,
                               jlib:jid_to_string(JID)]),
                    SID = {now(), self()},
+                   IP = StateData#state.ip,
                    ejabberd_sm:open_session(
-                     SID, U, StateData#state.server, R),
+                     SID, U, StateData#state.server, R, IP),
                    Res = jlib:make_result_iq_reply(El),
                    send_element(StateData, Res),
                    change_shaper(StateData, JID),
@@ -1323,7 +1328,8 @@ presence_update(From, Packet, StateData) ->
                                       StateData#state.user,
                                       StateData#state.server,
                                       StateData#state.resource,
-                                      Status),
+                                      Status,
+                                      StateData#state.ip),
            presence_broadcast(StateData, From, StateData#state.pres_a, Packet),
            presence_broadcast(StateData, From, StateData#state.pres_i, Packet),
            StateData#state{pres_last = undefined,
@@ -1654,7 +1660,8 @@ update_priority(Priority, Packet, StateData) ->
                             StateData#state.server,
                             StateData#state.resource,
                             Priority,
-                            Packet).
+                            Packet,
+                            StateData#state.ip).
 
 get_priority_from_presence(PresencePacket) ->
     case xml:get_subtag(PresencePacket, "priority") of
@@ -1795,3 +1802,12 @@ process_unauthenticated_stanza(StateData, El) ->
            ok
     end.
 
+peerip(SockMod, Socket) ->
+    IP = case SockMod of
+            gen_tcp -> inet:peername(Socket);
+            _ -> SockMod:peername(Socket)
+        end,
+    case IP of
+       {ok, IPOK} -> IPOK;
+       _ -> undefined
+    end.
index fc1706da36be13547f817139049dd73b1081f6f8..91be5d97a3245280368d751d859a9124e973d517 100644 (file)
 %% API
 -export([start_link/0,
         route/3,
-        open_session/4, close_session/4,
+        open_session/5, close_session/4,
         check_in_subscription/6,
         bounce_offline_message/3,
         disconnect_removed_user/2,
         get_user_resources/2,
-        set_presence/6,
-        unset_presence/5,
+        set_presence/7,
+        unset_presence/6,
         close_session_unset_presence/5,
         dirty_get_sessions_list/0,
         dirty_get_my_sessions_list/0,
@@ -28,7 +28,8 @@
         register_iq_handler/4,
         register_iq_handler/5,
         unregister_iq_handler/2,
-        ctl_process/2
+        ctl_process/2,
+        get_user_ip/3
        ]).
 
 %% gen_server callbacks
@@ -39,7 +40,7 @@
 -include("jlib.hrl").
 -include("ejabberd_ctl.hrl").
 
--record(session, {sid, usr, us, priority}).
+-record(session, {sid, usr, us, priority, info}).
 -record(state, {}).
 
 %% default value for the maximum number of user connections
@@ -64,8 +65,8 @@ route(From, To, Packet) ->
            ok
     end.
 
-open_session(SID, User, Server, Resource) ->
-    set_session(SID, User, Server, Resource, undefined),
+open_session(SID, User, Server, Resource, IP) ->
+    set_session(SID, User, Server, Resource, undefined, IP),
     check_for_sessions_to_replace(User, Server, Resource),
     JID = jlib:make_jid(User, Server, Resource),
     ejabberd_hooks:run(sm_register_connection_hook, JID#jid.lserver,
@@ -80,7 +81,7 @@ close_session(SID, User, Server, Resource) ->
     ejabberd_hooks:run(sm_remove_connection_hook, JID#jid.lserver,
                       [SID, JID]).
 
-check_in_subscription(Acc, User, Server, JID, Type, Reason) ->
+check_in_subscription(Acc, User, Server, _JID, _Type, _Reason) ->
     case ejabberd_auth:is_user_exists(User, Server) of
        true ->
            Acc;
@@ -110,13 +111,27 @@ get_user_resources(User, Server) ->
            [element(3, S#session.usr) || S <- clean_session_list(Ss)]
     end.
 
-set_presence(SID, User, Server, Resource, Priority, Presence) ->
-    set_session(SID, User, Server, Resource, Priority),
+get_user_ip(User, Server, Resource) ->
+    LUser = jlib:nodeprep(User),
+    LServer = jlib:nameprep(Server),
+    LResource = jlib:resourceprep(Resource),
+    USR = {LUser, LServer, LResource},
+    case mnesia:dirty_index_read(session, USR, #session.usr) of
+       [] ->
+           undefined;
+       Ss ->
+           Session = lists:max(Ss),
+           proplists:get_value(ip, Session#session.info)
+    end.
+
+
+set_presence(SID, User, Server, Resource, Priority, Presence, IP) ->
+    set_session(SID, User, Server, Resource, Priority, IP),
     ejabberd_hooks:run(set_presence_hook, jlib:nameprep(Server),
                       [User, Server, Resource, Presence]).
 
-unset_presence(SID, User, Server, Resource, Status) ->
-    set_session(SID, User, Server, Resource, undefined),
+unset_presence(SID, User, Server, Resource, Status, IP) ->
+    set_session(SID, User, Server, Resource, undefined, IP),
     ejabberd_hooks:run(unset_presence_hook, jlib:nameprep(Server),
                       [User, Server, Resource, Status]).
 
@@ -275,17 +290,19 @@ code_change(_OldVsn, State, _Extra) ->
 %%% Internal functions
 %%--------------------------------------------------------------------
 
-set_session(SID, User, Server, Resource, Priority) ->
+set_session(SID, User, Server, Resource, Priority, IP) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
     LResource = jlib:resourceprep(Resource),
     US = {LUser, LServer},
     USR = {LUser, LServer, LResource},
+    Info = [{ip, IP}],
     F = fun() ->
                mnesia:write(#session{sid = SID,
                                      usr = USR,
                                      us = US,
-                                     priority = Priority})
+                                     priority = Priority,
+                                     info = Info})
        end,
     mnesia:sync_dirty(F).
 
@@ -617,6 +634,8 @@ update_tables() ->
        [usr, us, pid] ->
            mnesia:delete_table(session);
        [sid, usr, us, priority] ->
+           mnesia:delete_table(session);
+       [sid, usr, us, priority, info] ->
            ok;
        {'EXIT', _} ->
            ok