File 0864-ssl-Enhance-logging-support-and-restore-backwards-co.patch of Package erlang
From 961bde86e39392ae3e3efa3eb1239528c71adf23 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Sun, 28 Feb 2021 10:31:30 +0100
Subject: [PATCH] ssl: Enhance logging support and restore backwards
compatibility
log_level now supports none and all. Legacy log_alert option
was broken and backwards compatibility is restored.
---
lib/ssl/src/ssl.erl | 49 +++++++++++++++++++++-------------
lib/ssl/test/ssl_api_SUITE.erl | 21 ++++++++-------
2 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index 1b1b5d50f1..d4f4cc3c98 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -370,7 +370,7 @@
-type srp_identity() :: {Username :: string(), Password :: string()}.
-type psk_identity() :: string().
-type log_alert() :: boolean().
--type logging_level() :: logger:level().
+-type logging_level() :: logger:level() | none | all.
-type client_session_tickets() :: disabled | manual | auto.
-type server_session_tickets() :: disabled | stateful | stateless.
-type session_tickets() :: client_session_tickets() | server_session_tickets().
@@ -1954,13 +1954,11 @@ maybe_map_key_internal(client_preferred_next_protocols) ->
maybe_map_key_internal(K) ->
K.
-
maybe_map_key_external(next_protocol_selector) ->
client_preferred_next_protocols;
maybe_map_key_external(K) ->
K.
-
check_dependencies(K, OptionsMap, Env) ->
Rules = maps:get(rules, Env),
Deps = get_dependencies(K, Rules),
@@ -1993,10 +1991,10 @@ dependecies_already_defined(L, OptionsMap) ->
expand_options(Opts0, Rules) ->
Opts1 = proplists:expand([{binary, [{mode, binary}]},
{list, [{mode, list}]}], Opts0),
- assert_proplist(Opts1),
+ Opts2 = handle_option_format(Opts1, []),
%% Remove depricated ssl_imp option
- Opts = proplists:delete(ssl_imp, Opts1),
+ Opts = proplists:delete(ssl_imp, Opts2),
AllOpts = maps:keys(Rules),
SockOpts = lists:foldl(fun(Key, PropList) -> proplists:delete(Key, PropList) end,
Opts,
@@ -2025,7 +2023,6 @@ add_missing_options({L0, S, _C}, Rules) ->
L = lists:foldl(Fun, L0, AllOpts),
{L, S, length(L)}.
-
default_value(Key, Rules) ->
{Default, _} = maps:get(Key, Rules, {undefined, []}),
Default.
@@ -2257,7 +2254,9 @@ validate_option(log_alert, false) ->
warning;
validate_option(log_level, Value) when
is_atom(Value) andalso
- (Value =:= emergency orelse
+ (Value =:= none orelse
+ Value =:= all orelse
+ Value =:= emergency orelse
Value =:= alert orelse
Value =:= critical orelse
Value =:= error orelse
@@ -2708,20 +2707,34 @@ binary_filename(FileName) ->
Enc = file:native_name_encoding(),
unicode:characters_to_binary(FileName, unicode, Enc).
-assert_proplist([]) ->
- true;
-assert_proplist([{Key,_} | Rest]) when is_atom(Key) ->
- assert_proplist(Rest);
+%% Assert that basic options are on the format {Key, Value}
+%% with a few exceptions and phase out log_alert
+handle_option_format([], Acc) ->
+ Acc;
+handle_option_format([{log_alert, Bool} | Rest], Acc) when is_boolean(Bool) ->
+ case proplists:get_value(log_level, Acc ++ Rest, undefined) of
+ undefined ->
+ handle_option_format(Rest, [{log_level,
+ map_log_level(Bool)} | Acc]);
+ _ ->
+ handle_option_format(Rest, Acc)
+ end;
+handle_option_format([{Key,_} = Opt | Rest], Acc) when is_atom(Key) ->
+ handle_option_format(Rest, [Opt | Acc]);
%% Handle exceptions
-assert_proplist([{raw,_,_,_} | Rest]) ->
- assert_proplist(Rest);
-assert_proplist([inet | Rest]) ->
- assert_proplist(Rest);
-assert_proplist([inet6 | Rest]) ->
- assert_proplist(Rest);
-assert_proplist([Value | _]) ->
+handle_option_format([{raw,_,_,_} = Opt | Rest], Acc) ->
+ handle_option_format(Rest, [Opt | Acc]);
+handle_option_format([inet = Opt | Rest], Acc) ->
+ handle_option_format(Rest, [Opt | Acc]);
+handle_option_format([inet6 = Opt | Rest], Acc) ->
+ handle_option_format(Rest, [Opt | Acc]);
+handle_option_format([Value | _], _) ->
throw({option_not_a_key_value_tuple, Value}).
+map_log_level(true) ->
+ notice;
+map_log_level(false) ->
+ none.
handle_verify_option(verify_none, #{fail_if_no_peer_cert := _FailIfNoPeerCert} = OptionsMap) ->
OptionsMap#{verify => verify_none,
diff --git a/lib/ssl/test/ssl_api_SUITE.erl b/lib/ssl/test/ssl_api_SUITE.erl
index 6efd8424a9..07aaf41ef5 100644
--- a/lib/ssl/test/ssl_api_SUITE.erl
+++ b/lib/ssl/test/ssl_api_SUITE.erl
@@ -2078,7 +2078,8 @@ cb_info(Config) when is_list(Config) ->
%%-------------------------------------------------------------------
log_alert() ->
- [{doc,"Test that we can set log_alert."}].
+ [{doc,"Test that we can set log_alert and that it translates to correct log_level"
+ " that has replaced this option"}].
log_alert(Config) when is_list(Config) ->
ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config),
@@ -2088,15 +2089,17 @@ log_alert(Config) when is_list(Config) ->
Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
{from, self()},
{mfa, {ssl_test_lib, send_recv_result_active, []}},
- {options, [{log_alert, false} | ServerOpts]}]),
+ {options, [{log_alert, true} | ServerOpts]}]),
Port = ssl_test_lib:inet_port(Server),
-
- Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
- {host, Hostname},
- {from, self()},
- {mfa, {ssl_test_lib, send_recv_result_active, []}},
- {options, [{log_alert, false} | ClientOpts]}]),
-
+ {Client, CSock} = ssl_test_lib:start_client([return_socket,
+ {node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, [{log_alert, false} | ClientOpts]}]),
+
+ {ok, [{log_level, none}]} = ssl:connection_information(CSock, [log_level]),
+
ssl_test_lib:check_result(Server, ok, Client, ok).
--
2.26.2