diff --git a/lib/samly/idp_data.ex b/lib/samly/idp_data.ex index cc21cb7..a5cd753 100644 --- a/lib/samly/idp_data.ex +++ b/lib/samly/idp_data.ex @@ -112,7 +112,7 @@ defmodule Samly.IdpData do @spec save_idp_config(%IdpData{}, map()) :: %IdpData{} defp save_idp_config(idp_data, %{id: id, sp_id: sp_id} = opts_map) when is_binary(id) and is_binary(sp_id) do - %IdpData{idp_data | id: id, sp_id: sp_id, base_url: Map.get(opts_map, :base_url)} + %{idp_data | id: id, sp_id: sp_id, base_url: Map.get(opts_map, :base_url)} |> set_metadata(opts_map) |> set_pipeline(opts_map) |> set_allowed_target_urls(opts_map) @@ -156,9 +156,9 @@ defmodule Samly.IdpData do defp update_esaml_recs(idp_data, service_providers, opts_map) do case Map.get(service_providers, idp_data.sp_id) do %SpData{} = sp -> - idp_data = %IdpData{idp_data | esaml_idp_rec: to_esaml_idp_metadata(idp_data, opts_map)} - idp_data = %IdpData{idp_data | esaml_sp_rec: get_esaml_sp(sp, idp_data)} - %IdpData{idp_data | valid?: cert_config_ok?(idp_data, sp)} + idp_data = %{idp_data | esaml_idp_rec: to_esaml_idp_metadata(idp_data, opts_map)} + idp_data = %{idp_data | esaml_sp_rec: get_esaml_sp(sp, idp_data)} + %{idp_data | valid?: cert_config_ok?(idp_data, sp)} _ -> Logger.error("[Samly] Unknown/invalid sp_id: #{idp_data.sp_id}") @@ -271,7 +271,7 @@ defmodule Samly.IdpData do md_xml = SweetXml.parse(metadata_xml, xml_opts) signing_certs = get_signing_certs(md_xml) - %IdpData{ + %{ idp_data | entity_id: get_entity_id(md_xml), signed_requests: get_req_signed(md_xml), diff --git a/lib/samly/sp_handler.ex b/lib/samly/sp_handler.ex index 9fd11fb..3b7d549 100644 --- a/lib/samly/sp_handler.ex +++ b/lib/samly/sp_handler.ex @@ -36,12 +36,12 @@ defmodule Samly.SPHandler do with {:ok, assertion} <- Helper.decode_idp_auth_resp(sp, saml_encoding, saml_response), :ok <- validate_authresp(conn, assertion, relay_state), - assertion = %Assertion{assertion | idp_id: idp_id}, + assertion = %{assertion | idp_id: idp_id}, conn = conn |> put_private(:samly_assertion, assertion), {:halted, %Conn{halted: false} = conn} <- {:halted, pipethrough(conn, pipeline)} do updated_assertion = conn.private[:samly_assertion] computed = updated_assertion.computed - assertion = %Assertion{assertion | computed: computed, idp_id: idp_id} + assertion = %{assertion | computed: computed, idp_id: idp_id} nameid = assertion.subject.name assertion_key = {idp_id, nameid} @@ -53,17 +53,25 @@ defmodule Samly.SPHandler do |> put_session("samly_assertion_key", assertion_key) |> redirect(302, target_url) else - {:halted, conn} -> conn + {:halted, conn} -> + conn + {:error, reason} -> case idp do %IdpData{debug_mode: true} -> conn |> put_resp_header("content-type", "text/html") - |> send_resp(403, "

access_denied

Error:

#{inspect(reason)}

Raw Response:

#{saml_response}

send_resp( + 403, + "

access_denied

Error:

#{inspect(reason)}

Raw Response:

#{saml_response}

conn |> send_resp(403, "access_denied #{inspect(reason)}") end - _ -> conn |> send_resp(403, "access_denied") + + _ -> + conn |> send_resp(403, "access_denied") end # rescue