+ captcha_enabled = Pleroma.Config.get([Pleroma.Captcha, :enabled])
+ # true if captcha is disabled or enabled and valid, false otherwise
+ captcha_ok =
+ if !captcha_enabled do
+ :ok
+ else
+ Pleroma.Captcha.validate(
+ params[:captcha_token],
+ params[:captcha_solution],
+ params[:captcha_answer_data]
+ )
+ end
+
+ # Captcha invalid
+ if captcha_ok != :ok do
+ {:error, error} = captcha_ok
+ # I have no idea how this error handling works
+ {:error, %{error: Jason.encode!(%{captcha: [error]})}}
+ else
+ registrations_open = Pleroma.Config.get([:instance, :registrations_open])
+ registration_process(registrations_open, params, token)
+ end
+ end
+
+ defp registration_process(registration_open, params, token)
+ when registration_open == false or is_nil(registration_open) do
+ invite =
+ unless is_nil(token) do
+ Repo.get_by(UserInviteToken, %{token: token})
+ end
+
+ valid_invite? = invite && UserInviteToken.valid_invite?(invite)
+
+ case invite do
+ nil ->
+ {:error, "Invalid token"}
+
+ invite when valid_invite? ->
+ UserInviteToken.update_usage!(invite)
+ create_user(params)
+
+ _ ->
+ {:error, "Expired token"}
+ end
+ end
+
+ defp registration_process(true, params, _token) do
+ create_user(params)
+ end
+
+ defp create_user(params) do