defmodule Image.Application do @moduledoc false # This env var, if set, will prevent `libvips` # from loading untrusted loaders. We set this to # true if it is not otherwise set. # See https://github.com/kipcole9/image/issues/9 @untrusted_env_var "VIPS_BLOCK_UNTRUSTED" use Application @doc false def start(_type, _args) do Image.SetSafeLoader.set(@untrusted_env_var) Supervisor.start_link( children(Code.ensure_loaded?(Bumblebee)), strategy: :one_for_one, name: Image.Supervisor ) end # When Bumblebee is available if Code.ensure_loaded?(Bumblebee) do @services [ {{Image.Classification, :classifier, []}, true}, {{Image.Generation, :generator, []}, false} ] defp children(true) do Enum.reduce(@services, [], fn {{module, function, args}, start?}, acc -> if autostart?(function, start?) do [apply(module, function, args) | acc] else acc end end) end end # When bumblebee is not available defp children(_) do [] end defp autostart?(service, start?) do :image |> Application.get_env(service, autostart: start?) |> Keyword.get(:autostart) end end defmodule Image.SetSafeLoader do @moduledoc false def set(env_var) do unless System.get_env(env_var) do System.put_env(env_var, "TRUE") end {:ok, env_var} end end