summaryrefslogtreecommitdiff
path: root/lib/pleroma/application_requirements.ex
blob: 16f62b6f5d43e00caa18e612479f66e82bffcaae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.ApplicationRequirements do
  @moduledoc """
  The module represents the collection of validations to runs before start server.
  """

  defmodule VerifyError, do: defexception([:message])

  import Ecto.Query

  require Logger

  @spec verify!() :: :ok | VerifyError.t()
  def verify! do
    :ok
    |> check_confirmation_accounts!
    |> check_migrations_applied!()
    |> check_welcome_message_config!()
    |> check_rum!()
    |> handle_result()
  end

  defp handle_result(:ok), do: :ok
  defp handle_result({:error, message}), do: raise(VerifyError, message: message)

  defp check_welcome_message_config!(:ok) do
    if Pleroma.Config.get([:welcome, :email, :enabled], false) and
         not Pleroma.Emails.Mailer.enabled?() do
      Logger.error("""
      To send welcome email do you need to enable mail.
      \nconfig :pleroma, Pleroma.Emails.Mailer, enabled: true
      """)

      {:error, "The mail disabled."}
    else
      :ok
    end
  end

  defp check_welcome_message_config!(result), do: result

  # Checks account confirmation email
  #
  def check_confirmation_accounts!(:ok) do
    if Pleroma.Config.get([:instance, :account_activation_required]) &&
         not Pleroma.Config.get([Pleroma.Emails.Mailer, :enabled]) do
      Logger.error(
        "Account activation enabled, but no Mailer settings enabled.\nPlease set config :pleroma, :instance, account_activation_required: false\nOtherwise setup and enable Mailer."
      )

      {:error,
       "Account activation enabled, but Mailer is disabled. Cannot send confirmation emails."}
    else
      :ok
    end
  end

  def check_confirmation_accounts!(result), do: result

  # Checks for pending migrations.
  #
  def check_migrations_applied!(:ok) do
    unless Pleroma.Config.get(
             [:i_am_aware_this_may_cause_data_loss, :disable_migration_check],
             false
           ) do
      {_, res, _} =
        Ecto.Migrator.with_repo(Pleroma.Repo, fn repo ->
          down_migrations =
            Ecto.Migrator.migrations(repo)
            |> Enum.reject(fn
              {:up, _, _} -> true
              {:down, _, _} -> false
            end)

          if length(down_migrations) > 0 do
            down_migrations_text =
              Enum.map(down_migrations, fn {:down, id, name} -> "- #{name} (#{id})\n" end)

            Logger.error(
              "The following migrations were not applied:\n#{down_migrations_text}If you want to start Pleroma anyway, set\nconfig :pleroma, :i_am_aware_this_may_cause_data_loss, disable_migration_check: true"
            )

            {:error, "Unapplied Migrations detected"}
          else
            :ok
          end
        end)

      res
    else
      :ok
    end
  end

  def check_migrations_applied!(result), do: result

  # Checks for settings of RUM indexes.
  #
  defp check_rum!(:ok) do
    {_, res, _} =
      Ecto.Migrator.with_repo(Pleroma.Repo, fn repo ->
        migrate =
          from(o in "columns",
            where: o.table_name == "objects",
            where: o.column_name == "fts_content"
          )
          |> repo.exists?(prefix: "information_schema")

        setting = Pleroma.Config.get([:database, :rum_enabled], false)

        do_check_rum!(setting, migrate)
      end)

    res
  end

  defp check_rum!(result), do: result

  defp do_check_rum!(setting, migrate) do
    case {setting, migrate} do
      {true, false} ->
        Logger.error(
          "Use `RUM` index is enabled, but were not applied migrations for it.\nIf you want to start Pleroma anyway, set\nconfig :pleroma, :database, rum_enabled: false\nOtherwise apply the following migrations:\n`mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/`"
        )

        {:error, "Unapplied RUM Migrations detected"}

      {false, true} ->
        Logger.error(
          "Detected applied migrations to use `RUM` index, but `RUM` isn't enable in settings.\nIf you want to use `RUM`, set\nconfig :pleroma, :database, rum_enabled: true\nOtherwise roll `RUM` migrations back.\n`mix ecto.rollback --migrations-path priv/repo/optional_migrations/rum_indexing/`"
        )

        {:error, "RUM Migrations detected"}

      _ ->
        :ok
    end
  end
end