]> granicus.if.org Git - ejabberd/commitdiff
* src/mod_last.erl: Supprot for storing status from latest
authorAlexey Shchepin <alexey@process-one.net>
Sun, 11 Jul 2004 20:51:54 +0000 (20:51 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Sun, 11 Jul 2004 20:51:54 +0000 (20:51 +0000)
unavailable presence (thanks to Sergei Golovan)
* src/ejabberd_sm.erl: Likewise
* src/ejabberd_c2s.erl: Likewise

* src/mod_vcard.erl: Minor update (thanks to Sergei Golovan)

* src/mod_register.erl: Added "access" option (thanks to Sergei
Golovan)
* src/mod_irc/mod_irc.erl: Likewise
* src/ejabberd.cfg.example: Updated
* src/win32/ejabberd.cfg: Likewise

* src/mod_privacy.erl: Fixed module stopping (thanks to Sergei
Golovan)
* src/mod_private.erl: Likewise

* src/gen_mod.erl: Added function get_module_opt/3 (thanks to
Sergei Golovan)

* src/ejabberd_local.erl: Minor fix (thanks to Sergei Golovan)

* doc/guide.tex: Updated (thanks to Sergei Golovan)

SVN Revision: 244

15 files changed:
ChangeLog
doc/guide.html
doc/guide.tex
src/ejabberd.cfg.example
src/ejabberd_c2s.erl
src/ejabberd_local.erl
src/ejabberd_sm.erl
src/gen_mod.erl
src/mod_irc/mod_irc.erl
src/mod_last.erl
src/mod_privacy.erl
src/mod_private.erl
src/mod_register.erl
src/mod_vcard.erl
src/win32/ejabberd.cfg

index 97472ba5bf39e7b7330f6e7dec006a1e557cfbba..090ec3dce643a2fd6a578b72e8edf07bb8b2e5d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2004-07-11  Alexey Shchepin  <alexey@sevcom.net>
+
+       * src/mod_last.erl: Supprot for storing status from latest
+       unavailable presence (thanks to Sergei Golovan)
+       * src/ejabberd_sm.erl: Likewise
+       * src/ejabberd_c2s.erl: Likewise
+
+       * src/mod_vcard.erl: Minor update (thanks to Sergei Golovan)
+
+       * src/mod_register.erl: Added "access" option (thanks to Sergei
+       Golovan)
+       * src/mod_irc/mod_irc.erl: Likewise
+       * src/ejabberd.cfg.example: Updated
+       * src/win32/ejabberd.cfg: Likewise
+
+       * src/mod_privacy.erl: Fixed module stopping (thanks to Sergei
+       Golovan)
+       * src/mod_private.erl: Likewise
+
+       * src/gen_mod.erl: Added function get_module_opt/3 (thanks to
+       Sergei Golovan)
+
+       * src/ejabberd_local.erl: Minor fix (thanks to Sergei Golovan)
+
+       * doc/guide.tex: Updated (thanks to Sergei Golovan)
+
 2004-07-10  Alexey Shchepin  <alexey@sevcom.net>
 
        * src/mod_roster.erl: Removed superfluous include_lib line
index 9e6c0c6faa797f49365858c3bc7005271eefa314..2db534258cab7dac767eda624ff5e149f6b94db2 100644 (file)
@@ -871,7 +871,17 @@ Options:
 <B><TT>host</TT></B><DD> Defines hostname of service
 (see&nbsp;<A HREF="#sec:modhostoption">A.1.2</A>). If not present
 then prefix <TT>irc.</TT> is added to main <TT>ejabberd</TT> hostname.
+<DT><B><TT>access</TT></B><DD> Specifies who is allowed to use IRC transport (default value is <TT>all</TT>).
 </DL>
+Example:
+<PRE>
+  {modules,
+   [
+    ...
+    {mod_irc, [{access, all}]},
+    ...
+   ]}.
+</PRE>
 <!--TOC subsection <TT>mod_last</TT>-->
 
 <H3><A NAME="htoc36">A.6</A>&nbsp;&nbsp;<TT>mod_last</TT></H3><!--SEC END -->
@@ -981,14 +991,15 @@ Example:
 <H3><A NAME="htoc42">A.12</A>&nbsp;&nbsp;<TT>mod_register</TT></H3><!--SEC END -->
 
 <A NAME="sec:modregister"></A>
-This module adds support for <A HREF="http://www.jabber.org/jeps/jep-0077.html">JEP-0077</A> (In-Band Registration).
-It is possible to restrict registration via ``register''
-access rule. If this rule returns ``deny'' on requested user name, then
-registration is not allowed for it.<BR>
+This module adds support for <A HREF="http://www.jabber.org/jeps/jep-0077.html">JEP-0077</A> (In-Band Registration).<BR>
 <BR>
 Options:
 <DL COMPACT=compact><DT>
-<B><TT>iqdisc</TT></B><DD> <TT>jabber:iq:register</TT> IQ queries processing
+<B><TT>access</TT></B><DD> Specifies rule to restrict registration.
+If this rule returns ``deny'' on requested user name, then
+registration is not allowed for it. (default value is <TT>all</TT>, which means
+no restrictions).
+<DT><B><TT>iqdisc</TT></B><DD> <TT>jabber:iq:register</TT> IQ queries processing
 discipline (see&nbsp;<A HREF="#sec:modiqdiscoption">A.1.1</A>).
 </DL>
 Example:
@@ -1004,7 +1015,7 @@ Example:
   {modules,
    [
     ...
-    {mod_register, []},
+    {mod_register, [{access, register}]},
     ...
    ]}.
 </PRE>
index 540091a8beda716a6e888c44b1957386e0b5f4fa..732aec45f4404af92629ce0a00ff27a29df04f19 100644 (file)
@@ -860,8 +860,19 @@ This module implements IRC transport.
 Options:
 \begin{description}
 \hostitem{irc}
+\titem{access} Specifies who is allowed to use IRC transport (default value is \term{all}).
 \end{description}
 
+Example:
+\begin{verbatim}
+  {modules,
+   [
+    ...
+    {mod_irc, [{access, all}]},
+    ...
+   ]}.
+\end{verbatim}
+
 
 \subsection{\modlast{}}
 \label{sec:modlast}
@@ -965,12 +976,13 @@ Example:
 \label{sec:modregister}
 
 This module adds support for \jepref{0077} (In-Band Registration).
-It is possible to restrict registration via ``register''
-access rule.  If this rule returns ``deny'' on requested user name, then
-registration is not allowed for it.
 
 Options:
 \begin{description}
+\titem{access} Specifies rule to restrict registration.
+If this rule returns ``deny'' on requested user name, then
+registration is not allowed for it. (default value is \term{all}, which means
+no restrictions).
 \iqdiscitem{\ns{jabber:iq:register}}
 \end{description}
 
@@ -987,7 +999,7 @@ Example:
   {modules,
    [
     ...
-    {mod_register, []},
+    {mod_register, [{access, register}]},
     ...
    ]}.
 \end{verbatim}
index f9668b6651a5c61dbc2be215b47462474b1197b0..405f4a2b2d37ec78270aec346744d0b04673dbba 100644 (file)
 % Used modules:
 {modules,
  [
-  {mod_register,   []},
+  {mod_register,   [{access, register}]},
   {mod_roster,     []},
   {mod_privacy,    []},
   {mod_configure,  []},
index 63a19bd8f2c5d8e8a8f74c4acd4d592e01ef885d..8b10d064d6bd5cdba4098d2a5707336993a769c2 100644 (file)
@@ -856,7 +856,8 @@ terminate(_Reason, StateName, StateData) ->
                              [{xmlelement, "status", [],
                                [{xmlcdata, "Replaced by new connection"}]}]},
                    ejabberd_sm:unset_presence(StateData#state.user,
-                                              StateData#state.resource),
+                                              StateData#state.resource,
+                                              "Replaced by new connection"),
                    presence_broadcast(
                      StateData, From, StateData#state.pres_a, Packet),
                    presence_broadcast(
@@ -867,15 +868,26 @@ terminate(_Reason, StateName, StateData) ->
                               jlib:jid_to_string(StateData#state.jid)]),
                    ejabberd_sm:close_session(StateData#state.user,
                                              StateData#state.resource),
-                   From = StateData#state.jid,
-                   Packet = {xmlelement, "presence",
-                             [{"type", "unavailable"}], []},
-                   ejabberd_sm:unset_presence(StateData#state.user,
-                                              StateData#state.resource),
-                   presence_broadcast(
-                     StateData, From, StateData#state.pres_a, Packet),
-                   presence_broadcast(
-                     StateData, From, StateData#state.pres_i, Packet)
+
+                   Tmp = ?SETS:new(),
+                   case StateData of
+                       #state{pres_last = undefined,
+                              pres_a = Tmp,
+                              pres_i = Tmp,
+                              pres_invis = false} ->
+                           ok;
+                       _ ->
+                           From = StateData#state.jid,
+                           Packet = {xmlelement, "presence",
+                                     [{"type", "unavailable"}], []},
+                           ejabberd_sm:unset_presence(StateData#state.user,
+                                                      StateData#state.resource,
+                                                      ""),
+                           presence_broadcast(
+                             StateData, From, StateData#state.pres_a, Packet),
+                           presence_broadcast(
+                             StateData, From, StateData#state.pres_i, Packet)
+                   end
            end;
        _ ->
            ok
@@ -984,8 +996,15 @@ presence_update(From, Packet, StateData) ->
     {xmlelement, _Name, Attrs, _Els} = Packet,
     case xml:get_attr_s("type", Attrs) of
        "unavailable" ->
+           Status = case xml:get_subtag(Packet, "status") of
+                        false ->
+                           "";
+                        StatusTag ->
+                           xml:get_tag_cdata(StatusTag)
+                    end,
            ejabberd_sm:unset_presence(StateData#state.user,
-                                      StateData#state.resource),
+                                      StateData#state.resource,
+                                      Status),
            presence_broadcast(StateData, From, StateData#state.pres_a, Packet),
            presence_broadcast(StateData, From, StateData#state.pres_i, Packet),
            StateData#state{pres_last = undefined,
index 5c91e280a4c689cf896282329dcb4b7ef03addf7..446ec292b0c191e28fec4324045f426ae8fd1e53 100644 (file)
@@ -65,16 +65,16 @@ loop(State) ->
            catch mod_disco:unregister_feature(XMLNS),
            loop(State);
        refresh_iq_handlers ->
-           lists:map(
+           lists:foreach(
              fun(T) ->
-                 case T of
-                     {XMLNS, _Module, _Function, _Opts} ->
-                         catch mod_disco:register_feature(XMLNS);
-                     {XMLNS, _Module, _Function} ->
-                         catch mod_disco:register_feature(XMLNS);
-                     _ ->
-                         ok
-                 end
+                     case T of
+                         {XMLNS, _Module, _Function, _Opts} ->
+                             catch mod_disco:register_feature(XMLNS);
+                         {XMLNS, _Module, _Function} ->
+                             catch mod_disco:register_feature(XMLNS);
+                         _ ->
+                             ok
+                     end
              end, ets:tab2list(State#state.iqtable)),
            loop(State);
        _ ->
index d2c2785458a9573e1c3af9713bb01da6b4b4d734..882c61e0ed8931371887a6c362f4277b6c7bd8d7 100644 (file)
@@ -13,7 +13,7 @@
 -export([start_link/0, init/0, open_session/2, close_session/2,
         get_user_resources/1,
         set_presence/3,
-        unset_presence/2,
+        unset_presence/3,
         dirty_get_sessions_list/0,
         dirty_get_my_sessions_list/0,
         register_iq_handler/3,
@@ -317,14 +317,14 @@ set_presence(User, Resource, Priority) ->
        end,
     mnesia:transaction(F).
 
-unset_presence(User, Resource) ->
+unset_presence(User, Resource, Status) ->
     LUser = jlib:nodeprep(User),
     F = fun() ->
                UR = {User, Resource},
                mnesia:delete({presence, UR})
        end,
     mnesia:transaction(F),
-    catch mod_last:on_presence_update(LUser).
+    catch mod_last:on_presence_update(LUser, Status).
 
 get_user_present_resources(LUser) ->
     case catch mnesia:dirty_index_read(presence, LUser, #presence.user) of
index 2f9d07382d3d6ba5195b42b45f82a8addb31176f..945754fbf796b0d5b1bf57c2f8fa1c110ba13a61 100644 (file)
@@ -15,6 +15,7 @@
         stop_module/1,
         get_opt/2,
         get_opt/3,
+        get_module_opt/3,
         loaded_modules/0]).
 
 -export([behaviour_info/1]).
@@ -73,6 +74,16 @@ get_opt(Opt, Opts, Default) ->
            Val
     end.
 
+get_module_opt(Module, Opt, Default) ->
+    OptsList = ets:lookup(ejabberd_modules, Module),
+    case OptsList of
+       [] ->
+           Default;
+       [#ejabberd_module{opts = Opts} | _] ->
+           get_opt(Opt, Opts, Default)
+    end.
+
 loaded_modules() ->
     ets:select(ejabberd_modules,
               [{#ejabberd_module{_ = '_', module = '$1'}, [],['$1']}]).
+
index 9cfe26d6a52eb215302af795aa287ab662c9c43e..efa3c995ed18bfb0247f5072dbb59bce0188284d 100644 (file)
@@ -12,7 +12,7 @@
 
 -behaviour(gen_mod).
 
--export([start/1, init/1, stop/0, closed_conection/2,
+-export([start/1, init/2, stop/0, closed_conection/2,
         get_user_and_encoding/2]).
 
 -include("ejabberd.hrl").
@@ -29,34 +29,48 @@ start(Opts) ->
                        [{disc_copies, [node()]},
                         {attributes, record_info(fields, irc_custom)}]),
     Host = gen_mod:get_opt(host, Opts, "irc." ++ ?MYNAME),
-    register(ejabberd_mod_irc, spawn(?MODULE, init, [Host])).
+    Access = gen_mod:get_opt(access, Opts, all),
+    register(ejabberd_mod_irc, spawn(?MODULE, init, [Host, Access])).
 
-init(Host) ->
+init(Host, Access) ->
     catch ets:new(irc_connection, [named_table,
                                   public,
                                   {keypos, #irc_connection.userserver}]),
     ejabberd_router:register_route(Host),
-    loop(Host).
+    loop(Host, Access).
 
-loop(Host) ->
+loop(Host, Access) ->
     receive
        {route, From, To, Packet} ->
-           case catch do_route(Host, From, To, Packet) of
+           case catch do_route(Host, Access, From, To, Packet) of
                {'EXIT', Reason} ->
                    ?ERROR_MSG("~p", [Reason]);
                _ ->
                    ok
            end,
-           loop(Host);
+           loop(Host, Access);
        stop ->
            ejabberd_router:unregister_global_route(Host),
            ok;
        _ ->
-           loop(Host)
+           loop(Host, Access)
     end.
 
 
-do_route(Host, From, To, Packet) ->
+do_route(Host, Access, From, To, Packet) ->
+    case acl:match_rule(Access, From) of
+       allow ->
+           do_route1(Host, From, To, Packet);
+       _ ->
+           {xmlelement, _Name, Attrs, _Els} = Packet,
+           Lang = xml:get_attr_s("xml:lang", Attrs),
+           ErrText = "Access denied by service policy",
+           Err = jlib:make_error_reply(Packet,
+                                       ?ERRT_FORBIDDEN(Lang, ErrText)),
+           ejabberd_router:route(To, From, Err)
+    end.
+
+do_route1(Host, From, To, Packet) ->
     #jid{user = ChanServ, resource = Resource} = To,
     {xmlelement, _Name, Attrs, _Els} = Packet,
     case ChanServ of
index bcff1ed8b4dbc72bc81b86a730387b1f6a1db3cf..8f106d9e3e84bdfe042e7551ad6706e9056813df 100644 (file)
         stop/0,
         process_local_iq/3,
         process_sm_iq/3,
-        on_presence_update/1,
+        on_presence_update/2,
         remove_user/1]).
 
 -include("ejabberd.hrl").
 -include("jlib.hrl").
 
--record(last_activity, {user, timestamp}).
+-record(last_activity, {user, timestamp, status}).
 
 
 start(Opts) ->
@@ -30,6 +30,7 @@ start(Opts) ->
     mnesia:create_table(last_activity,
                        [{disc_copies, [node()]},
                         {attributes, record_info(fields, last_activity)}]),
+    update_table(),
     gen_iq_handler:add_iq_handler(ejabberd_local, ?NS_LAST,
                                  ?MODULE, process_local_iq, IQDisc),
     gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_LAST,
@@ -93,7 +94,7 @@ get_last(IQ, SubEl, LUser) ->
            IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]};
        [] ->
            IQ#iq{type = error, sub_el = [SubEl, ?ERR_SERVICE_UNAVAILABLE]};
-       [#last_activity{timestamp = TimeStamp}] ->
+       [#last_activity{timestamp = TimeStamp, status = Status}] ->
            {MegaSecs, Secs, _MicroSecs} = now(),
            TimeStamp2 = MegaSecs * 1000000 + Secs,
            Sec = TimeStamp2 - TimeStamp,
@@ -101,17 +102,18 @@ get_last(IQ, SubEl, LUser) ->
                  sub_el = [{xmlelement, "query",
                             [{"xmlns", ?NS_LAST},
                              {"seconds", integer_to_list(Sec)}],
-                            []}]}
+                            [{xmlcdata, Status}]}]}
     end.
 
 
 
-on_presence_update(LUser) ->
+on_presence_update(LUser, Status) ->
     {MegaSecs, Secs, _MicroSecs} = now(),
     TimeStamp = MegaSecs * 1000000 + Secs,
     F = fun() ->
                mnesia:write(#last_activity{user = LUser,
-                                           timestamp = TimeStamp})
+                                           timestamp = TimeStamp,
+                                           status = Status})
        end,
     mnesia:transaction(F).
 
@@ -122,3 +124,22 @@ remove_user(User) ->
                mnesia:delete({last_activity, LUser})
        end,
     mnesia:transaction(F).
+
+
+update_table() ->
+    Fields = record_info(fields, last_activity),
+    case mnesia:table_info(last_activity, attributes) of
+       Fields ->
+           ok;
+       [user, timestamp] ->
+           ?INFO_MSG("Converting last_activity table from {user, timestamp} format", []),
+           mnesia:transform_table(
+             last_activity,
+             fun({_, U, T}) ->
+                     #last_activity{user = U, timestamp = T, status = ""}
+             end, Fields);
+       _ ->
+           ?INFO_MSG("Recreating last_activity table", []),
+           mnesia:transform_table(last_activity, ignore, Fields)
+    end.
+
index 734b1e86386046f84481a77d44fdda23c7c43049..b89012e96bfd6cc062745f1413a224c1e376fcdf 100644 (file)
@@ -50,7 +50,7 @@ start(Opts) ->
                                  ?MODULE, process_iq, IQDisc).
 
 stop() ->
-    gen_iq_handler:remove_iq_handler(ejabberd_local, ?NS_PRIVACY).
+    gen_iq_handler:remove_iq_handler(ejabberd_sm, ?NS_PRIVACY).
 
 process_iq(From, _To, IQ) ->
     #iq{type = Type, sub_el = SubEl} = IQ,
index 868d0ef9e3b7c4d897d0985e07029b959f13c199..fa77ab5a1390c3878fd6bfe21467b645f6af633e 100644 (file)
@@ -14,7 +14,7 @@
 
 -export([start/1,
         stop/0,
-        process_local_iq/3,
+        process_sm_iq/3,
         remove_user/1]).
 
 -include("ejabberd.hrl").
@@ -28,13 +28,13 @@ start(Opts) ->
                        [{disc_only_copies, [node()]},
                         {attributes, record_info(fields, private_storage)}]),
     gen_iq_handler:add_iq_handler(ejabberd_sm, ?NS_PRIVATE,
-                                 ?MODULE, process_local_iq, IQDisc).
+                                 ?MODULE, process_sm_iq, IQDisc).
 
 stop() ->
-    gen_iq_handler:remove_iq_handler(ejabberd_local, ?NS_PRIVATE).
+    gen_iq_handler:remove_iq_handler(ejabberd_sm, ?NS_PRIVATE).
 
 
-process_local_iq(From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
+process_sm_iq(From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
     #jid{luser = LUser, lserver = LServer} = From,
     case ?MYNAME of
        LServer ->
index a07c14e11df3ae9d0ce8f31a5abf97757d4fc98f..3099af0b19c8c319000a54c4ebe4402b845194c7 100644 (file)
@@ -122,7 +122,8 @@ try_register(User, Password) ->
            {error, ?ERR_BAD_REQUEST};
        _ ->
            JID = jlib:make_jid(User, ?MYNAME, ""),
-           case acl:match_rule(register, JID) of
+           Access = gen_mod:get_module_opt(?MODULE, access, all),
+           case acl:match_rule(Access, JID) of
                deny ->
                    {error, ?ERR_CONFLICT};
                allow ->
index 2dbc987c9982125420ef5c53d3a6e11ba6b8e68d..e2257772a4795c03fdca6e271f3a8b2722c67422 100644 (file)
@@ -70,10 +70,10 @@ start(Opts) ->
 
 init(Host, Search) ->
     case Search of
-       true ->
-           ejabberd_router:register_route(Host),
+       false ->
            loop(Host);
        _ ->
+           ejabberd_router:register_route(Host),
            loop(Host)
     end.
 
index 1e2b2081b91f8e4cb09ace23387d373215065759..b4fdeb0d858264d02fb3a226b7d42107d03ee4d7 100644 (file)
 % Used modules:
 {modules,
  [
-  {mod_register,  []},
+  {mod_register,  [{access, register}]},
   {mod_roster,    []},
   {mod_privacy,   []},
   {mod_configure, []},