Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

SmeeFeds Workbook

notebooks/smee_feds.livemd

SmeeFeds Workbook

Mix.install([{:smee_feds, ">= 0.3.1"}, {:rambo, "~> 0.3.4"}])
alias Smee.{Metadata, Entity, Source, MDQ}
alias SmeeFeds.{Federation, Import, Export}

Requirements - Please Read!

Backend tools Please note: Smee does not do all processing itself using Elixir - it sometimes cheats (OK, it often cheats) by sending data to external programs for processing. At the moment it requires the following commandline utilities:

  • xmlsec1
  • xmllint
  • xsltproc

On Debian: sudo apt-get install xmlsec1 libxml2-utils xsltproc On RedHat: sudo yum install xmlsec1 libxml2 libxslt On Macs: brew install xmlsec1 libxml2 libxslt

Finding an MDQ service

Very few MDQ services are present in the data, but they can be used as follows:

cern_idp =
  SmeeFeds.federation(:incommon)
  |> SmeeFeds.Federation.mdq()
  |> Smee.MDQ.lookup!("https://cern.ch/login")

You can list the IDs of all federations that have an MDQ service using a filter:

SmeeFeds.federations()
|> SmeeFeds.Filter.mdq()
|> SmeeFeds.ids()

Getting a list of specific federations and writing their details to disk as a JSON file or CSV

The JSON file can be used a new default set of federations.

SmeeFeds.federations([:wayf, :haka, :dfnaai, :swamid])
|> SmeeFeds.Export.json_file!("my_feds.json")

The CSV export is a simpler, lossy summary.

csv =
  SmeeFeds.federations([:wayf, :haka, :dfnaai, :swamid])
  |> SmeeFeds.Export.csv()

File.write!("my_feds.csv", csv)

Defining your own lists of federations

my_feds = [
  SmeeFeds.Federation.new(:fed1,
    name: "Example 1",
    sources: [Smee.Source.new("https://example.com/metadata")]
  ),
  SmeeFeds.Federation.new(:fed2,
    name: "Example 2",
    sources: [Smee.Source.new("https://example.edu/metadata")]
  )
]

Filtering lists of federations

Listing all known federations, then selecting those in the EU, and listing their unique IDs

SmeeFeds.federations()
|> SmeeFeds.Filter.eu()
|> SmeeFeds.ids()

Finding all hub-and-spoke networks with an MDQ service and returning their names

SmeeFeds.federations()
|> SmeeFeds.Filter.structure(:has)
|> SmeeFeds.Filter.mdq()
|> Enum.map(fn f -> f.name end)
IO.puts("Hello")

Using with Smee to download UK Access Management Federation metadata, pick a random entity and get its XML

Useful for testing as there’s no need to remember or look up metadata details. This involves a large download, so may take awhile on slower connections.

random_xml =
  SmeeFeds.federation(:ukamf)
  |> SmeeFeds.Federation.aggregate()
  |> Smee.fetch!()
  |> Smee.Metadata.random_entity()
  |> Smee.Entity.xml()