Packages

A helper application for fetching and parsing CloudFoundry service bindings, and application information.

Current section

Files

Jump to
cf_env lib middleware base64.ex
Raw

lib/middleware/base64.ex

defmodule CFEnv.Middleware.Base64 do
@moduledoc """
Base64 Decodes a service credential, when given a list of services. Assumes
all values on the service are encoded.
```
defmodule MyApp.Env do
use CFEnv, otp_app: my_app
plug CFEnv.Middleware.Base64, services: ["db", "AWS"]
end
```
"""
@behaviour CFEnv.Middleware
def init(_services, opts) do
service_keys = Keyword.get(opts, :services, [])
{:ok, %{services: service_keys}}
end
def call({name, %{"credentials" => credentials} = service}, state) do
credentials =
if name in state.services do
crawl(credentials, &Base.decode64/1)
else
credentials
end
{name, Map.put(service, "credentials", credentials)}
end
defp crawl(map, callback) when is_map(map) do
Enum.map(map, fn {key, value} -> {key, crawl(value, callback)} end) |> Map.new()
end
defp crawl(value, callback) when is_binary(value) do
case callback.(value) do
{:ok, new_value} ->
new_value
otherwise ->
value
end
end
defp crawl(otherwise, _callback), do: otherwise
end