mirror of
https://github.com/processone/ejabberd.git
synced 2024-06-18 22:15:20 +02:00
Added port and password connection parameters (thanks to Anton Podavalov)(EJAB-339)
SVN Revision: 2446
This commit is contained in:
parent
dd2be928af
commit
0e8dd70ed5
|
@ -35,7 +35,7 @@
|
||||||
start/2,
|
start/2,
|
||||||
stop/1,
|
stop/1,
|
||||||
closed_connection/3,
|
closed_connection/3,
|
||||||
get_user_and_encoding/3]).
|
get_connection_params/3]).
|
||||||
|
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||||
|
@ -46,6 +46,7 @@
|
||||||
-include("adhoc.hrl").
|
-include("adhoc.hrl").
|
||||||
|
|
||||||
-define(DEFAULT_IRC_ENCODING, "iso8859-1").
|
-define(DEFAULT_IRC_ENCODING, "iso8859-1").
|
||||||
|
-define(DEFAULT_IRC_PORT, 6667).
|
||||||
-define(POSSIBLE_ENCODINGS, ["koi8-r", "iso8859-1", "iso8859-2", "utf-8", "utf-8+latin-1"]).
|
-define(POSSIBLE_ENCODINGS, ["koi8-r", "iso8859-1", "iso8859-2", "utf-8", "utf-8+latin-1"]).
|
||||||
|
|
||||||
-record(irc_connection, {jid_server_host, pid}).
|
-record(irc_connection, {jid_server_host, pid}).
|
||||||
|
@ -328,7 +329,7 @@ do_route1(Host, ServerHost, From, To, Packet) ->
|
||||||
case ets:lookup(irc_connection, {From, Server, Host}) of
|
case ets:lookup(irc_connection, {From, Server, Host}) of
|
||||||
[] ->
|
[] ->
|
||||||
?DEBUG("open new connection~n", []),
|
?DEBUG("open new connection~n", []),
|
||||||
{Username, Encoding} = get_user_and_encoding(
|
{Username, Encoding, Port, Password} = get_connection_params(
|
||||||
Host, From, Server),
|
Host, From, Server),
|
||||||
ConnectionUsername =
|
ConnectionUsername =
|
||||||
case Packet of
|
case Packet of
|
||||||
|
@ -347,7 +348,7 @@ do_route1(Host, ServerHost, From, To, Packet) ->
|
||||||
end,
|
end,
|
||||||
{ok, Pid} = mod_irc_connection:start(
|
{ok, Pid} = mod_irc_connection:start(
|
||||||
From, Host, ServerHost, Server,
|
From, Host, ServerHost, Server,
|
||||||
ConnectionUsername, Encoding),
|
ConnectionUsername, Encoding, Port, Password),
|
||||||
ets:insert(
|
ets:insert(
|
||||||
irc_connection,
|
irc_connection,
|
||||||
#irc_connection{jid_server_host = {From, Server, Host},
|
#irc_connection{jid_server_host = {From, Server, Host},
|
||||||
|
@ -436,7 +437,7 @@ command_items(Host, Lang) ->
|
||||||
|
|
||||||
commands() ->
|
commands() ->
|
||||||
[{"join", "Join channel", fun adhoc_join/3},
|
[{"join", "Join channel", fun adhoc_join/3},
|
||||||
{"register", "Configure username and encoding", fun adhoc_register/3}].
|
{"register", "Configure username, encoding, port and password", fun adhoc_register/3}].
|
||||||
|
|
||||||
process_register(Host, From, To, #iq{} = IQ) ->
|
process_register(Host, From, To, #iq{} = IQ) ->
|
||||||
case catch process_irc_register(Host, From, To, IQ) of
|
case catch process_irc_register(Host, From, To, IQ) of
|
||||||
|
@ -542,12 +543,12 @@ get_form(Host, From, [], Lang) ->
|
||||||
{User, []};
|
{User, []};
|
||||||
[#irc_custom{data = Data}] ->
|
[#irc_custom{data = Data}] ->
|
||||||
{xml:get_attr_s(username, Data),
|
{xml:get_attr_s(username, Data),
|
||||||
xml:get_attr_s(encodings, Data)}
|
xml:get_attr_s(connections_params, Data)}
|
||||||
end,
|
end,
|
||||||
case Customs of
|
case Customs of
|
||||||
{error, _Error} ->
|
{error, _Error} ->
|
||||||
Customs;
|
Customs;
|
||||||
{Username, Encodings} ->
|
{Username, ConnectionsParams} ->
|
||||||
{result,
|
{result,
|
||||||
[{xmlelement, "instructions", [],
|
[{xmlelement, "instructions", [],
|
||||||
[{xmlcdata,
|
[{xmlcdata,
|
||||||
|
@ -565,7 +566,7 @@ get_form(Host, From, [], Lang) ->
|
||||||
[{xmlcdata,
|
[{xmlcdata,
|
||||||
translate:translate(
|
translate:translate(
|
||||||
Lang,
|
Lang,
|
||||||
"Enter username and encodings you wish to use for "
|
"Enter username, encodings, ports and passwords you wish to use for "
|
||||||
"connecting to IRC servers")}]},
|
"connecting to IRC servers")}]},
|
||||||
{xmlelement, "field", [{"type", "text-single"},
|
{xmlelement, "field", [{"type", "text-single"},
|
||||||
{"label",
|
{"label",
|
||||||
|
@ -580,30 +581,32 @@ get_form(Host, From, [], Lang) ->
|
||||||
io_lib:format(
|
io_lib:format(
|
||||||
translate:translate(
|
translate:translate(
|
||||||
Lang,
|
Lang,
|
||||||
"If you want to specify different encodings "
|
"If you want to specify different ports, "
|
||||||
"for IRC servers, fill this list with values "
|
"passwords, encodings for IRC servers, fill "
|
||||||
"in format '{\"irc server\", \"encoding\"}'. "
|
"this list with values in format "
|
||||||
"By default this service use \"~s\" encoding."),
|
"'{\"irc server\", \"encoding\", port, \"password\"}'. "
|
||||||
[?DEFAULT_IRC_ENCODING]))}]}]},
|
"By default this service use \"~s\" encoding, port ~p, "
|
||||||
|
"empty password."),
|
||||||
|
[?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT]))}]}]},
|
||||||
{xmlelement, "field", [{"type", "fixed"}],
|
{xmlelement, "field", [{"type", "fixed"}],
|
||||||
[{xmlelement, "value", [],
|
[{xmlelement, "value", [],
|
||||||
[{xmlcdata,
|
[{xmlcdata,
|
||||||
translate:translate(
|
translate:translate(
|
||||||
Lang,
|
Lang,
|
||||||
"Example: [{\"irc.lucky.net\", \"koi8-r\"}, "
|
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, "
|
||||||
"{\"vendetta.fef.net\", \"iso8859-1\"}]."
|
"{\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
|
||||||
)}]}]},
|
)}]}]},
|
||||||
{xmlelement, "field", [{"type", "text-multi"},
|
{xmlelement, "field", [{"type", "text-multi"},
|
||||||
{"label",
|
{"label",
|
||||||
translate:translate(Lang, "Encodings")},
|
translate:translate(Lang, "Connections parameters")},
|
||||||
{"var", "encodings"}],
|
{"var", "connections_params"}],
|
||||||
lists:map(
|
lists:map(
|
||||||
fun(S) ->
|
fun(S) ->
|
||||||
{xmlelement, "value", [], [{xmlcdata, S}]}
|
{xmlelement, "value", [], [{xmlcdata, S}]}
|
||||||
end,
|
end,
|
||||||
string:tokens(
|
string:tokens(
|
||||||
lists:flatten(
|
lists:flatten(
|
||||||
io_lib:format("~p.", [Encodings])),
|
io_lib:format("~p.", [ConnectionsParams])),
|
||||||
"\n"))
|
"\n"))
|
||||||
}
|
}
|
||||||
]}]}
|
]}]}
|
||||||
|
@ -619,7 +622,7 @@ set_form(Host, From, [], _Lang, XData) ->
|
||||||
{LUser, LServer, _} = jlib:jid_tolower(From),
|
{LUser, LServer, _} = jlib:jid_tolower(From),
|
||||||
US = {LUser, LServer},
|
US = {LUser, LServer},
|
||||||
case {lists:keysearch("username", 1, XData),
|
case {lists:keysearch("username", 1, XData),
|
||||||
lists:keysearch("encodings", 1, XData)} of
|
lists:keysearch("connections_params", 1, XData)} of
|
||||||
{{value, {_, [Username]}}, {value, {_, Strings}}} ->
|
{{value, {_, [Username]}}, {value, {_, Strings}}} ->
|
||||||
EncString = lists:foldl(fun(S, Res) ->
|
EncString = lists:foldl(fun(S, Res) ->
|
||||||
Res ++ S ++ "\n"
|
Res ++ S ++ "\n"
|
||||||
|
@ -627,7 +630,7 @@ set_form(Host, From, [], _Lang, XData) ->
|
||||||
case erl_scan:string(EncString) of
|
case erl_scan:string(EncString) of
|
||||||
{ok, Tokens, _} ->
|
{ok, Tokens, _} ->
|
||||||
case erl_parse:parse_term(Tokens) of
|
case erl_parse:parse_term(Tokens) of
|
||||||
{ok, Encodings} ->
|
{ok, ConnectionsParams} ->
|
||||||
case mnesia:transaction(
|
case mnesia:transaction(
|
||||||
fun() ->
|
fun() ->
|
||||||
mnesia:write(
|
mnesia:write(
|
||||||
|
@ -636,8 +639,8 @@ set_form(Host, From, [], _Lang, XData) ->
|
||||||
data =
|
data =
|
||||||
[{username,
|
[{username,
|
||||||
Username},
|
Username},
|
||||||
{encodings,
|
{connections_params,
|
||||||
Encodings}]})
|
ConnectionsParams}]})
|
||||||
end) of
|
end) of
|
||||||
{atomic, _} ->
|
{atomic, _} ->
|
||||||
{result, []};
|
{result, []};
|
||||||
|
@ -659,21 +662,37 @@ set_form(_Host, _, _, _Lang, _XData) ->
|
||||||
{error, ?ERR_SERVICE_UNAVAILABLE}.
|
{error, ?ERR_SERVICE_UNAVAILABLE}.
|
||||||
|
|
||||||
|
|
||||||
get_user_and_encoding(Host, From, IRCServer) ->
|
get_connection_params(Host, From, IRCServer) ->
|
||||||
#jid{user = User, server = _Server,
|
#jid{user = User, server = _Server,
|
||||||
luser = LUser, lserver = LServer} = From,
|
luser = LUser, lserver = LServer} = From,
|
||||||
US = {LUser, LServer},
|
US = {LUser, LServer},
|
||||||
case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
|
case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
|
||||||
{'EXIT', _Reason} ->
|
{'EXIT', _Reason} ->
|
||||||
{User, ?DEFAULT_IRC_ENCODING};
|
{User, ?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT, ""};
|
||||||
[] ->
|
[] ->
|
||||||
{User, ?DEFAULT_IRC_ENCODING};
|
{User, ?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT, ""};
|
||||||
[#irc_custom{data = Data}] ->
|
[#irc_custom{data = Data}] ->
|
||||||
{xml:get_attr_s(username, Data),
|
Username = xml:get_attr_s(username, Data),
|
||||||
case xml:get_attr_s(IRCServer, xml:get_attr_s(encodings, Data)) of
|
{NewUsername, NewEncoding, NewPort, NewPassword} =
|
||||||
"" -> ?DEFAULT_IRC_ENCODING;
|
case lists:keysearch(IRCServer, 1, xml:get_attr_s(connections_params, Data)) of
|
||||||
E -> E
|
{value, {_, Encoding, Port, Password}} ->
|
||||||
end}
|
{Username, Encoding, Port, Password};
|
||||||
|
{value, {_, Encoding, Port}} ->
|
||||||
|
{Username, Encoding, Port, ""};
|
||||||
|
{value, {_, Encoding}} ->
|
||||||
|
{Username, Encoding, ?DEFAULT_IRC_PORT, ""};
|
||||||
|
_ ->
|
||||||
|
{Username, ?DEFAULT_IRC_ENCODING, ?DEFAULT_IRC_PORT, ""}
|
||||||
|
end,
|
||||||
|
{NewUsername,
|
||||||
|
NewEncoding,
|
||||||
|
if
|
||||||
|
NewPort >= 0 andalso NewPort =< 65535 ->
|
||||||
|
NewPort;
|
||||||
|
true ->
|
||||||
|
?DEFAULT_IRC_PORT
|
||||||
|
end,
|
||||||
|
NewPassword}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
adhoc_join(_From, _To, #adhoc_request{action = "cancel"} = Request) ->
|
adhoc_join(_From, _To, #adhoc_request{action = "cancel"} = Request) ->
|
||||||
|
@ -766,13 +785,13 @@ adhoc_register(From, To, #adhoc_request{lang = Lang,
|
||||||
case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
|
case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
|
||||||
{'EXIT', _Reason} ->
|
{'EXIT', _Reason} ->
|
||||||
Username = User,
|
Username = User,
|
||||||
Encodings = [];
|
ConnectionsParams = [];
|
||||||
[] ->
|
[] ->
|
||||||
Username = User,
|
Username = User,
|
||||||
Encodings = [];
|
ConnectionsParams = [];
|
||||||
[#irc_custom{data = Data}] ->
|
[#irc_custom{data = Data}] ->
|
||||||
Username = xml:get_attr_s(username, Data),
|
Username = xml:get_attr_s(username, Data),
|
||||||
Encodings = xml:get_attr_s(encodings, Data)
|
ConnectionsParams = xml:get_attr_s(connections_params, Data)
|
||||||
end,
|
end,
|
||||||
Error = false;
|
Error = false;
|
||||||
true ->
|
true ->
|
||||||
|
@ -780,7 +799,7 @@ adhoc_register(From, To, #adhoc_request{lang = Lang,
|
||||||
invalid ->
|
invalid ->
|
||||||
Error = {error, ?ERR_BAD_REQUEST},
|
Error = {error, ?ERR_BAD_REQUEST},
|
||||||
Username = false,
|
Username = false,
|
||||||
Encodings = false;
|
ConnectionsParams = false;
|
||||||
Fields ->
|
Fields ->
|
||||||
Username = case lists:keysearch("username", 1, Fields) of
|
Username = case lists:keysearch("username", 1, Fields) of
|
||||||
{value, {"username", U}} ->
|
{value, {"username", U}} ->
|
||||||
|
@ -788,7 +807,7 @@ adhoc_register(From, To, #adhoc_request{lang = Lang,
|
||||||
_ ->
|
_ ->
|
||||||
User
|
User
|
||||||
end,
|
end,
|
||||||
Encodings = parse_encodings(Fields),
|
ConnectionsParams = parse_connections_params(Fields),
|
||||||
Error = false
|
Error = false
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
@ -804,8 +823,8 @@ adhoc_register(From, To, #adhoc_request{lang = Lang,
|
||||||
data =
|
data =
|
||||||
[{username,
|
[{username,
|
||||||
Username},
|
Username},
|
||||||
{encodings,
|
{connections_params,
|
||||||
Encodings}]})
|
ConnectionsParams}]})
|
||||||
end) of
|
end) of
|
||||||
{atomic, _} ->
|
{atomic, _} ->
|
||||||
adhoc:produce_response(Request, #adhoc_response{status = completed});
|
adhoc:produce_response(Request, #adhoc_response{status = completed});
|
||||||
|
@ -813,14 +832,14 @@ adhoc_register(From, To, #adhoc_request{lang = Lang,
|
||||||
{error, ?ERR_INTERNAL_SERVER_ERROR}
|
{error, ?ERR_INTERNAL_SERVER_ERROR}
|
||||||
end;
|
end;
|
||||||
true ->
|
true ->
|
||||||
Form = generate_adhoc_register_form(Lang, Username, Encodings),
|
Form = generate_adhoc_register_form(Lang, Username, ConnectionsParams),
|
||||||
adhoc:produce_response(Request,
|
adhoc:produce_response(Request,
|
||||||
#adhoc_response{status = executing,
|
#adhoc_response{status = executing,
|
||||||
elements = [Form],
|
elements = [Form],
|
||||||
actions = ["next", "complete"]})
|
actions = ["next", "complete"]})
|
||||||
end.
|
end.
|
||||||
|
|
||||||
generate_adhoc_register_form(Lang, Username, Encodings) ->
|
generate_adhoc_register_form(Lang, Username, ConnectionsParams) ->
|
||||||
{xmlelement, "x",
|
{xmlelement, "x",
|
||||||
[{"xmlns", ?NS_XDATA},
|
[{"xmlns", ?NS_XDATA},
|
||||||
{"type", "form"}],
|
{"type", "form"}],
|
||||||
|
@ -838,24 +857,58 @@ generate_adhoc_register_form(Lang, Username, Encodings) ->
|
||||||
{"label", translate:translate(Lang, "IRC username")}],
|
{"label", translate:translate(Lang, "IRC username")}],
|
||||||
[{xmlelement, "required", [], []},
|
[{xmlelement, "required", [], []},
|
||||||
{xmlelement, "value", [], [{xmlcdata, Username}]}]}] ++
|
{xmlelement, "value", [], [{xmlcdata, Username}]}]}] ++
|
||||||
generate_encoding_fields(Lang, Encodings, 1, [])}.
|
generate_connection_params_fields(Lang, ConnectionsParams, 1, [])}.
|
||||||
|
|
||||||
generate_encoding_fields(Lang, [], Number, Acc) ->
|
generate_connection_params_fields(Lang, [], Number, Acc) ->
|
||||||
Field = generate_encoding_field(Lang, "", "", Number),
|
Field = generate_connection_params_field(Lang, "", "", 0, "", Number),
|
||||||
lists:reverse(Field ++ Acc);
|
lists:reverse(Field ++ Acc);
|
||||||
generate_encoding_fields(Lang, [{Server, Encoding} | Encodings], Number, Acc) ->
|
|
||||||
Field = generate_encoding_field(Lang, Server, Encoding, Number),
|
|
||||||
generate_encoding_fields(Lang, Encodings, Number + 1, Field ++ Acc).
|
|
||||||
|
|
||||||
generate_encoding_field(Lang, Server, Encoding, Number) ->
|
generate_connection_params_fields(Lang, [ConnectionParams | ConnectionsParams], Number, Acc) ->
|
||||||
|
case ConnectionParams of
|
||||||
|
{Server, Encoding, Port, Password} ->
|
||||||
|
Field = generate_connection_params_field(Lang, Server, Encoding, Port, Password, Number),
|
||||||
|
generate_connection_params_fields(Lang, ConnectionsParams, Number + 1, Field ++ Acc);
|
||||||
|
{Server, Encoding, Port} ->
|
||||||
|
Field = generate_connection_params_field(Lang, Server, Encoding, Port, [], Number),
|
||||||
|
generate_connection_params_fields(Lang, ConnectionsParams, Number + 1, Field ++ Acc);
|
||||||
|
{Server, Encoding} ->
|
||||||
|
Field = generate_connection_params_field(Lang, Server, Encoding, [], [], Number),
|
||||||
|
generate_connection_params_fields(Lang, ConnectionsParams, Number + 1, Field ++ Acc);
|
||||||
|
_ ->
|
||||||
|
[]
|
||||||
|
end.
|
||||||
|
|
||||||
|
generate_connection_params_field(Lang, Server, Encoding, Port, Password, Number) ->
|
||||||
EncodingUsed = case Encoding of
|
EncodingUsed = case Encoding of
|
||||||
[] ->
|
[] ->
|
||||||
?DEFAULT_IRC_ENCODING;
|
?DEFAULT_IRC_ENCODING;
|
||||||
_ ->
|
_ ->
|
||||||
Encoding
|
Encoding
|
||||||
end,
|
end,
|
||||||
|
PortUsed = if
|
||||||
|
Port >= 0 andalso Port =< 65535 ->
|
||||||
|
Port;
|
||||||
|
true ->
|
||||||
|
?DEFAULT_IRC_PORT
|
||||||
|
end,
|
||||||
|
PasswordUsed = case Password of
|
||||||
|
[] ->
|
||||||
|
"";
|
||||||
|
_ ->
|
||||||
|
Password
|
||||||
|
end,
|
||||||
%% Fields are in reverse order, as they will be reversed again later.
|
%% Fields are in reverse order, as they will be reversed again later.
|
||||||
[{xmlelement, "field",
|
[{xmlelement, "field",
|
||||||
|
[{"var", "password" ++ io_lib:format("~b", [Number])},
|
||||||
|
{"type", "text-single"},
|
||||||
|
{"label", io_lib:format(translate:translate(Lang, "Password ~b"), [Number])}],
|
||||||
|
[{xmlelement, "value", [], [{xmlcdata, PasswordUsed}]}]},
|
||||||
|
{xmlelement, "field",
|
||||||
|
[{"var", "port" ++ io_lib:format("~b", [Number])},
|
||||||
|
{"type", "text-single"},
|
||||||
|
{"label", io_lib:format(translate:translate(Lang, "Port ~b"), [Number])}],
|
||||||
|
[{xmlelement, "value", [], [{xmlcdata, PortUsed}]}]},
|
||||||
|
{xmlelement, "field",
|
||||||
[{"var", "encoding" ++ io_lib:format("~b", [Number])},
|
[{"var", "encoding" ++ io_lib:format("~b", [Number])},
|
||||||
{"type", "list-single"},
|
{"type", "list-single"},
|
||||||
{"label", io_lib:format(translate:translate(Lang, "Encoding for server ~b"), [Number])}],
|
{"label", io_lib:format(translate:translate(Lang, "Encoding for server ~b"), [Number])}],
|
||||||
|
@ -870,8 +923,8 @@ generate_encoding_field(Lang, Server, Encoding, Number) ->
|
||||||
{"label", io_lib:format(translate:translate(Lang, "Server ~b"), [Number])}],
|
{"label", io_lib:format(translate:translate(Lang, "Server ~b"), [Number])}],
|
||||||
[{xmlelement, "value", [], [{xmlcdata, Server}]}]}].
|
[{xmlelement, "value", [], [{xmlcdata, Server}]}]}].
|
||||||
|
|
||||||
parse_encodings(Fields) ->
|
parse_connections_params(Fields) ->
|
||||||
%% Find all fields staring with serverN and encodingN, for any values
|
%% Find all fields staring with serverN, encodingN, portN and passwordN for any values
|
||||||
%% of N, and generate lists of {"N", Value}.
|
%% of N, and generate lists of {"N", Value}.
|
||||||
Servers = lists:sort(
|
Servers = lists:sort(
|
||||||
[{lists:nthtail(6, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
|
[{lists:nthtail(6, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
|
||||||
|
@ -880,23 +933,44 @@ parse_encodings(Fields) ->
|
||||||
[{lists:nthtail(8, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
|
[{lists:nthtail(8, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
|
||||||
lists:prefix("encoding", Var)]),
|
lists:prefix("encoding", Var)]),
|
||||||
|
|
||||||
%% Now sort the lists, and find the corresponding pairs.
|
Ports = lists:sort(
|
||||||
parse_encodings(Servers, Encodings).
|
[{lists:nthtail(4, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
|
||||||
|
lists:prefix("port", Var)]),
|
||||||
|
|
||||||
parse_encodings([{ServerN, Server} | Servers], [{EncodingN, Encoding} | Encodings]) ->
|
Passwords = lists:sort(
|
||||||
%% Try to match pairs of servers and encodings, no matter what fields
|
[{lists:nthtail(8, Var), lists:flatten(Value)} || {Var, Value} <- Fields,
|
||||||
%% the client might have left out.
|
lists:prefix("password", Var)]),
|
||||||
if ServerN == EncodingN ->
|
|
||||||
[{Server, Encoding} | parse_encodings(Servers, Encodings)];
|
%% Now sort the lists, and find the corresponding pairs.
|
||||||
ServerN < EncodingN ->
|
parse_connections_params(Servers, Encodings, Ports, Passwords).
|
||||||
parse_encodings(Servers, [{EncodingN, Encoding} | Encodings]);
|
|
||||||
ServerN > EncodingN ->
|
retrieve_connections_params(ConnectionParams, ServerN) ->
|
||||||
parse_encodings([{ServerN, Server} | Servers], Encodings)
|
case ConnectionParams of
|
||||||
|
[{ConnectionParamN, ConnectionParam} | ConnectionParamsTail] ->
|
||||||
|
if
|
||||||
|
ServerN == ConnectionParamN ->
|
||||||
|
{ConnectionParam, ConnectionParamsTail};
|
||||||
|
ServerN < ConnectionParamN ->
|
||||||
|
{[], [{ConnectionParamN, ConnectionParam} | ConnectionParamsTail]};
|
||||||
|
ServerN > ConnectionParamN ->
|
||||||
|
{[], ConnectionParamsTail}
|
||||||
end;
|
end;
|
||||||
parse_encodings([], _) ->
|
_ ->
|
||||||
|
{[], []}
|
||||||
|
end.
|
||||||
|
|
||||||
|
parse_connections_params([], _, _, _) ->
|
||||||
[];
|
[];
|
||||||
parse_encodings(_, []) ->
|
parse_connections_params(_, [], [], []) ->
|
||||||
[].
|
[];
|
||||||
|
|
||||||
|
parse_connections_params([{ServerN, Server} | Servers], Encodings, Ports, Passwords) ->
|
||||||
|
%% Try to match matches of servers, ports, passwords and encodings, no matter what fields
|
||||||
|
%% the client might have left out.
|
||||||
|
{NewEncoding, NewEncodings} = retrieve_connections_params(Encodings, ServerN),
|
||||||
|
{NewPort, NewPorts} = retrieve_connections_params(Ports, ServerN),
|
||||||
|
{NewPassword, NewPasswords} = retrieve_connections_params(Passwords, ServerN),
|
||||||
|
[{Server, NewEncoding, NewPort, NewPassword} | parse_connections_params(Servers, NewEncodings, NewPorts, NewPasswords)].
|
||||||
|
|
||||||
update_table(Host) ->
|
update_table(Host) ->
|
||||||
Fields = record_info(fields, irc_custom),
|
Fields = record_info(fields, irc_custom),
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
-behaviour(gen_fsm).
|
-behaviour(gen_fsm).
|
||||||
|
|
||||||
%% External exports
|
%% External exports
|
||||||
-export([start_link/5, start/6, route_chan/4, route_nick/3]).
|
-export([start_link/7, start/8, route_chan/4, route_nick/3]).
|
||||||
|
|
||||||
%% gen_fsm callbacks
|
%% gen_fsm callbacks
|
||||||
-export([init/1,
|
-export([init/1,
|
||||||
|
@ -48,8 +48,8 @@
|
||||||
|
|
||||||
-define(SETS, gb_sets).
|
-define(SETS, gb_sets).
|
||||||
|
|
||||||
-record(state, {socket, encoding, queue,
|
-record(state, {socket, encoding, port, password,
|
||||||
user, host, server, nick,
|
queue, user, host, server, nick,
|
||||||
channels = dict:new(),
|
channels = dict:new(),
|
||||||
nickchannel,
|
nickchannel,
|
||||||
inbuf = "", outbuf = ""}).
|
inbuf = "", outbuf = ""}).
|
||||||
|
@ -65,13 +65,13 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% API
|
%%% API
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
start(From, Host, ServerHost, Server, Username, Encoding) ->
|
start(From, Host, ServerHost, Server, Username, Encoding, Port, Password) ->
|
||||||
Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_irc_sup),
|
Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_irc_sup),
|
||||||
supervisor:start_child(
|
supervisor:start_child(
|
||||||
Supervisor, [From, Host, Server, Username, Encoding]).
|
Supervisor, [From, Host, Server, Username, Encoding, Port, Password]).
|
||||||
|
|
||||||
start_link(From, Host, Server, Username, Encoding) ->
|
start_link(From, Host, Server, Username, Encoding, Port, Password) ->
|
||||||
gen_fsm:start_link(?MODULE, [From, Host, Server, Username, Encoding],
|
gen_fsm:start_link(?MODULE, [From, Host, Server, Username, Encoding, Port, Password],
|
||||||
?FSMOPTS).
|
?FSMOPTS).
|
||||||
|
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
@ -85,10 +85,12 @@ start_link(From, Host, Server, Username, Encoding) ->
|
||||||
%% ignore |
|
%% ignore |
|
||||||
%% {stop, StopReason}
|
%% {stop, StopReason}
|
||||||
%%----------------------------------------------------------------------
|
%%----------------------------------------------------------------------
|
||||||
init([From, Host, Server, Username, Encoding]) ->
|
init([From, Host, Server, Username, Encoding, Port, Password]) ->
|
||||||
gen_fsm:send_event(self(), init),
|
gen_fsm:send_event(self(), init),
|
||||||
{ok, open_socket, #state{queue = queue:new(),
|
{ok, open_socket, #state{queue = queue:new(),
|
||||||
encoding = Encoding,
|
encoding = Encoding,
|
||||||
|
port = Port,
|
||||||
|
password = Password,
|
||||||
user = From,
|
user = From,
|
||||||
nick = Username,
|
nick = Username,
|
||||||
host = Host,
|
host = Host,
|
||||||
|
@ -102,11 +104,17 @@ init([From, Host, Server, Username, Encoding]) ->
|
||||||
%%----------------------------------------------------------------------
|
%%----------------------------------------------------------------------
|
||||||
open_socket(init, StateData) ->
|
open_socket(init, StateData) ->
|
||||||
Addr = StateData#state.server,
|
Addr = StateData#state.server,
|
||||||
Port = 6667,
|
Port = StateData#state.port,
|
||||||
?DEBUG("connecting to ~s:~p~n", [Addr, Port]),
|
?DEBUG("connecting to ~s:~p~n", [Addr, Port]),
|
||||||
case gen_tcp:connect(Addr, Port, [binary, {packet, 0}]) of
|
case gen_tcp:connect(Addr, Port, [binary, {packet, 0}]) of
|
||||||
{ok, Socket} ->
|
{ok, Socket} ->
|
||||||
NewStateData = StateData#state{socket = Socket},
|
NewStateData = StateData#state{socket = Socket},
|
||||||
|
if
|
||||||
|
StateData#state.password /= "" ->
|
||||||
|
send_text(NewStateData,
|
||||||
|
io_lib:format("PASS ~s\r\n", [StateData#state.password]));
|
||||||
|
true -> true
|
||||||
|
end,
|
||||||
send_text(NewStateData,
|
send_text(NewStateData,
|
||||||
io_lib:format("NICK ~s\r\n", [StateData#state.nick])),
|
io_lib:format("NICK ~s\r\n", [StateData#state.nick])),
|
||||||
send_text(NewStateData,
|
send_text(NewStateData,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user