[#114] Email confirmation route, action, node setting, User.Info fields.
authorIvan Tashkinov <ivantashkinov@gmail.com>
Fri, 14 Dec 2018 13:38:56 +0000 (16:38 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Tue, 18 Dec 2018 14:18:53 +0000 (17:18 +0300)
lib/pleroma/user.ex
lib/pleroma/user/info.ex
lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
lib/pleroma/web/router.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex

index 3ad1ab87a69347c775e9fa7f2081414d53e814d6..ee0a0dfb93b96233c5b9eebfbc17dcbf4ddc6c90 100644 (file)
@@ -364,6 +364,10 @@ 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,
index a3785447c39164876ed9af74ec2551bbc44ed0e4..f75984038d008aca0ada0ffc969ad2a8ce80fdbc 100644 (file)
@@ -9,6 +9,8 @@ defmodule Pleroma.User.Info do
     field(:note_count, :integer, default: 0)
     field(:follower_count, :integer, default: 0)
     field(:locked, :boolean, default: false)
+    field(:confirmation_pending, :boolean, default: false)
+    field(:confirmation_token, :string, default: nil)
     field(:default_scope, :string, default: "public")
     field(:blocks, {:array, :string}, default: [])
     field(:domain_blocks, {:array, :string}, default: [])
@@ -141,6 +143,10 @@ defmodule Pleroma.User.Info do
     ])
   end
 
+  def confirmation_update(info, params) do
+    cast(info, params, [:confirmation_pending, :confirmation_token])
+  end
+
   def mastodon_profile_update(info, params) do
     info
     |> cast(params, [
index 44c11f40a35efaec656778044a7b70c5762e1737..70921605d835ec79b9d32ac70e34b927f9c53ff5 100644 (file)
@@ -132,6 +132,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
           banner: Keyword.get(instance, :banner_upload_limit),
           background: Keyword.get(instance, :background_upload_limit)
         },
+        accountActivationRequired: Keyword.get(instance, :account_activation_required, false),
         invitesEnabled: Keyword.get(instance, :invites_enabled, false),
         features: features
       }
index dd1985d6ee1b91a16e0c88517f0edc9fa1e49f27..b2fbc088da7ea7011bae0408d572f0db8dd85f2a 100644 (file)
@@ -281,6 +281,7 @@ 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)
 
     get("/search", TwitterAPI.Controller, :search)
     get("/statusnet/tags/timeline/:tag", TwitterAPI.Controller, :public_and_external_timeline)
index 327620302a6f9081478e2cc40aff2998e90176db..2680be25f6d39efec1c4060fbc01f5c5841123b7 100644 (file)
@@ -372,6 +372,19 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     end
   end
 
+  def confirm_email(conn, %{"token" => token}) do
+    with %User{} = user <- User.get_by_confirmation_token(token),
+         true <- user.local,
+         new_info_fields <- %{confirmation_pending: false, confirmation_token: nil},
+         info_change <- User.Info.confirmation_update(user.info, new_info_fields),
+         changeset <- Changeset.change(user) |> Changeset.put_embed(:info, info_change),
+         {:ok, _} <- User.update_and_set_cache(changeset) do
+      conn
+      |> put_flash(:info, "Email confirmed. Please sign in.")
+      |> redirect(to: "/")
+    end
+  end
+
   def update_avatar(%{assigns: %{user: user}} = conn, params) do
     {:ok, object} = ActivityPub.upload(params, type: :avatar)
     change = Changeset.change(user, %{avatar: object.data})