mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-24 16:23:40 +01:00
*** empty log message ***
SVN Revision: 4
This commit is contained in:
parent
d3c120d55d
commit
a717a39a6d
@ -13,5 +13,17 @@
|
||||
-export([start/0]).
|
||||
|
||||
start() ->
|
||||
{ok, _} = erl_ddll:start(),
|
||||
ejabberd_listener:start().
|
||||
register(ejabberd, self()),
|
||||
{A1, A2, A3} = now(),
|
||||
random:seed(A1,A2,A3),
|
||||
ok = erl_ddll:load_driver(".", expat_erl),
|
||||
Port = open_port({spawn, expat_erl}, [binary]),
|
||||
ejabberd_listener:start(),
|
||||
loop(Port).
|
||||
|
||||
|
||||
loop(Port) ->
|
||||
receive
|
||||
_ ->
|
||||
loop(Port)
|
||||
end.
|
||||
|
@ -21,42 +21,10 @@
|
||||
%
|
||||
-export([init/1, wait_for_stream/2, wait_for_auth/2, terminate/3]).
|
||||
|
||||
-record(state, {socket, sender, receiver}).
|
||||
-record(state, {socket, sender, receiver, streamid}).
|
||||
|
||||
-include("ejabberd.hrl").
|
||||
|
||||
%start_old(Socket) ->
|
||||
% spawn(?MODULE, init, [Socket]).
|
||||
|
||||
%init_old(Socket) ->
|
||||
% SenderPid = spawn(?MODULE, sender, [Socket]),
|
||||
% ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]),
|
||||
% loop_old(Socket, SenderPid, ReceiverPid).
|
||||
%
|
||||
%loop_old(Socket, SenderPid, ReceiverPid) ->
|
||||
% receive
|
||||
% {xmlstreamstart, Name, Attrs} ->
|
||||
% ?DEBUG("Socket(~p) -> XML Stream start~n"
|
||||
% " Name: ~s~n"
|
||||
% " Attrs: ~p~n", [Socket, Name, Attrs]),
|
||||
% loop_old(Socket, SenderPid, ReceiverPid);
|
||||
% {xmlstreamend, Name} ->
|
||||
% ?DEBUG("Socket(~p) -> XML Stream end~n"
|
||||
% " Name: ~s~n", [Socket, Name]),
|
||||
% loop_old(Socket, SenderPid, ReceiverPid);
|
||||
% {xmlstreamelement, El} ->
|
||||
% ?DEBUG("Socket(~p) -> XML Stream element~n"
|
||||
% " Element: ~p~n", [Socket, El]),
|
||||
% loop_old(Socket, SenderPid, ReceiverPid);
|
||||
% {xmlstreamerror, Err} ->
|
||||
% ?DEBUG("Socket(~p) -> XML Stream error~n"
|
||||
% " Error: ~p~n", [Socket, Err]),
|
||||
% loop_old(Socket, SenderPid, ReceiverPid)
|
||||
% end.
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
-define(DBGFSM, true).
|
||||
|
||||
-ifdef(DBGFSM).
|
||||
@ -81,8 +49,6 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
start(Socket) ->
|
||||
gen_fsm:start(ejabberd_c2s, [Socket], ?FSMOPTS).
|
||||
%start_old(Socket) ->
|
||||
% spawn(?MODULE, init, [Socket]).
|
||||
|
||||
%%%----------------------------------------------------------------------
|
||||
%%% Callback functions from gen_fsm
|
||||
@ -100,7 +66,8 @@ init([Socket]) ->
|
||||
ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]),
|
||||
{ok, wait_for_stream, #state{socket = Socket,
|
||||
receiver = ReceiverPid,
|
||||
sender = SenderPid}}.
|
||||
sender = SenderPid,
|
||||
streamid = new_id()}}.
|
||||
|
||||
%%----------------------------------------------------------------------
|
||||
%% Func: StateName/2
|
||||
@ -113,7 +80,8 @@ state_name(Event, StateData) ->
|
||||
|
||||
wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) ->
|
||||
% TODO
|
||||
Header = io_lib:format(?STREAM_HEADER, ["SID", "localhost"]),
|
||||
Header = io_lib:format(?STREAM_HEADER,
|
||||
[StateData#state.streamid, "localhost"]),
|
||||
send_text(StateData#state.sender, Header),
|
||||
case lists:keysearch("xmlns:stream", 1, Attrs) of
|
||||
{value, {"xmlns:stream", "http://etherx.jabber.org/streams"}} ->
|
||||
@ -130,8 +98,14 @@ wait_for_stream(closed, StateData) ->
|
||||
|
||||
|
||||
wait_for_auth({xmlstreamelement, El}, StateData) ->
|
||||
case is_auth_packet(El) of
|
||||
{auth, {U, P, D, R}} ->
|
||||
io:format("AUTH: ~p~n", [{U, P, D, R}]),
|
||||
% TODO
|
||||
{next_state, wait_for_auth, StateData};
|
||||
{next_state, session_established, StateData};
|
||||
_ ->
|
||||
{next_state, wait_for_auth, StateData}
|
||||
end;
|
||||
|
||||
wait_for_auth({xmlstreamend, Name}, StateData) ->
|
||||
% TODO
|
||||
@ -228,3 +202,47 @@ sender(Socket) ->
|
||||
send_text(Pid, Text) ->
|
||||
Pid ! {text, Text}.
|
||||
|
||||
new_id() ->
|
||||
io_lib:format("~p", [random:uniform(65536*65536)]).
|
||||
|
||||
|
||||
is_auth_packet({xmlelement, Name, Attrs, Els}) when Name == "iq" ->
|
||||
case xml:get_attr_s("type", Attrs) of
|
||||
"set" ->
|
||||
case xml:remove_cdata(Els) of
|
||||
[{xmlelement, "query", Attrs2, Els2}] ->
|
||||
case xml:get_attr_s("xmlns", Attrs2) of
|
||||
"jabber:iq:auth" ->
|
||||
{auth, get_auth_tags(Els2, "", "", "", "")};
|
||||
_ -> false
|
||||
end;
|
||||
_ ->
|
||||
false
|
||||
end;
|
||||
true ->
|
||||
false
|
||||
end;
|
||||
|
||||
is_auth_packet(_) ->
|
||||
false.
|
||||
|
||||
get_auth_tags([{xmlelement, Name, Attrs, Els}| L], U, P, D, R) ->
|
||||
CData = xml:get_cdata(Els),
|
||||
case Name of
|
||||
"username" ->
|
||||
get_auth_tags(L, CData, P, D, R);
|
||||
"password" ->
|
||||
get_auth_tags(L, U, CData, D, R);
|
||||
"digest" ->
|
||||
get_auth_tags(L, U, P, CData, R);
|
||||
"resource" ->
|
||||
get_auth_tags(L, U, P, D, CData);
|
||||
_ ->
|
||||
get_auth_tags(L, U, P, D, R)
|
||||
end;
|
||||
get_auth_tags([_ | L], U, P, D, R) ->
|
||||
get_auth_tags(L, U, P, D, R);
|
||||
get_auth_tags([], U, P, D, R) ->
|
||||
{U, P, D, R}.
|
||||
|
||||
|
||||
|
@ -94,7 +94,7 @@ static ErlDrvData expat_erl_start(ErlDrvPort port, char *buff)
|
||||
|
||||
static void expat_erl_stop(ErlDrvData handle)
|
||||
{
|
||||
/* TODO: free parser */
|
||||
XML_ParserFree(((expat_data *)handle)->parser);
|
||||
driver_free((char*)handle);
|
||||
}
|
||||
|
||||
|
92
src/xml.erl
Normal file
92
src/xml.erl
Normal file
@ -0,0 +1,92 @@
|
||||
%%%----------------------------------------------------------------------
|
||||
%%% File : xml.erl
|
||||
%%% Author : Alexey Shchepin <alexey@sevcom.net>
|
||||
%%% Purpose : XML utils
|
||||
%%% Created : 20 Nov 2002 by Alexey Shchepin <alexey@sevcom.net>
|
||||
%%% Id : $Id$
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-module(xml).
|
||||
-author('alexey@sevcom.net').
|
||||
-vsn('$Revision$ ').
|
||||
|
||||
-export([element_to_string/1, crypt/1, remove_cdata/1, get_cdata/1,
|
||||
get_attr/2, get_attr_s/2]).
|
||||
|
||||
element_to_string(El) ->
|
||||
case El of
|
||||
{xmlelement, Name, Attrs, Els} ->
|
||||
if length(Els) > 0 ->
|
||||
"<" ++ Name ++ attrs_to_string(Attrs) ++ ">" ++
|
||||
lists:append(
|
||||
lists:map(fun(E) -> element_to_string(E) end, Els))
|
||||
++ "</" ++ Name ++ ">";
|
||||
true ->
|
||||
"<" ++ Name ++ attrs_to_string(Attrs) ++ "/>"
|
||||
end;
|
||||
{xmlcdata, CData} -> crypt(CData)
|
||||
end.
|
||||
|
||||
|
||||
attrs_to_string(Attrs) ->
|
||||
lists:append(lists:map(fun(A) -> attr_to_string(A) end, Attrs)).
|
||||
|
||||
attr_to_string({Name, Value}) ->
|
||||
" " ++ crypt(Name) ++ "='" ++ crypt(Value) ++ "'".
|
||||
|
||||
crypt(S) ->
|
||||
lists:reverse(crypt(S, "")).
|
||||
|
||||
crypt([$& | S], R) ->
|
||||
crypt(S, [$;, $p, $m, $a, $& | R]);
|
||||
crypt([$< | S], R) ->
|
||||
crypt(S, [$;, $t, $l, $& | R]);
|
||||
crypt([$> | S], R) ->
|
||||
crypt(S, [$;, $t, $g, $& | R]);
|
||||
crypt([$" | S], R) ->
|
||||
crypt(S, [$;, $t, $o, $u, $q, $& | R]);
|
||||
crypt([$' | S], R) ->
|
||||
crypt(S, [$;, $s, $o, $p, $a, $& | R]);
|
||||
crypt([C | S], R) ->
|
||||
crypt(S, [C | R]);
|
||||
crypt([], R) ->
|
||||
R.
|
||||
|
||||
|
||||
remove_cdata(L) ->
|
||||
lists:reverse(remove_cdata(L, [])).
|
||||
|
||||
remove_cdata([{xmlelement, Name, Attrs, Els} | L], R) ->
|
||||
remove_cdata(L, [{xmlelement, Name, Attrs, Els} | R]);
|
||||
remove_cdata([{xmlcdata, CData} | L], R) ->
|
||||
remove_cdata(L, R);
|
||||
remove_cdata([], R) ->
|
||||
R.
|
||||
|
||||
get_cdata(L) ->
|
||||
get_cdata(L, "").
|
||||
|
||||
get_cdata([{xmlcdata, CData} | L], S) ->
|
||||
get_cdata(L, S ++ CData);
|
||||
get_cdata([_ | L], S) ->
|
||||
get_cdata(L, S);
|
||||
get_cdata([], S) ->
|
||||
S.
|
||||
|
||||
|
||||
get_attr(AttrName, Attrs) ->
|
||||
case lists:keysearch(AttrName, 1, Attrs) of
|
||||
{value, {_, Val}} ->
|
||||
{value, Val};
|
||||
_ ->
|
||||
false
|
||||
end.
|
||||
|
||||
get_attr_s(AttrName, Attrs) ->
|
||||
case lists:keysearch(AttrName, 1, Attrs) of
|
||||
{value, {_, Val}} ->
|
||||
Val;
|
||||
_ ->
|
||||
""
|
||||
end.
|
||||
|
@ -16,7 +16,6 @@ start(CallbackPid) ->
|
||||
spawn(?MODULE, init, [CallbackPid]).
|
||||
|
||||
init(CallbackPid) ->
|
||||
ok = erl_ddll:load_driver(".", expat_erl),
|
||||
Port = open_port({spawn, expat_erl}, [binary]),
|
||||
loop(CallbackPid, Port, []).
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user