]> granicus.if.org Git - ejabberd/commitdiff
*** empty log message ***
authorAlexey Shchepin <alexey@process-one.net>
Wed, 11 Dec 2002 20:57:45 +0000 (20:57 +0000)
committerAlexey Shchepin <alexey@process-one.net>
Wed, 11 Dec 2002 20:57:45 +0000 (20:57 +0000)
SVN Revision: 15

src/ejabberd_c2s.erl
src/ejabberd_local.erl
src/jlib.erl
src/mod_register.erl
src/mod_roster.erl [new file with mode: 0644]

index 79b30de1633db4f016c073c2b6fbd4341e4b527b..a6f083132e4aa0b4309708f69a53d76138ad2af3 100644 (file)
@@ -113,7 +113,7 @@ wait_for_auth({xmlstreamelement, El}, StateData) ->
                    {next_state, session_established,
                     StateData#state{user = U, resource = R}};
                _ ->
-                   Err = jlib:make_error_reply(El, "404", "Unauthorized"),
+                   Err = jlib:make_error_reply(El, "401", "Unauthorized"),
                    send_element(StateData#state.sender, Err),
                    {next_state, wait_for_auth, StateData}
            end;
@@ -164,6 +164,9 @@ session_established({xmlstreamelement, El}, StateData) ->
     end,
     {next_state, session_established, StateData};
 
+session_established({xmlstreamend, Name}, StateData) ->
+    {stop, normal, StateData};
+
 session_established(closed, StateData) ->
     % TODO
     {stop, normal, StateData}.
index 0e0321c1afc55db45fa17d634a8a3ec05a21f9f2..32bbdfbb14e23f84f997fcb66ad890d9a43d151e 100644 (file)
 -author('alexey@sevcom.net').
 -vsn('$Revision$ ').
 
-%%-export([Function/Arity, ...]).
+-export([start/0, init/0]).
 
--export([start/0,init/0]).
+-export([register_iq_handler/3]).
 
 -include("ejabberd.hrl").
 
+-record(state, {mydomain, iqtable}).
 
 start() ->
-    spawn(ejabberd_local, init, []).
+    register(ejabberd_local, spawn(ejabberd_local, init, [])),
+    mod_register:start(),
+    ok.
 
 init() ->
-    ejabberd_router:register_local_route(?MYNAME),
-    loop().
+    MyDomain = ?MYNAME,
+    ejabberd_router:register_local_route(MyDomain),
+    loop(#state{mydomain = MyDomain,
+               iqtable = ets:new(iqtable, [])}).
 
-loop() ->
+loop(State) ->
     receive
        {route, From, To, Packet} ->
-           do_route(From, To, Packet),
-           loop()
+           do_route(State, From, To, Packet),
+           loop(State);
+       {register_iq_handler, XMLNS, Module, Function} ->
+           ets:insert(State#state.iqtable, {XMLNS, Module, Function}),
+           loop(State)
     end.
 
 
-do_route(From, To, Packet) ->
+do_route(State, From, To, Packet) ->
     ?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
           [From, To, Packet, 8]),
     case To of
+       {"", _, ""} ->
+           {xmlelement, Name, Attrs, Els} = Packet,
+           case Name of
+               "iq" ->
+                   process_iq(State, From, To, Packet);
+               "message" ->
+                   ok;
+               "presence" ->
+                   % TODO
+                   ok;
+               _ ->
+                   % DROP
+                   ok
+           end;
        {"", _, _} ->
+           Err = jlib:make_error_reply(Packet, "404", "Not Found"),
+           ejabberd_router ! {route,
+                              {"", State#state.mydomain, ""}, From, Err},
            ok;
        _ ->
            ejabberd_sm ! {route, From, To, Packet}
-    end,
-    ok.
+    end.
+
+process_iq(State, From, To, Packet) ->
+    IQ = jlib:iq_query_info(Packet),
+    case IQ of
+       {iq, ID, Type, XMLNS, SubEl} ->
+           case jlib:is_iq_request_type(Type) of
+               true ->
+                   % TODO
+                   case ets:lookup(State#state.iqtable, XMLNS) of
+                       [{_, Module, Function}] ->
+                           ResIQ = apply(Module, Function, [From, To, IQ]),
+                           if
+                               ResIQ /= ignore ->
+                                   ejabberd_router ! {route,
+                                                      To,
+                                                      From,
+                                                      jlib:iq_to_xml(ResIQ)};
+                               true ->
+                                   ok
+                           end;
+                       [] ->
+                           Err = jlib:make_error_reply(
+                                   Packet, "501", "Not Implemented"),
+                           ejabberd_router ! {route,
+                                              {"", State#state.mydomain, ""},
+                                              From,
+                                              Err}
+                   end;
+               _ ->
+                   % TODO
+                   ok
+           end;
+       _ ->
+           Err = jlib:make_error_reply(Packet, "400", "Bad Request"),
+           ejabberd_router ! {route,
+                              {"", State#state.mydomain, ""}, From, Err},
+           ok
+    end.
 
+register_iq_handler(XMLNS, Module, Fun) ->
+    ejabberd_local ! {register_iq_handler, XMLNS, Module, Fun}.
index c4c510f4d627334dc34369b580950f2a84da2222..a829b327423a7c8b61add0cda5caf8d7ccf01d2b 100644 (file)
@@ -21,6 +21,7 @@
         tolower/1,
         get_iq_namespace/1,
         iq_query_info/1,
+        is_iq_request_type/1,
         iq_to_xml/1,
         get_subtag/2]).
 
@@ -206,6 +207,10 @@ iq_query_info({xmlelement, Name, Attrs, Els}) when Name == "iq" ->
 iq_query_info(_) ->
     not_iq.
 
+is_iq_request_type(set) -> true;
+is_iq_request_type(get) -> true;
+is_iq_request_type(_) -> false.
+
 iq_type_to_string(set) -> "set";
 iq_type_to_string(get) -> "get";
 iq_type_to_string(result) -> "result";
index ecd064b62996880a24d65674b2129c216c2240eb..b9d5be87fdfbc44765614d6928b14335a3d16118 100644 (file)
 -author('alexey@sevcom.net').
 -vsn('$Revision$ ').
 
--export([process_iq/3]).
+-export([start/0, init/0, process_iq/3]).
 
 -include("ejabberd.hrl").
 
+start() ->
+    ejabberd_local:register_iq_handler("jabber:iq:register",
+                                      ?MODULE, process_iq),
+    ok.
+
+init() ->
+    ok.
+
 process_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
     case Type of
        set ->
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
new file mode 100644 (file)
index 0000000..7e327a5
--- /dev/null
@@ -0,0 +1,47 @@
+%%%----------------------------------------------------------------------
+%%% File    : mod_roster.erl
+%%% Author  : Alexey Shchepin <alexey@sevcom.net>
+%%% Purpose : 
+%%% Created : 11 Dec 2002 by Alexey Shchepin <alexey@sevcom.net>
+%%% Id      : $Id$
+%%%----------------------------------------------------------------------
+
+-module(mod_roster).
+-author('alexey@sevcom.net').
+-vsn('$Revision$ ').
+
+-export([]).
+
+-export([start/0]).
+
+-record(roster, {user, jid, name, subscription, groups, xs}).
+
+
+start() ->
+    mnesia:create_table(roster,[{disc_copies, [node()]},
+                               {type, bag},
+                               {attributes, record_info(fields, roster)}]),
+    ejabberd_local:register_iq_handler("jabber:iq:roster",
+                                      ?MODULE, process_iq).
+    %spawn(mod_roster, init, []).
+
+%init() ->
+%    loop().
+%
+%loop() ->
+%    receive
+%      _ ->
+%          loop()
+%    end.
+
+
+% TODO
+process_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
+    case Type of
+       set ->
+           {iq, ID, error, XMLNS, []};
+       get ->
+           {iq, ID, error, XMLNS, []}
+    end.
+
+