diff --git a/.gitignore b/.gitignore index d65284a3..376591ba 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ npm-debug.log # we ignore priv/static. You may want to comment # this depending on your deployment strategy. /priv/static/ + +# Mnesia +/Mnesia* \ No newline at end of file diff --git a/.iex.exs b/.iex.exs new file mode 100644 index 00000000..826000ae --- /dev/null +++ b/.iex.exs @@ -0,0 +1,2 @@ +alias Philomena.{Repo, Users.User} +import Ecto.Query \ No newline at end of file diff --git a/config/config.exs b/config/config.exs index 740e247d..63dcf03f 100644 --- a/config/config.exs +++ b/config/config.exs @@ -16,7 +16,8 @@ config :philomena, config :philomena, :pow, user: Philomena.Users.User, repo: Philomena.Repo, - extensions: [PhilomenaWeb.HaltTotp], + web_module: PhilomenaWeb, + extensions: [PowResetPassword, PowPersistentSession, PowMultiFactor], controller_callbacks: Pow.Extension.Phoenix.ControllerCallbacks config :bcrypt_elixir, diff --git a/lib/philomena/application.ex b/lib/philomena/application.ex index d1186c20..a78bf76a 100644 --- a/lib/philomena/application.ex +++ b/lib/philomena/application.ex @@ -11,9 +11,10 @@ defmodule Philomena.Application do # Start the Ecto repository Philomena.Repo, # Start the endpoint when the application starts - PhilomenaWeb.Endpoint + PhilomenaWeb.Endpoint, # Starts a worker by calling: Philomena.Worker.start_link(arg) # {Philomena.Worker, arg}, + Pow.Store.Backend.MnesiaCache ] # See https://hexdocs.pm/elixir/Supervisor.html diff --git a/lib/philomena/images/query.ex b/lib/philomena/images/query.ex index aebd8743..28a4db54 100644 --- a/lib/philomena/images/query.ex +++ b/lib/philomena/images/query.ex @@ -53,12 +53,12 @@ defmodule Philomena.Images.Query do tag_include = %{terms: %{tag_ids: user.watched_tag_ids}} {:ok, include_query} = - Philomena.Images.Query.user_parser(ctx, user.watched_images_query |> normalize()) + Philomena.Images.Query.user_parser(ctx, user.watched_images_query_str |> normalize()) {:ok, exclude_query} = Philomena.Images.Query.user_parser( ctx, - user.watched_images_exclude_query |> normalize() + user.watched_images_exclude_str |> normalize() ) should = [tag_include, include_query] @@ -125,12 +125,12 @@ defmodule Philomena.Images.Query do tag_include = %{terms: %{tag_ids: user.watched_tag_ids}} {:ok, include_query} = - Philomena.Images.Query.moderator_parser(ctx, user.watched_images_query |> normalize()) + Philomena.Images.Query.moderator_parser(ctx, user.watched_images_query_str |> normalize()) {:ok, exclude_query} = Philomena.Images.Query.moderator_parser( ctx, - user.watched_images_exclude_query |> normalize() + user.watched_images_exclude_str |> normalize() ) should = [tag_include, include_query] diff --git a/lib/philomena/users/user.ex b/lib/philomena/users/user.ex index dbf6b505..9a4b6307 100644 --- a/lib/philomena/users/user.ex +++ b/lib/philomena/users/user.ex @@ -6,6 +6,9 @@ defmodule Philomena.Users.User do use Pow.Ecto.Schema, password_hash_methods: {&Password.hash_pwd_salt/1, &Password.verify_pass/2} + use Pow.Extension.Ecto.Schema, + extensions: [PowResetPassword] + import Ecto.Changeset schema "users" do @@ -100,6 +103,7 @@ defmodule Philomena.Users.User do def changeset(user, attrs) do user |> pow_changeset(attrs) + |> pow_extension_changeset(attrs) |> cast(attrs, []) |> validate_required([]) end diff --git a/lib/philomena_web/endpoint.ex b/lib/philomena_web/endpoint.ex index 7667b112..f787a00d 100644 --- a/lib/philomena_web/endpoint.ex +++ b/lib/philomena_web/endpoint.ex @@ -43,7 +43,10 @@ defmodule PhilomenaWeb.Endpoint do signing_salt: "signed cookie", encryption_salt: "authenticated encrypted cookie" - plug PhilomenaWeb.Plugs.Session, otp_app: :philomena + plug Pow.Plug.Session, otp_app: :philomena + plug PowPersistentSession.Plug.Cookie, otp_app: :philomena + + plug PhilomenaWeb.Plugs.ReloadUser plug PhilomenaWeb.Plugs.RenderTime plug PhilomenaWeb.Plugs.CurrentFilter plug PhilomenaWeb.Router diff --git a/lib/philomena_web/halt_totp.ex b/lib/philomena_web/halt_totp.ex deleted file mode 100644 index 77a01861..00000000 --- a/lib/philomena_web/halt_totp.ex +++ /dev/null @@ -1,35 +0,0 @@ -defmodule PhilomenaWeb.HaltTotp.Phoenix.ControllerCallbacks do - use Pow.Extension.Phoenix.ControllerCallbacks.Base - alias Pow.Plug - import Phoenix.Controller - - def before_respond(Pow.Phoenix.SessionController, :create, {:ok, conn}, _config) do - conn - |> Plug.current_user() - |> halt_totp(conn) - end - - defp halt_totp(%{otp_required_for_login: true}, conn) do - {:ok, conn} = Plug.clear_authenticated_user(conn) - - conn = - conn - |> put_flash(:error, "Cannot yet authenticate accounts with TOTP enabled") - |> redirect(to: "/") - - {:halt, conn} - end - - defp halt_totp(_, conn) do - {:ok, conn} - end - - def before_process(Pow.Phoenix.RegistrationController, _method, conn, _config) do - conn = - conn - |> put_flash(:error, "Registrations are disabled") - |> redirect(to: "/") - - {:halt, conn} - end -end diff --git a/lib/philomena_web/plugs/current_filter.ex b/lib/philomena_web/plugs/current_filter.ex index e9b6d659..4ef1cd1b 100644 --- a/lib/philomena_web/plugs/current_filter.ex +++ b/lib/philomena_web/plugs/current_filter.ex @@ -15,7 +15,7 @@ defmodule PhilomenaWeb.Plugs.CurrentFilter do filter = if user do - user = user |> preload(:current_filter) + user = user |> Repo.preload(:current_filter) user.current_filter else filter_id = conn |> get_session(:filter_id) diff --git a/lib/philomena_web/plugs/reload_user.ex b/lib/philomena_web/plugs/reload_user.ex new file mode 100644 index 00000000..a3ee8975 --- /dev/null +++ b/lib/philomena_web/plugs/reload_user.ex @@ -0,0 +1,21 @@ +defmodule PhilomenaWeb.Plugs.ReloadUser do + alias Pow.Plug + alias Philomena.Users.User + alias Philomena.Repo + + def init(opts), do: opts + + def call(conn, _opts) do + config = Plug.fetch_config(conn) + + case Plug.current_user(conn, config) do + nil -> + conn + + user -> + reloaded_user = Repo.get!(User, user.id) + + Plug.assign_current_user(conn, reloaded_user, config) + end + end +end \ No newline at end of file diff --git a/lib/philomena_web/plugs/session.ex b/lib/philomena_web/plugs/session.ex deleted file mode 100644 index e3bac93b..00000000 --- a/lib/philomena_web/plugs/session.ex +++ /dev/null @@ -1,52 +0,0 @@ -defmodule PhilomenaWeb.Plugs.Session do - use Pow.Plug.Base - - alias Plug.Conn - alias Philomena.{Repo, Users.User} - - @session_key :philomena_session - - def fetch(conn, _config) do - conn = Conn.fetch_session(conn) - user = Conn.get_session(conn, @session_key) - - conn - |> maybe_load_user(user) - end - - def create(conn, user, _config) do - value = session_value(user) - - conn = - conn - |> Conn.fetch_session() - |> Conn.put_session(@session_key, value) - - {conn, user} - end - - def delete(conn, _config) do - conn - |> Conn.fetch_session() - |> Conn.delete_session(@session_key) - end - - defp maybe_load_user(conn, {:ok, user}) do - with {:ok, [user_id, hash]} <- Jason.decode(user), - %User{} = user <- Repo.get(User, user_id), - true <- SecureCompare.compare(hash, binary_part(user.encrypted_password, 0, 25)) do - {conn, user} - else - _ -> - {conn, nil} - end - end - - defp maybe_load_user(conn, _) do - {conn, nil} - end - - defp session_value(user) do - Jason.encode([user.id, binary_part(user.encrypted_password, 0, 25)]) - end -end diff --git a/lib/philomena_web/router.ex b/lib/philomena_web/router.ex index 8f960520..9c4e39c7 100644 --- a/lib/philomena_web/router.ex +++ b/lib/philomena_web/router.ex @@ -16,11 +16,11 @@ defmodule PhilomenaWeb.Router do plug :accepts, ["json"] end - #scope "/" do - # pipe_through :browser - # - # pow_routes() - #end + scope "/" do + pipe_through :browser + + pow_routes() + end scope "/", PhilomenaWeb do pipe_through :browser diff --git a/lib/philomena_web/templates/pow/registration/edit.html.eex b/lib/philomena_web/templates/pow/registration/edit.html.eex new file mode 100644 index 00000000..69130ee0 --- /dev/null +++ b/lib/philomena_web/templates/pow/registration/edit.html.eex @@ -0,0 +1,30 @@ +
Oops, something went wrong! Please check the errors below.
+Oops, something went wrong! Please check the errors below.
+Oops, something went wrong! Please check the errors below.
+