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

openSUSE Build Service is sponsored by