otp version
This commit is contained in:
		
							parent
							
								
									8d9dee1ba9
								
							
						
					
					
						commit
						6b2fb9160c
					
				
					 3 changed files with 38 additions and 61 deletions
				
			
		| 
						 | 
				
			
			@ -43,7 +43,25 @@ def start(_type, _args) do
 | 
			
		|||
    load_custom_modules()
 | 
			
		||||
 | 
			
		||||
    if adapter() == Tesla.Adapter.Gun do
 | 
			
		||||
      Pleroma.OTPVersion.check!()
 | 
			
		||||
      if version = Pleroma.OTPVersion.version() do
 | 
			
		||||
        [major, minor] =
 | 
			
		||||
          version
 | 
			
		||||
          |> String.split(".")
 | 
			
		||||
          |> Enum.map(&String.to_integer/1)
 | 
			
		||||
          |> Enum.take(2)
 | 
			
		||||
 | 
			
		||||
        if (major == 22 and minor < 2) or major < 22 do
 | 
			
		||||
          raise "
 | 
			
		||||
            !!!OTP VERSION WARNING!!!
 | 
			
		||||
            You are using gun adapter with OTP version #{version}, which doesn't support correct handling of unordered certificates chains.
 | 
			
		||||
            "
 | 
			
		||||
        end
 | 
			
		||||
      else
 | 
			
		||||
        raise "
 | 
			
		||||
          !!!OTP VERSION WARNING!!!
 | 
			
		||||
          To support correct handling of unordered certificates chains - OTP version must be > 22.2.
 | 
			
		||||
          "
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Define workers and child supervisors to be supervised
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,71 +3,26 @@
 | 
			
		|||
# SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
defmodule Pleroma.OTPVersion do
 | 
			
		||||
  @type check_status() :: :ok | :undefined | {:error, String.t()}
 | 
			
		||||
 | 
			
		||||
  @spec check!() :: :ok | no_return()
 | 
			
		||||
  def check! do
 | 
			
		||||
    case check() do
 | 
			
		||||
      :ok ->
 | 
			
		||||
        :ok
 | 
			
		||||
 | 
			
		||||
      {:error, version} ->
 | 
			
		||||
        raise "
 | 
			
		||||
            !!!OTP VERSION WARNING!!!
 | 
			
		||||
            You are using gun adapter with OTP version #{version}, which doesn't support correct handling of unordered certificates chains.
 | 
			
		||||
            "
 | 
			
		||||
 | 
			
		||||
      :undefined ->
 | 
			
		||||
        raise "
 | 
			
		||||
            !!!OTP VERSION WARNING!!!
 | 
			
		||||
            To support correct handling of unordered certificates chains - OTP version must be > 22.2.
 | 
			
		||||
            "
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @spec check() :: check_status()
 | 
			
		||||
  def check do
 | 
			
		||||
  @spec version() :: String.t() | nil
 | 
			
		||||
  def version do
 | 
			
		||||
    # OTP Version https://erlang.org/doc/system_principles/versions.html#otp-version
 | 
			
		||||
    [
 | 
			
		||||
      Path.join(:code.root_dir(), "OTP_VERSION"),
 | 
			
		||||
      Path.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"])
 | 
			
		||||
    ]
 | 
			
		||||
    |> get_version_from_files()
 | 
			
		||||
    |> do_check()
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  @spec check([Path.t()]) :: check_status()
 | 
			
		||||
  def check(paths) do
 | 
			
		||||
    paths
 | 
			
		||||
    |> get_version_from_files()
 | 
			
		||||
    |> do_check()
 | 
			
		||||
  end
 | 
			
		||||
  @spec get_version_from_files([Path.t()]) :: String.t() | nil
 | 
			
		||||
  def get_version_from_files([]), do: nil
 | 
			
		||||
 | 
			
		||||
  defp get_version_from_files([]), do: nil
 | 
			
		||||
 | 
			
		||||
  defp get_version_from_files([path | paths]) do
 | 
			
		||||
  def get_version_from_files([path | paths]) do
 | 
			
		||||
    if File.exists?(path) do
 | 
			
		||||
      File.read!(path)
 | 
			
		||||
      path
 | 
			
		||||
      |> File.read!()
 | 
			
		||||
      |> String.replace(~r/\r|\n|\s/, "")
 | 
			
		||||
    else
 | 
			
		||||
      get_version_from_files(paths)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  defp do_check(nil), do: :undefined
 | 
			
		||||
 | 
			
		||||
  defp do_check(version) do
 | 
			
		||||
    version = String.replace(version, ~r/\r|\n|\s/, "")
 | 
			
		||||
 | 
			
		||||
    [major, minor] =
 | 
			
		||||
      version
 | 
			
		||||
      |> String.split(".")
 | 
			
		||||
      |> Enum.map(&String.to_integer/1)
 | 
			
		||||
      |> Enum.take(2)
 | 
			
		||||
 | 
			
		||||
    if (major == 22 and minor >= 2) or major > 22 do
 | 
			
		||||
      :ok
 | 
			
		||||
    else
 | 
			
		||||
      {:error, version}
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,30 +9,34 @@ defmodule Pleroma.OTPVersionTest do
 | 
			
		|||
 | 
			
		||||
  describe "check/1" do
 | 
			
		||||
    test "22.4" do
 | 
			
		||||
      assert OTPVersion.check(["test/fixtures/warnings/otp_version/22.4"]) == :ok
 | 
			
		||||
      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.4"]) ==
 | 
			
		||||
               "22.4"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "22.1" do
 | 
			
		||||
      assert OTPVersion.check(["test/fixtures/warnings/otp_version/22.1"]) == {:error, "22.1"}
 | 
			
		||||
      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.1"]) ==
 | 
			
		||||
               "22.1"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "21.1" do
 | 
			
		||||
      assert OTPVersion.check(["test/fixtures/warnings/otp_version/21.1"]) == {:error, "21.1"}
 | 
			
		||||
      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/21.1"]) ==
 | 
			
		||||
               "21.1"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "23.0" do
 | 
			
		||||
      assert OTPVersion.check(["test/fixtures/warnings/otp_version/23.0"]) == :ok
 | 
			
		||||
      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/23.0"]) ==
 | 
			
		||||
               "23.0"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "with non existance file" do
 | 
			
		||||
      assert OTPVersion.check([
 | 
			
		||||
      assert OTPVersion.get_version_from_files([
 | 
			
		||||
               "test/fixtures/warnings/otp_version/non-exising",
 | 
			
		||||
               "test/fixtures/warnings/otp_version/22.4"
 | 
			
		||||
             ]) == :ok
 | 
			
		||||
             ]) == "22.4"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "empty paths" do
 | 
			
		||||
      assert OTPVersion.check([]) == :undefined
 | 
			
		||||
      assert OTPVersion.get_version_from_files([]) == nil
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue