Current section

Files

Jump to
samly lib samly subject.ex
Raw

lib/samly/subject.ex

defmodule Samly.Subject do
@moduledoc """
The subject in a SAML 2.0 Assertion.
This is part of the `Samly.Assertion` struct. The `name` field in this struct should not
be used in any UI directly. It might be a temporary randomly generated
ID from IdP. `Samly` internally uses this to deal with IdP initiated logout requests.
If an authentication request was sent from `Samly` (SP initiated), the SAML response
is expected to include the original request ID. This ID is made available in
`Samly.Subject.in_response_to`.
If the authentication request originated from the IDP (IDP initiated), there won't
be a `Samly` request ID associated with it. The `Samly.Subject.in_response_to`
will be an empty string in that case.
"""
require Samly.Esaml
alias Samly.Esaml
defstruct name: "",
name_qualifier: :undefined,
sp_name_qualifier: :undefined,
name_format: :undefined,
confirmation_method: :bearer,
notonorafter: "",
in_response_to: ""
@type t :: %__MODULE__{
name: String.t(),
name_qualifier: :undefined | String.t(),
sp_name_qualifier: :undefined | String.t(),
name_format: :undefined | String.t(),
confirmation_method: atom,
notonorafter: String.t(),
in_response_to: String.t()
}
@doc false
def from_rec(subject_rec) do
Esaml.esaml_subject(
name: name,
name_qualifier: name_qualifier,
sp_name_qualifier: sp_name_qualifier,
name_format: name_format,
confirmation_method: confirmation_method,
notonorafter: notonorafter,
in_response_to: in_response_to
) = subject_rec
%__MODULE__{
name: name |> List.to_string(),
name_qualifier: to_string_or_undefined(name_qualifier),
sp_name_qualifier: to_string_or_undefined(sp_name_qualifier),
name_format: to_string_or_undefined(name_format),
confirmation_method: confirmation_method,
notonorafter: notonorafter |> List.to_string(),
in_response_to: in_response_to |> List.to_string()
}
end
@doc false
def to_rec(subject) do
Esaml.esaml_subject(
name: String.to_charlist(subject.name),
name_qualifier: from_string_or_undefined(subject.name_qualifier),
sp_name_qualifier: from_string_or_undefined(subject.sp_name_qualifier),
name_format: from_string_or_undefined(subject.name_format),
confirmation_method: subject.confirmation_method,
notonorafter: String.to_charlist(subject.notonorafter),
in_response_to: String.to_charlist(subject.in_response_to)
)
end
defp to_string_or_undefined(:undefined), do: :undefined
defp to_string_or_undefined(s) when is_list(s), do: List.to_string(s)
defp from_string_or_undefined(:undefined), do: :undefined
defp from_string_or_undefined(s) when is_binary(s), do: String.to_charlist(s)
end