defmodule Dune.Allowlist.Default do @moduledoc """ The default `Dune.Allowlist` module to be used to allow or restrict functions and macros that can be safely executed. ## Examples iex> Dune.Allowlist.Default.fun_status(Kernel, :+, 2) :allowed iex> Dune.Allowlist.Default.fun_status(String, :to_atom, 1) :restricted iex> Dune.Allowlist.Default.fun_status(Atom, :to_string, 1) {:shimmed, Dune.Shims.Atom, :to_string} iex> Dune.Allowlist.Default.fun_status(Kernel, :foo, 1) :undefined_function iex> Dune.Allowlist.Default.fun_status(Bar, :foo, 1) :undefined_module iex> Dune.Allowlist.Default.fun_status(Kernel.SpecialForms, :quote, 2) :restricted ## Allowed modules / functions __DUNE_ALLOWLIST_FUNCTIONS__ """ use Dune.Allowlist alias Dune.Shims @special_forms_allowed ~w[ {} %{} <<>> = ^ case cond fn for with :: __aliases__ ]a @kernel_operators ~w[ |> + ++ - -- * / <> == === != !== =~ > >= < <= and or && || ! .. ..// ]a @kernel_guards ~w[ is_integer is_binary is_bitstring is_atom is_boolean is_integer is_float is_number is_list is_map is_map_key is_nil is_reference is_tuple is_exception is_struct is_function ]a @kernel_macros ~w[ if unless in match? then tap raise reraise throw ]a @kernel_sigils ~w[ sigil_C sigil_D sigil_N sigil_R sigil_S sigil_T sigil_U sigil_W sigil_c sigil_r sigil_s sigil_w ]a @kernel_functions ~w[ abs binary_part bit_size byte_size ceil div elem floor get_and_update_in get_in hd length make_ref map_size max min not pop_in put_elem put_in rem round self tl trunc tuple_size update_in ]a @kernel_allowed @kernel_operators ++ @kernel_guards ++ @kernel_macros ++ @kernel_sigils ++ @kernel_functions @kernel_shims [ apply: {Shims.Kernel, :safe_apply}, inspect: {Shims.Kernel, :safe_inspect}, to_string: {Shims.Kernel, :safe_to_string}, to_charlist: {Shims.Kernel, :safe_to_charlist}, sigil_w: {Shims.Kernel, :safe_sigil_w}, sigil_W: {Shims.Kernel, :safe_sigil_W} ] @erlang_allowed [ :*, :+, :++, :-, :--, :/, :"/=", :<, :"=/=", :"=:=", :"=<", :==, :>, :>=, :abs, :adler32, :adler32_combine, :and, :append_element, :band, :binary_part, :binary_to_float, :binary_to_integer, :binary_to_list, :bit_size, :bitstring_to_list, :bnot, :bor, :bsl, :bsr, :bxor, :byte_size, :ceil, :convert_time_unit, :crc32, :crc32_combine, :date, :delete_element, :div, :element, :float, :float_to_binary, :float_to_list, :floor, :hd, :insert_element, :integer_to_binary, :integer_to_list, :iolist_size, :iolist_to_binary, :iolist_to_iovec, :is_atom, :is_binary, :is_bitstring, :is_boolean, :is_float, :is_function, :is_integer, :is_list, :is_map, :is_map_key, :is_number, :is_pid, :is_port, :is_record, :is_reference, :is_tuple, :length, :list_to_binary, :list_to_bitstring, :list_to_float, :list_to_integer, :localtime, :localtime_to_universaltime, :make_ref, :make_tuple, :map_get, :map_size, :max, :md5, :md5_final, :md5_init, :md5_update, :min, :monotonic_time, :not, :or, :phash2, :ref_to_list, :rem, :round, :setelement, :size, :split_binary, :system_time, :time, :time_offset, :timestamp, :tl, :trunc, :tuple_size, :tuple_to_list, :unique_integer, :universaltime, :universaltime_to_localtime, :xor ] @erlang_shims [ apply: {Shims.Kernel, :safe_apply} ] @io_allowed ~w[ chardata_to_string iodata_length iodata_to_binary ]a @io_shims [ puts: {Shims.IO, :puts}, inspect: {Shims.IO, :inspect} ] allow Kernel.SpecialForms, only: @special_forms_allowed allow Kernel, only: @kernel_allowed, shims: @kernel_shims allow Access, :all allow String, except: ~w[to_atom to_existing_atom]a allow Regex, :all allow Map, :all allow MapSet, :all allow Keyword, :all allow Tuple, :all allow List, except: ~w[to_atom to_existing_atom]a allow Enum, shims: [join: {Shims.Enum, :join}, map_join: {Shims.Enum, :map_join}] # TODO double check allow Stream, :all allow Range, :all allow Integer, :all allow Float, :all allow Atom, except: ~w[to_char_list]a, shims: [to_string: {Shims.Atom, :to_string}, to_charlist: {Shims.Atom, :to_charlist}] allow Date, :all allow DateTime, :all allow NaiveDateTime, :all allow Calendar, except: ~w[put_time_zone_database]a allow Calendar.ISO, :all allow Time, :all allow Base, :all allow URI, :all allow Bitwise, :all allow Function, only: ~w[identity]a allow IO, only: @io_allowed, shims: @io_shims allow Process, only: [:sleep] allow :erlang, only: @erlang_allowed, shims: @erlang_shims allow :math, :all allow :binary, :all allow :lists, :all allow :array, :all allow :maps, :all allow :gb_sets, :all allow :gb_trees, :all allow :ordsets, :all allow :orddict, :all allow :proplists, :all allow :queue, :all allow :string, :all allow :unicode, :all allow :rand, :all allow :erts_debug, only: ~w[same size size_shared flat_size]a allow :zlib, only: ~w[zip unzip gzip gunzip compress uncompress]a end