diff --git a/lib/livebook/runtime/evaluator.ex b/lib/livebook/runtime/evaluator.ex index e71d6626a..aa8533c9f 100644 --- a/lib/livebook/runtime/evaluator.ex +++ b/lib/livebook/runtime/evaluator.ex @@ -965,38 +965,15 @@ defmodule Livebook.Runtime.Evaluator do defp prune_stacktrace(_module, [{Livebook.Runtime.Evaluator.Tracer, _fun, _arity, _meta} | _]), do: [] - # Adapted from https://github.com/elixir-lang/elixir/blob/1c1654c88adfdbef38ff07fc30f6fbd34a542c07/lib/iex/lib/iex/evaluator.ex#L355-L372 - # TODO: Remove else branch once we depend on the versions below - if System.otp_release() >= "25" do - defp prune_stacktrace(module, stack) do - stack - |> Enum.reverse() - |> Enum.drop_while(&(elem(&1, 0) != module)) - |> Enum.reverse() - |> case do - [] -> stack - stack -> stack - end - end - else - @elixir_internals [:elixir, :elixir_expand, :elixir_compiler, :elixir_module] ++ - [:elixir_clauses, :elixir_lexical, :elixir_def, :elixir_map] ++ - [:elixir_erl, :elixir_erl_clauses, :elixir_erl_pass] - - defp prune_stacktrace(_, stacktrace) do - # The order in which each drop_while is listed is important. - # For example, the user may call Code.eval_string/2 in their - # code and if there is an error we should not remove erl_eval - # and eval_bits information from the user stacktrace. - stacktrace - |> Enum.reverse() - |> Enum.drop_while(&(elem(&1, 0) == :proc_lib)) - |> Enum.drop_while(&(elem(&1, 0) == :gen_server)) - |> Enum.drop_while(&(elem(&1, 0) == __MODULE__)) - |> Enum.drop_while(&(elem(&1, 0) == :elixir)) - |> Enum.drop_while(&(elem(&1, 0) in [:erl_eval, :eval_bits])) - |> Enum.reverse() - |> Enum.reject(&(elem(&1, 0) in @elixir_internals)) + # See https://github.com/elixir-lang/elixir/blob/792d4cc6310c56eb9772056a6b5fb3339ce17b0f/lib/iex/lib/iex/evaluator.ex#L436-L445 + defp prune_stacktrace(module, stack) do + stack + |> Enum.reverse() + |> Enum.drop_while(&(elem(&1, 0) != module)) + |> Enum.reverse() + |> case do + [] -> stack + stack -> stack end end diff --git a/lib/livebook/utils/http.ex b/lib/livebook/utils/http.ex index c71800fd4..d3e74bb9b 100644 --- a/lib/livebook/utils/http.ex +++ b/lib/livebook/utils/http.ex @@ -200,17 +200,6 @@ defmodule Livebook.Utils.HTTP do end end - # Load SSL certificates - - crt_file = CAStore.file_path() - crt = File.read!(crt_file) - pems = :public_key.pem_decode(crt) - ders = Enum.map(pems, fn {:Certificate, der, _} -> der end) - - # Note: we need to load the certificates at compilation time, as we - # don't have access to package files in Escript. - @cacerts ders - defp http_ssl_opts() do # Use secure options, see https://gist.github.com/jonatanklosko/5e20ca84127f6b31bbe3906498e1a1d7 @@ -218,7 +207,7 @@ defmodule Livebook.Utils.HTTP do if cacertfile = Livebook.Config.cacertfile() do {:cacertfile, to_charlist(cacertfile)} else - {:cacerts, @cacerts} + {:cacerts, :public_key.cacerts_get()} end [ diff --git a/lib/livebook_web/helpers/codec.ex b/lib/livebook_web/helpers/codec.ex index 1ea1dbf00..43ff60673 100644 --- a/lib/livebook_web/helpers/codec.ex +++ b/lib/livebook_web/helpers/codec.ex @@ -39,6 +39,7 @@ defmodule LivebookWeb.Helpers.Codec do file_offset = max(offset - @wav_header_size, 0) + # TODO: use File.stream!(path, [{:read_offset, file_offset}]) once we require Elixir v1.16+ file_stream = raw_file_range_stream!(path, file_offset, file_length) file_stream = diff --git a/mix.exs b/mix.exs index 83470f6f3..597575d9f 100644 --- a/mix.exs +++ b/mix.exs @@ -1,3 +1,7 @@ +if System.otp_release() < "25" do + Mix.raise("Livebook requires Erlang/OTP 25+") +end + defmodule Livebook.MixProject do use Mix.Project @@ -105,7 +109,6 @@ defmodule Livebook.MixProject do {:bandit, "~> 1.0"}, {:plug_crypto, "~> 2.0"}, {:earmark_parser, "~> 1.4"}, - {:castore, "~> 1.0"}, {:ecto, "~> 3.10"}, {:phoenix_ecto, "~> 4.4"}, {:aws_signature, "~> 0.3.0"},