Skip to content

Commit 07cdcc2

Browse files
authored
Avoid overwriting ssl opts with url if already set in config (#4498)
1 parent 7e60edc commit 07cdcc2

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

lib/ecto/repo/supervisor.ex

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule Ecto.Repo.Supervisor do
22
@moduledoc false
33
use Supervisor
4+
require Logger
45

56
@defaults [timeout: 15000, pool_size: 10]
67
@integer_url_query_params ["timeout", "pool_size", "idle_interval"]
@@ -25,7 +26,20 @@ defmodule Ecto.Repo.Supervisor do
2526
case repo_init(type, repo, config) do
2627
{:ok, config} ->
2728
{url, config} = Keyword.pop(config, :url)
28-
{:ok, Keyword.merge(config, parse_url(url || ""))}
29+
url_config = parse_url(url || "")
30+
31+
url_config =
32+
if is_list(config[:ssl]) and url_config[:ssl] == true do
33+
Logger.warning(
34+
"ignoring `ssl=true` parameter in URL because `ssl` is already set in the configuration: #{inspect(config[:ssl])}"
35+
)
36+
37+
Keyword.delete(url_config, :ssl)
38+
else
39+
url_config
40+
end
41+
42+
{:ok, Keyword.merge(config, url_config)}
2943

3044
:ignore ->
3145
:ignore

test/ecto/repo/supervisor_test.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,20 @@ defmodule Ecto.Repo.SupervisorTest do
8383
assert normalize(config) == [database: "mydb", extra: "extra", otp_app: :ecto, scheme: "ecto"]
8484
end
8585

86+
@tag :capture_log
87+
test "URL options do not overwrite SSL cacertfile from config" do
88+
put_env(database: "hello", url: "ecto:///mydb?ssl=true", ssl: [cacertfile: "/path/to/file"])
89+
{:ok, config} = init_config(:runtime, __MODULE__, :ecto, extra: "extra")
90+
91+
assert normalize(config) == [
92+
database: "mydb",
93+
extra: "extra",
94+
otp_app: :ecto,
95+
scheme: "ecto",
96+
ssl: [cacertfile: "/path/to/file"]
97+
]
98+
end
99+
86100
test "is no-op for nil or empty URL" do
87101
put_env(database: "hello", url: nil)
88102
{:ok, config} = init_config(:runtime, __MODULE__, :ecto, [])

0 commit comments

Comments
 (0)