mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-02-18 19:34:23 +01:00
initial user verification stuff
This commit is contained in:
parent
aa1ca50f0c
commit
a3db6f6eed
12 changed files with 125 additions and 6 deletions
|
@ -22,6 +22,7 @@ defmodule Philomena.Comments.Comment do
|
||||||
field :deletion_reason, :string, default: ""
|
field :deletion_reason, :string, default: ""
|
||||||
field :destroyed_content, :boolean, default: false
|
field :destroyed_content, :boolean, default: false
|
||||||
field :name_at_post_time, :string
|
field :name_at_post_time, :string
|
||||||
|
field :approved_at, :utc_datetime
|
||||||
|
|
||||||
timestamps(inserted_at: :created_at, type: :utc_datetime)
|
timestamps(inserted_at: :created_at, type: :utc_datetime)
|
||||||
end
|
end
|
||||||
|
|
|
@ -82,6 +82,7 @@ defmodule Philomena.Images.Image do
|
||||||
field :hidden_image_key, :string
|
field :hidden_image_key, :string
|
||||||
field :scratchpad, :string
|
field :scratchpad, :string
|
||||||
field :hides_count, :integer, default: 0
|
field :hides_count, :integer, default: 0
|
||||||
|
field :approved_at, :utc_datetime
|
||||||
|
|
||||||
# todo: can probably remove these now
|
# todo: can probably remove these now
|
||||||
field :tag_list_cache, :string
|
field :tag_list_cache, :string
|
||||||
|
|
|
@ -23,6 +23,7 @@ defmodule Philomena.Posts.Post do
|
||||||
field :deletion_reason, :string, default: ""
|
field :deletion_reason, :string, default: ""
|
||||||
field :destroyed_content, :boolean, default: false
|
field :destroyed_content, :boolean, default: false
|
||||||
field :name_at_post_time, :string
|
field :name_at_post_time, :string
|
||||||
|
field :approved_at, :utc_datetime
|
||||||
|
|
||||||
timestamps(inserted_at: :created_at, type: :utc_datetime)
|
timestamps(inserted_at: :created_at, type: :utc_datetime)
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,6 +15,7 @@ defmodule Philomena.Reports.Report do
|
||||||
field :reason, :string
|
field :reason, :string
|
||||||
field :state, :string, default: "open"
|
field :state, :string, default: "open"
|
||||||
field :open, :boolean, default: true
|
field :open, :boolean, default: true
|
||||||
|
field :system, :boolean, default: false
|
||||||
|
|
||||||
# fixme: rails polymorphic relation
|
# fixme: rails polymorphic relation
|
||||||
field :reportable_id, :integer
|
field :reportable_id, :integer
|
||||||
|
|
|
@ -31,6 +31,7 @@ defmodule Philomena.Topics.Topic do
|
||||||
field :slug, :string
|
field :slug, :string
|
||||||
field :anonymous, :boolean, default: false
|
field :anonymous, :boolean, default: false
|
||||||
field :hidden_from_users, :boolean, default: false
|
field :hidden_from_users, :boolean, default: false
|
||||||
|
field :approved_at, :utc_datetime
|
||||||
|
|
||||||
timestamps(inserted_at: :created_at, type: :utc_datetime)
|
timestamps(inserted_at: :created_at, type: :utc_datetime)
|
||||||
end
|
end
|
||||||
|
|
|
@ -671,6 +671,18 @@ defmodule Philomena.Users do
|
||||||
|> setup_roles()
|
|> setup_roles()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def verify_user(%User{} = user) do
|
||||||
|
user
|
||||||
|
|> User.verify_changeset()
|
||||||
|
|> Repo.update()
|
||||||
|
end
|
||||||
|
|
||||||
|
def unverify_user(%User{} = user) do
|
||||||
|
user
|
||||||
|
|> User.unverify_changeset()
|
||||||
|
|> Repo.update()
|
||||||
|
end
|
||||||
|
|
||||||
defp setup_roles(nil), do: nil
|
defp setup_roles(nil), do: nil
|
||||||
|
|
||||||
defp setup_roles(user) do
|
defp setup_roles(user) do
|
||||||
|
|
|
@ -119,6 +119,7 @@ defmodule Philomena.Users.User do
|
||||||
field :hide_default_role, :boolean, default: false
|
field :hide_default_role, :boolean, default: false
|
||||||
field :senior_staff, :boolean, default: false
|
field :senior_staff, :boolean, default: false
|
||||||
field :bypass_rate_limits, :boolean, default: false
|
field :bypass_rate_limits, :boolean, default: false
|
||||||
|
field :verified, :boolean, default: false
|
||||||
|
|
||||||
# For avatar validation/persistence
|
# For avatar validation/persistence
|
||||||
field :avatar_width, :integer, virtual: true
|
field :avatar_width, :integer, virtual: true
|
||||||
|
@ -446,6 +447,14 @@ defmodule Philomena.Users.User do
|
||||||
change(user, forced_filter_id: nil)
|
change(user, forced_filter_id: nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def verify_changeset(user) do
|
||||||
|
change(user, verified: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
def unverify_changeset(user) do
|
||||||
|
change(user, verified: false)
|
||||||
|
end
|
||||||
|
|
||||||
def create_totp_secret_changeset(user) do
|
def create_totp_secret_changeset(user) do
|
||||||
secret = :crypto.strong_rand_bytes(15) |> Base.encode32()
|
secret = :crypto.strong_rand_bytes(15) |> Base.encode32()
|
||||||
data = Philomena.Users.Encryptor.encrypt_model(secret)
|
data = Philomena.Users.Encryptor.encrypt_model(secret)
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
defmodule PhilomenaWeb.Admin.User.VerificationController do
|
||||||
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
|
alias Philomena.Users.User
|
||||||
|
alias Philomena.Users
|
||||||
|
|
||||||
|
plug :verify_authorized
|
||||||
|
plug :load_resource, model: User, id_name: "user_id", id_field: "slug", persisted: true
|
||||||
|
|
||||||
|
def create(conn, _params) do
|
||||||
|
{:ok, user} = Users.verify_user(conn.assigns.user)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> put_flash(:info, "User verification granted.")
|
||||||
|
|> moderation_log(details: &log_details/3, data: user)
|
||||||
|
|> redirect(to: Routes.profile_path(conn, :show, user))
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete(conn, _params) do
|
||||||
|
{:ok, user} = Users.unverify_user(conn.assigns.user)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> put_flash(:info, "User verification revoked.")
|
||||||
|
|> moderation_log(details: &log_details/3, data: user)
|
||||||
|
|> redirect(to: Routes.profile_path(conn, :show, user))
|
||||||
|
end
|
||||||
|
|
||||||
|
defp verify_authorized(conn, _opts) do
|
||||||
|
case Canada.Can.can?(conn.assigns.current_user, :index, User) do
|
||||||
|
true -> conn
|
||||||
|
_false -> PhilomenaWeb.NotAuthorizedPlug.call(conn)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp log_details(conn, action, user) do
|
||||||
|
body =
|
||||||
|
case action do
|
||||||
|
:create -> "Granted verification to #{user.name}"
|
||||||
|
:delete -> "Revoked verification from #{user.name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
%{body: body, subject_path: Routes.profile_path(conn, :show, user)}
|
||||||
|
end
|
||||||
|
end
|
|
@ -379,6 +379,8 @@ defmodule PhilomenaWeb.Router do
|
||||||
only: [:create, :delete],
|
only: [:create, :delete],
|
||||||
singleton: true
|
singleton: true
|
||||||
|
|
||||||
|
resources "/verification", User.VerificationController, only: [:create, :delete], singleton: true
|
||||||
|
|
||||||
resources "/unlock", User.UnlockController, only: [:create], singleton: true
|
resources "/unlock", User.UnlockController, only: [:create], singleton: true
|
||||||
resources "/api_key", User.ApiKeyController, only: [:delete], singleton: true
|
resources "/api_key", User.ApiKeyController, only: [:delete], singleton: true
|
||||||
resources "/downvotes", User.DownvoteController, only: [:delete], singleton: true
|
resources "/downvotes", User.DownvoteController, only: [:delete], singleton: true
|
||||||
|
|
|
@ -153,8 +153,19 @@ a.label.label--primary.label--block href="#" data-click-toggle=".js-admin__optio
|
||||||
i.fa.fa-fw.fa-ban
|
i.fa.fa-fw.fa-ban
|
||||||
span.admin__button Ban this sucker
|
span.admin__button Ban this sucker
|
||||||
|
|
||||||
|
ul.profile-admin__options__column
|
||||||
= if can?(@conn, :index, Philomena.Users.User) do
|
= if can?(@conn, :index, Philomena.Users.User) do
|
||||||
li
|
li
|
||||||
= link to: Routes.admin_user_api_key_path(@conn, :delete, @user), data: [confirm: "Are you really, really sure?", method: "delete"] do
|
= link to: Routes.admin_user_api_key_path(@conn, :delete, @user), data: [confirm: "Are you really, really sure?", method: "delete"] do
|
||||||
i.fas.fa-fw.fa-key
|
i.fas.fa-fw.fa-key
|
||||||
span.admin__button Reset API key
|
span.admin__button Reset API key
|
||||||
|
|
||||||
|
li
|
||||||
|
= if @user.verified do
|
||||||
|
= link to: Routes.admin_user_verification_path(@conn, :delete, @user), data: [confirm: "Are you really, really sure?", method: "delete"] do
|
||||||
|
i.fas.fa-fw.fa-user-times
|
||||||
|
span.admin__button Revoke Verification
|
||||||
|
- else
|
||||||
|
= link to: Routes.admin_user_verification_path(@conn, :create, @user), data: [confirm: "Are you really, really sure?", method: "create"] do
|
||||||
|
i.fas.fa-fw.fa-user-check
|
||||||
|
span.admin__button Grant Verification
|
||||||
|
|
29
priv/repo/migrations/20220321173359_add_approval_queue.exs
Normal file
29
priv/repo/migrations/20220321173359_add_approval_queue.exs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
defmodule Philomena.Repo.Migrations.AddApprovalQueue do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table("reports") do
|
||||||
|
add :system, :boolean, default: false
|
||||||
|
end
|
||||||
|
|
||||||
|
alter table("images") do
|
||||||
|
add :approved_at, :utc_datetime
|
||||||
|
end
|
||||||
|
|
||||||
|
alter table("comments") do
|
||||||
|
add :approved_at, :utc_datetime
|
||||||
|
end
|
||||||
|
|
||||||
|
alter table("posts") do
|
||||||
|
add :approved_at, :utc_datetime
|
||||||
|
end
|
||||||
|
|
||||||
|
alter table("topics") do
|
||||||
|
add :approved_at, :utc_datetime
|
||||||
|
end
|
||||||
|
|
||||||
|
alter table("users") do
|
||||||
|
add :verified, :boolean, default: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -282,7 +282,8 @@ CREATE TABLE public.comments (
|
||||||
deletion_reason character varying DEFAULT ''::character varying NOT NULL,
|
deletion_reason character varying DEFAULT ''::character varying NOT NULL,
|
||||||
destroyed_content boolean DEFAULT false,
|
destroyed_content boolean DEFAULT false,
|
||||||
name_at_post_time character varying,
|
name_at_post_time character varying,
|
||||||
body character varying NOT NULL
|
body character varying NOT NULL,
|
||||||
|
approved_at timestamp(0) without time zone
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -971,7 +972,8 @@ CREATE TABLE public.images (
|
||||||
hides_count integer DEFAULT 0 NOT NULL,
|
hides_count integer DEFAULT 0 NOT NULL,
|
||||||
image_duration double precision,
|
image_duration double precision,
|
||||||
description character varying DEFAULT ''::character varying NOT NULL,
|
description character varying DEFAULT ''::character varying NOT NULL,
|
||||||
scratchpad character varying
|
scratchpad character varying,
|
||||||
|
approved_at timestamp(0) without time zone
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1258,7 +1260,8 @@ CREATE TABLE public.posts (
|
||||||
deletion_reason character varying DEFAULT ''::character varying NOT NULL,
|
deletion_reason character varying DEFAULT ''::character varying NOT NULL,
|
||||||
destroyed_content boolean DEFAULT false NOT NULL,
|
destroyed_content boolean DEFAULT false NOT NULL,
|
||||||
name_at_post_time character varying,
|
name_at_post_time character varying,
|
||||||
body character varying NOT NULL
|
body character varying NOT NULL,
|
||||||
|
approved_at timestamp(0) without time zone
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1300,7 +1303,8 @@ CREATE TABLE public.reports (
|
||||||
admin_id integer,
|
admin_id integer,
|
||||||
reportable_id integer NOT NULL,
|
reportable_id integer NOT NULL,
|
||||||
reportable_type character varying NOT NULL,
|
reportable_type character varying NOT NULL,
|
||||||
reason character varying NOT NULL
|
reason character varying NOT NULL,
|
||||||
|
system boolean DEFAULT false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1676,7 +1680,8 @@ CREATE TABLE public.topics (
|
||||||
deleted_by_id integer,
|
deleted_by_id integer,
|
||||||
locked_by_id integer,
|
locked_by_id integer,
|
||||||
last_post_id integer,
|
last_post_id integer,
|
||||||
hidden_from_users boolean DEFAULT false NOT NULL
|
hidden_from_users boolean DEFAULT false NOT NULL,
|
||||||
|
approved_at timestamp(0) without time zone
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -2050,7 +2055,8 @@ CREATE TABLE public.users (
|
||||||
description character varying,
|
description character varying,
|
||||||
scratchpad character varying,
|
scratchpad character varying,
|
||||||
bypass_rate_limits boolean DEFAULT false,
|
bypass_rate_limits boolean DEFAULT false,
|
||||||
scale_large_images character varying(255) DEFAULT 'true'::character varying NOT NULL
|
scale_large_images character varying(255) DEFAULT 'true'::character varying NOT NULL,
|
||||||
|
verified boolean DEFAULT false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -4970,3 +4976,4 @@ INSERT INTO public."schema_migrations" (version) VALUES (20210921025336);
|
||||||
INSERT INTO public."schema_migrations" (version) VALUES (20210929181319);
|
INSERT INTO public."schema_migrations" (version) VALUES (20210929181319);
|
||||||
INSERT INTO public."schema_migrations" (version) VALUES (20211107130226);
|
INSERT INTO public."schema_migrations" (version) VALUES (20211107130226);
|
||||||
INSERT INTO public."schema_migrations" (version) VALUES (20211219194836);
|
INSERT INTO public."schema_migrations" (version) VALUES (20211219194836);
|
||||||
|
INSERT INTO public."schema_migrations" (version) VALUES (20220321173359);
|
||||||
|
|
Loading…
Reference in a new issue