Skip to content

Commit 0b5e5b7

Browse files
Merge pull request #14028 from rabbitmq/mergify/bp/v4.1.x/pr-14023
Wrap TLS options password in a function in more places (backport #14023)
2 parents 4baa62b + 97936e5 commit 0b5e5b7

File tree

7 files changed

+60
-30
lines changed

7 files changed

+60
-30
lines changed

deps/rabbit/src/rabbit_ssl.erl

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,7 @@
3939

4040
-spec wrap_password_opt(tls_opts()) -> tls_opts().
4141
wrap_password_opt(Opts0) ->
42-
case proplists:get_value(password, Opts0) of
43-
undefined ->
44-
Opts0;
45-
Fun when is_function(Fun) ->
46-
Opts0;
47-
Password ->
48-
%% A password can be a value or a function returning that value.
49-
%% See the key_pem_password/0 type in https://github.com/erlang/otp/pull/5843/files.
50-
NewOpts = proplists:delete(password, Opts0),
51-
Fun = fun() -> Password end,
52-
[{password, Fun} | NewOpts]
53-
end.
42+
rabbit_ssl_options:wrap_password_opt(Opts0).
5443

5544
-spec cipher_suites(cipher_suites_mode()) -> ssl:ciphers().
5645
cipher_suites(Mode) ->

deps/rabbit/test/unit_rabbit_ssl_SUITE.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ wrap_tls_opts_with_binary_password(_Config) ->
3333
{password, Bin}
3434
],
3535

36-
Opts = rabbit_ssl:wrap_password_opt(Opts0),
36+
Opts = rabbit_ssl_options:wrap_password_opt(Opts0),
3737
M = maps:from_list(Opts),
3838

3939
?assertEqual(Path, maps:get(keyfile, M)),
@@ -53,7 +53,7 @@ wrap_tls_opts_with_function_password(_Config) ->
5353
{password, Fun}
5454
],
5555

56-
Opts = rabbit_ssl:wrap_password_opt(Opts0),
56+
Opts = rabbit_ssl_options:wrap_password_opt(Opts0),
5757
M = maps:from_list(Opts),
5858

5959
?assertEqual(Path, maps:get(keyfile, M)),

deps/rabbit_common/src/rabbit_ssl_options.erl

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,34 @@
77

88
-module(rabbit_ssl_options).
99

10-
-export([fix/1]).
11-
-export([fix_client/1]).
12-
10+
-export([
11+
fix/1,
12+
fix_client/1,
13+
wrap_password_opt/1
14+
]).
1315

1416
-define(BAD_SSL_PROTOCOL_VERSIONS, [
1517
%% POODLE
1618
sslv3
1719
]).
1820

21+
-type tls_opts() :: [ssl:tls_server_option()] | [ssl:tls_client_option()].
22+
23+
-spec wrap_password_opt(tls_opts()) -> tls_opts().
24+
wrap_password_opt(Opts0) ->
25+
case proplists:get_value(password, Opts0) of
26+
undefined ->
27+
Opts0;
28+
Fun when is_function(Fun) ->
29+
Opts0;
30+
Password ->
31+
%% A password can be a value or a function returning that value.
32+
%% See the key_pem_password/0 type in https://github.com/erlang/otp/pull/5843/files.
33+
NewOpts = proplists:delete(password, Opts0),
34+
Fun = fun() -> Password end,
35+
[{password, Fun} | NewOpts]
36+
end.
37+
1938
-spec fix(rabbit_types:infos()) -> rabbit_types:infos().
2039

2140
fix(Config) ->

deps/rabbitmq_management/src/rabbit_mgmt_app.erl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,17 @@ get_legacy_listener() ->
128128
get_tls_listener() ->
129129
{ok, Listener0} = application:get_env(rabbitmq_management, ssl_config),
130130
{ok, Listener1} = ensure_port(tls, Listener0),
131+
Listener2 = rabbit_ssl:wrap_password_opt(Listener1),
131132
Port = proplists:get_value(port, Listener1),
132133
case proplists:get_value(cowboy_opts, Listener0) of
133134
undefined ->
134135
[
135136
{port, Port},
136137
{ssl, true},
137-
{ssl_opts, Listener0}
138+
{ssl_opts, Listener2}
138139
];
139140
CowboyOpts ->
140-
WithoutCowboyOpts = lists:keydelete(cowboy_opts, 1, Listener0),
141+
WithoutCowboyOpts = lists:keydelete(cowboy_opts, 1, Listener2),
141142
[
142143
{port, Port},
143144
{ssl, true},

deps/rabbitmq_management/test/listener_config_SUITE.erl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ tcp_config_only(_Config) ->
7373
]},
7474
{port, 999}
7575
],
76-
?assertEqual(lists:usort(Expected), get_single_listener_config()).
76+
?assertEqual(sort_nested(Expected), sort_nested(get_single_listener_config())).
7777

7878
ssl_config_only(_Config) ->
7979
application:set_env(rabbitmq_management, ssl_config, [
@@ -92,7 +92,7 @@ ssl_config_only(_Config) ->
9292
{idle_timeout, 10000}
9393
]}
9494
],
95-
?assertEqual(lists:usort(Expected), get_single_listener_config()).
95+
?assertEqual(sort_nested(Expected), sort_nested(get_single_listener_config())).
9696

9797
multiple_listeners(_Config) ->
9898
application:set_env(rabbitmq_management, tcp_config, [
@@ -126,9 +126,18 @@ multiple_listeners(_Config) ->
126126
]}
127127
]
128128
],
129-
?assertEqual(lists:usort(Expected), rabbit_mgmt_app:get_listeners_config()).
129+
?assertEqual(sort_nested(Expected), sort_nested(rabbit_mgmt_app:get_listeners_config())).
130130

131131

132132
get_single_listener_config() ->
133133
[Config] = rabbit_mgmt_app:get_listeners_config(),
134134
lists:usort(Config).
135+
136+
sort_nested(Proplist) when is_list(Proplist) ->
137+
lists:usort(lists:map(fun({K, V}) when is_list(V) ->
138+
{K, lists:usort(V)};
139+
(Any) ->
140+
sort_nested(Any)
141+
end, Proplist));
142+
sort_nested(Value) ->
143+
Value.

deps/rabbitmq_prometheus/src/rabbit_prometheus_app.erl

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,16 @@ init(_) ->
3434
-spec start_configured_listener() -> ok.
3535
start_configured_listener() ->
3636
TCPListenerConf = get_env(tcp_config, []),
37-
TLSListenerConf = get_env(ssl_config, []),
37+
TLSListenerConf0 = get_env(ssl_config, []),
38+
TLSListenerConf =
39+
case proplists:get_value(ssl_opts, TLSListenerConf0, undefined) of
40+
undefined ->
41+
TLSListenerConf0;
42+
Opts0 ->
43+
Opts = rabbit_ssl:wrap_password_opt(Opts0),
44+
Tmp = proplists:delete(ssl_opts, TLSListenerConf0),
45+
[{ssl_opts, Opts} | Tmp]
46+
end,
3847

3948
case {TCPListenerConf, TLSListenerConf} of
4049
%% nothing is configured
@@ -64,10 +73,11 @@ start_configured_tcp_listener(Conf) ->
6473
start_configured_tls_listener(Conf) ->
6574
case Conf of
6675
[] -> ok;
67-
SSLCon ->
68-
SSLListener0 = [{ssl, true} | SSLCon],
69-
SSLListener1 = maybe_disable_sendfile(SSLListener0),
70-
start_listener(SSLListener1)
76+
TLSConf ->
77+
TLSListener0 = [{ssl, true} | TLSConf],
78+
TLSListener1 = maybe_disable_sendfile(TLSListener0),
79+
TLSListener2 = rabbit_ssl:wrap_password_opt(TLSListener1),
80+
start_listener(TLSListener2)
7181
end.
7282

7383
maybe_disable_sendfile(Listener) ->

deps/rabbitmq_web_dispatch/src/rabbit_web_dispatch_sup.erl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ ensure_listener(Listener) ->
2727
undefined ->
2828
{error, {no_port_given, Listener}};
2929
_ ->
30-
{Transport, TransportOpts, ProtoOpts} = preprocess_config(Listener),
30+
{Transport, TransportOpts0, ProtoOpts} = preprocess_config(Listener),
31+
TransportOpts = rabbit_ssl_options:wrap_password_opt(TransportOpts0),
3132
ProtoOptsMap = maps:from_list(ProtoOpts),
3233
StreamHandlers = stream_handlers_config(ProtoOpts),
3334
rabbit_log:debug("Starting HTTP[S] listener with transport ~ts", [Transport]),
@@ -86,9 +87,10 @@ auto_ssl(Options) ->
8687
fix_ssl([{ssl_opts, SSLOpts} | Options]).
8788

8889
fix_ssl(Options) ->
89-
SSLOpts = proplists:get_value(ssl_opts, Options),
90+
TLSOpts0 = proplists:get_value(ssl_opts, Options),
91+
TLSOpts = rabbit_ssl_options:wrap_password_opt(TLSOpts0),
9092
{ranch_ssl,
91-
transport_config(Options ++ rabbit_networking:fix_ssl_options(SSLOpts)),
93+
transport_config(Options ++ rabbit_networking:fix_ssl_options(TLSOpts)),
9294
protocol_config(Options)}.
9395

9496
transport_config(Options0) ->

0 commit comments

Comments
 (0)