Skip to content

Commit

Permalink
Merge pull request #17 from internetee/fix-undefined-command-error
Browse files Browse the repository at this point in the history
Introduce error 2000
  • Loading branch information
Maciej Szlosarczyk authored Jul 29, 2019
2 parents 98483da + 203e119 commit 65d5e6c
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 24 deletions.
11 changes: 11 additions & 0 deletions apps/epp_proxy/include/epp_proxy.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,14 @@
}).

-type epp_request() :: #epp_request{}.


-define(XMLErrorCode, <<"2001">>).

-define(XMLErrorMessage, <<"Command syntax error.">>).

-define(UnknownCommandErrorCode, <<"2000">>).

-define(UnknownCommandErrorMessage, <<"Unknown command.">>).

-define(DefaultTimeout, 120000).
13 changes: 11 additions & 2 deletions apps/epp_proxy/src/epp_router.erl
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
-module(epp_router).

-export([request_method/1, route_request/1]).
-export([is_valid_command/1, request_method/1,
route_request/1]).

-define(validCommands,
["hello", "login", "logout", "check", "info", "poll",
Expand All @@ -9,14 +10,22 @@
%% 47 is the character code
-define(forwardSlash, 47).

%% request method: GET for greeting, POST for everything else.
%% request method: GET for greeting and error, POST for everything else.
request_method("hello") -> get;
request_method(<<"hello">>) -> get;
request_method("error") -> get;
request_method(<<"error">>) -> get;
request_method(_) -> post.

is_valid_command(Command) when is_binary(Command) ->
CommandAsList = binary_to_list(Command),
lists:member(CommandAsList, ?validCommands);
is_valid_command(Command) when is_list(Command) ->
lists:member(Command, ?validCommands);
is_valid_command(_) -> false.

%% Base router
route_request(undefined) -> url_map("error");
route_request(Command) when is_binary(Command) ->
List = binary_to_list(Command), url_map(List);
route_request(Command) when is_list(Command) ->
Expand Down
17 changes: 9 additions & 8 deletions apps/epp_proxy/src/epp_tcp_worker.erl
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,6 @@

-record(state, {socket, session_id, headers}).

-define(XMLErrorCode, <<"2001">>).

-define(XMLErrorMessage, <<"Command syntax error.">>).

-define(DefaultTimeout, 120000).

%% Initialize process
%% Assign an unique session id that will be passed on to http server as a cookie
init(Socket) ->
Expand Down Expand Up @@ -177,8 +171,15 @@ parse_frame(Frame) ->
case epp_xml:parse(Frame) of
{ok, XMLRecord} ->
Command = epp_xml:get_command(XMLRecord),
#valid_frame{command = Command, cl_trid = ClTRID,
raw_frame = Frame};
case epp_router:is_valid_command(Command) of
true ->
#valid_frame{command = Command, cl_trid = ClTRID,
raw_frame = Frame};
false ->
#invalid_frame{code = ?UnknownCommandErrorCode,
message = ?UnknownCommandErrorMessage,
cl_trid = ClTRID}
end;
{error, _} ->
#invalid_frame{code = ?XMLErrorCode,
message = ?XMLErrorMessage, cl_trid = ClTRID}
Expand Down
17 changes: 9 additions & 8 deletions apps/epp_proxy/src/epp_tls_worker.erl
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,6 @@

-record(state, {socket, session_id, headers}).

-define(XMLErrorCode, <<"2001">>).

-define(XMLErrorMessage, <<"Command syntax error.">>).

-define(DefaultTimeout, 120000).

%% Initialize process
%% Assign an unique session id that will be passed on to http server as a cookie
init(Socket) ->
Expand Down Expand Up @@ -197,8 +191,15 @@ parse_frame(Frame) ->
case epp_xml:parse(Frame) of
{ok, XMLRecord} ->
Command = epp_xml:get_command(XMLRecord),
#valid_frame{command = Command, cl_trid = ClTRID,
raw_frame = Frame};
case epp_router:is_valid_command(Command) of
true ->
#valid_frame{command = Command, cl_trid = ClTRID,
raw_frame = Frame};
false ->
#invalid_frame{code = ?UnknownCommandErrorCode,
message = ?UnknownCommandErrorMessage,
cl_trid = ClTRID}
end;
{error, _} ->
#invalid_frame{code = ?XMLErrorCode,
message = ?XMLErrorMessage, cl_trid = ClTRID}
Expand Down
26 changes: 23 additions & 3 deletions apps/epp_proxy/test/tcp_client_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
valid_command_test_case/1,
long_message_test_case/1,
invalid_command_test_case/1,
missing_command_test_case/1,
error_test_case/1]).

all() ->
Expand All @@ -20,6 +21,7 @@ all() ->
valid_command_test_case,
long_message_test_case,
invalid_command_test_case,
missing_command_test_case,
error_test_case].

init_per_suite(Config) ->
Expand Down Expand Up @@ -133,8 +135,7 @@ long_message_test_case(Config) ->
"Command completed successfully; no messages"),
ok.

%% Sending an invalid command frame should close the connection.
%% It also crashes the process.
%% Sending an invalid command frame should return a canned response.
invalid_command_test_case(Config) ->
Options = proplists:get_value(tcp_options, Config),
{ok, Socket} = gen_tcp:connect("localhost", 1180, Options, 2000),
Expand All @@ -150,7 +151,26 @@ invalid_command_test_case(Config) ->
"</command>\n"
"</epp>\n">>,
ok = send_data(InvalidCommand, Socket),
{error, closed} = receive_data(Socket),
ErrorResponse = receive_data(Socket),
match_data(ErrorResponse,
"Unknown command."),
ok.

%% Sending a valid XML without command frame should return a canned response.
missing_command_test_case(Config) ->
Options = proplists:get_value(tcp_options, Config),
{ok, Socket} = gen_tcp:connect("localhost", 1180, Options, 2000),
_Data = receive_data(Socket),
ok = send_data(login_command(), Socket),
_LoginResponse = receive_data(Socket),
InvalidCommand =
<<"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
"<epp xmlns=\"https://epp.tld.ee/schema/epp-ee-1.0.xsd\">\n"
"</epp>\n">>,
ok = send_data(InvalidCommand, Socket),
ErrorResponse = receive_data(Socket),
match_data(ErrorResponse,
"Unknown command."),
ok.

error_test_case(Config) ->
Expand Down
26 changes: 23 additions & 3 deletions apps/epp_proxy/test/tls_client_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
valid_command_test_case/1,
long_message_test_case/1,
invalid_command_test_case/1,
missing_command_test_case/1,
error_test_case/1,
revoked_cert_test_case/1]).

Expand All @@ -21,6 +22,7 @@ all() ->
valid_command_test_case,
long_message_test_case,
invalid_command_test_case,
missing_command_test_case,
error_test_case,
revoked_cert_test_case].

Expand Down Expand Up @@ -142,8 +144,7 @@ long_message_test_case(Config) ->
"Command completed successfully; no messages"),
ok.

%% Sending an invalid command frame should close the connection.
%% It also crashes the process.
%% Sending an invalid command frame returns a canned response.
invalid_command_test_case(Config) ->
Options = proplists:get_value(ssl_options, Config),
{ok, Socket} = ssl:connect("localhost", 1443, Options, 2000),
Expand All @@ -159,7 +160,26 @@ invalid_command_test_case(Config) ->
"</command>\n"
"</epp>\n">>,
ok = send_data(InvalidCommand, Socket),
{error, closed} = receive_data(Socket),
ErrorResponse = receive_data(Socket),
match_data(ErrorResponse,
"Unknown command."),
ok.

%% Sending a missing command frame should return a canned response.
missing_command_test_case(Config) ->
Options = proplists:get_value(ssl_options, Config),
{ok, Socket} = ssl:connect("localhost", 1443, Options, 2000),
_Data = receive_data(Socket),
ok = send_data(login_command(), Socket),
_LoginResponse = receive_data(Socket),
InvalidCommand =
<<"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
"<epp xmlns=\"https://epp.tld.ee/schema/epp-ee-1.0.xsd\">\n"
"</epp>\n">>,
ok = send_data(InvalidCommand, Socket),
ErrorResponse = receive_data(Socket),
match_data(ErrorResponse,
"Unknown command."),
ok.

error_test_case(Config) ->
Expand Down

0 comments on commit 65d5e6c

Please sign in to comment.