Skip to content

Commit 3d883c8

Browse files
committed
Allow receiving raw XML metadadata with IDP config
1 parent e109fb1 commit 3d883c8

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

lib/samly/idp_data.ex

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ defmodule Samly.IdpData do
1313
defstruct id: "",
1414
sp_id: "",
1515
base_url: nil,
16+
metadata: nil,
1617
metadata_file: nil,
1718
pre_session_create_pipeline: nil,
1819
use_redirect_for_req: false,
@@ -39,6 +40,7 @@ defmodule Samly.IdpData do
3940
id: binary(),
4041
sp_id: binary(),
4142
base_url: nil | binary(),
43+
metadata: nil | binary(),
4244
metadata_file: nil | binary(),
4345
pre_session_create_pipeline: nil | module(),
4446
use_redirect_for_req: boolean(),
@@ -108,7 +110,13 @@ defmodule Samly.IdpData do
108110
@spec save_idp_config(%IdpData{}, map()) :: %IdpData{}
109111
defp save_idp_config(idp_data, %{id: id, sp_id: sp_id} = opts_map)
110112
when is_binary(id) and is_binary(sp_id) do
111-
%IdpData{idp_data | id: id, sp_id: sp_id, base_url: Map.get(opts_map, :base_url)}
113+
%IdpData{
114+
idp_data
115+
| id: id,
116+
sp_id: sp_id,
117+
base_url: Map.get(opts_map, :base_url),
118+
metadata: Map.get(opts_map, :metadata)
119+
}
112120
|> set_metadata_file(opts_map)
113121
|> set_pipeline(opts_map)
114122
|> set_allowed_target_urls(opts_map)
@@ -121,20 +129,10 @@ defmodule Samly.IdpData do
121129
end
122130

123131
@spec load_metadata(%IdpData{}, map()) :: %IdpData{}
124-
defp load_metadata(idp_data, _opts_map) do
125-
with {:reading, {:ok, raw_xml}} <- {:reading, File.read(idp_data.metadata_file)},
126-
{:parsing, {:ok, idp_data}} <- {:parsing, from_xml(raw_xml, idp_data)} do
132+
defp load_metadata(%IdpData{metadata: raw_xml} = idp_data, _opts_map) when is_binary(raw_xml) do
133+
with {:parsing, {:ok, idp_data}} <- {:parsing, from_xml(raw_xml, idp_data)} do
127134
idp_data
128135
else
129-
{:reading, {:error, reason}} ->
130-
Logger.error(
131-
"[Samly] Failed to read metadata_file [#{inspect(idp_data.metadata_file)}]: #{
132-
inspect(reason)
133-
}"
134-
)
135-
136-
idp_data
137-
138136
{:parsing, {:error, reason}} ->
139137
Logger.error(
140138
"[Samly] Invalid metadata_file content [#{inspect(idp_data.metadata_file)}]: #{
@@ -146,6 +144,17 @@ defmodule Samly.IdpData do
146144
end
147145
end
148146

147+
@spec load_metadata(%IdpData{}, map()) :: %IdpData{}
148+
defp load_metadata(idp_data, opts_map) do
149+
with {:reading, {:ok, raw_xml}} <- {:reading, File.read(idp_data.metadata_file)} do
150+
%IdpData{idp_data | metadata: raw_xml} |> load_metadata(opts_map)
151+
else
152+
{:reading, {:error, reason}} ->
153+
Logger.error("[Samly] Failed to read metadata_file: #{inspect(reason)}")
154+
idp_data
155+
end
156+
end
157+
149158
@spec update_esaml_recs(%IdpData{}, %{required(id()) => %SpData{}}, map()) :: %IdpData{}
150159
defp update_esaml_recs(idp_data, service_providers, opts_map) do
151160
case Map.get(service_providers, idp_data.sp_id) do
@@ -182,6 +191,12 @@ defmodule Samly.IdpData do
182191

183192
@default_metadata_file "idp_metadata.xml"
184193

194+
@spec set_metadata_file(%IdpData{}, map()) :: %IdpData{}
195+
defp set_metadata_file(%IdpData{metadata: metadata} = idp_data, _opts_map)
196+
when is_binary(metadata) do
197+
%IdpData{idp_data | metadata_file: nil}
198+
end
199+
185200
@spec set_metadata_file(%IdpData{}, map()) :: %IdpData{}
186201
defp set_metadata_file(%IdpData{} = idp_data, %{} = opts_map) do
187202
%IdpData{idp_data | metadata_file: Map.get(opts_map, :metadata_file, @default_metadata_file)}

0 commit comments

Comments
 (0)