Browse Source

[#114] Added :user_id component to email confirmation path to improve the security.

Added tests for `confirm_email` action.
tags/v0.9.9
Ivan Tashkinov 5 years ago
parent
commit
f69cbf4755
5 changed files with 26 additions and 10 deletions
  1. +1
    -0
      lib/pleroma/emails/user_email.ex
  2. +0
    -4
      lib/pleroma/user.ex
  3. +6
    -1
      lib/pleroma/web/router.ex
  4. +4
    -2
      lib/pleroma/web/twitter_api/twitter_api_controller.ex
  5. +15
    -3
      test/web/twitter_api/twitter_api_controller_test.exs

+ 1
- 0
lib/pleroma/emails/user_email.ex View File

@@ -70,6 +70,7 @@ defmodule Pleroma.UserEmail do
Router.Helpers.confirm_email_url(
Endpoint,
:confirm_email,
user.id,
to_string(user.info.confirmation_token)
)



+ 0
- 4
lib/pleroma/user.ex View File

@@ -396,10 +396,6 @@ defmodule Pleroma.User do
end
end

def get_by_confirmation_token(token) do
Repo.one(from(u in User, where: fragment("? ->> 'confirmation_token' = ?", u.info, ^token)))
end

def get_followers_query(%User{id: id, follower_address: follower_address}) do
from(
u in User,


+ 6
- 1
lib/pleroma/web/router.ex View File

@@ -282,7 +282,12 @@ defmodule Pleroma.Web.Router do
post("/account/register", TwitterAPI.Controller, :register)
post("/account/password_reset", TwitterAPI.Controller, :password_reset)

get("/account/confirm_email/:token", TwitterAPI.Controller, :confirm_email, as: :confirm_email)
get(
"/account/confirm_email/:user_id/:token",
TwitterAPI.Controller,
:confirm_email,
as: :confirm_email
)

post("/account/resend_confirmation_email", TwitterAPI.Controller, :resend_confirmation_email)



+ 4
- 2
lib/pleroma/web/twitter_api/twitter_api_controller.ex View File

@@ -382,9 +382,11 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
end
end

def confirm_email(conn, %{"token" => token}) do
with %User{} = user <- User.get_by_confirmation_token(token),
def confirm_email(conn, %{"user_id" => uid, "token" => token}) do
with %User{} = user <- Repo.get(User, uid),
true <- user.local,
true <- user.info.confirmation_pending,
true <- user.info.confirmation_token == token,
info_change <- User.Info.confirmation_changeset(user.info, :confirmed),
changeset <- Changeset.change(user) |> Changeset.put_embed(:info, info_change),
{:ok, _} <- User.update_and_set_cache(changeset) do


+ 15
- 3
test/web/twitter_api/twitter_api_controller_test.exs View File

@@ -873,7 +873,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
end
end

describe "GET /api/account/confirm_email/:token" do
describe "GET /api/account/confirm_email/:id/:token" do
setup do
user = insert(:user)
info_change = User.Info.confirmation_changeset(user.info, :unconfirmed)
@@ -890,19 +890,31 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
end

test "it redirects to root url", %{conn: conn, user: user} do
conn = get(conn, "/api/account/confirm_email/#{user.info.confirmation_token}")
conn = get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}")

assert 302 == conn.status
end

test "it confirms the user account", %{conn: conn, user: user} do
get(conn, "/api/account/confirm_email/#{user.info.confirmation_token}")
get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}")

user = Repo.get(User, user.id)

refute user.info.confirmation_pending
refute user.info.confirmation_token
end

test "it returns 500 if user cannot be found by id", %{conn: conn, user: user} do
conn = get(conn, "/api/account/confirm_email/0/#{user.info.confirmation_token}")

assert 500 == conn.status
end

test "it returns 500 if token is invalid", %{conn: conn, user: user} do
conn = get(conn, "/api/account/confirm_email/#{user.id}/wrong_token")

assert 500 == conn.status
end
end

describe "POST /api/account/resend_confirmation_email" do


Loading…
Cancel
Save