diff --git a/app/controllers/admin/confirmations_controller.rb b/app/controllers/admin/confirmations_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..6c41999e0eda9a26140d06e51cb9651e7efbe601 --- /dev/null +++ b/app/controllers/admin/confirmations_controller.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Admin + class ConfirmationsController < BaseController + before_action :set_account + + def create + @account.user.confirm + redirect_to admin_accounts_path + end + + private + + def set_account + @account = Account.find(params[:account_id]) + end + end +end diff --git a/app/models/user.rb b/app/models/user.rb index cd1f816caf09d438f84f59a2b82c9321cd74f590..48e7b80887664ed426f8c8156ee4e52134164d4d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,6 +19,10 @@ class User < ApplicationRecord scope :admins, -> { where(admin: true) } scope :confirmed, -> { where.not(confirmed_at: nil) } + def confirmed? + confirmed_at.present? + end + def send_devise_notification(notification, *args) devise_mailer.send(notification, self, *args).deliver_later end diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml index bd1eb7ecda4412d591a7c5a3bcba09769f71b84f..c52b3ff741fd1b02c0bb27c54f324caebfb66e9e 100644 --- a/app/views/admin/accounts/index.html.haml +++ b/app/views/admin/accounts/index.html.haml @@ -25,6 +25,7 @@ %tr %th= t('admin.accounts.username') %th= t('admin.accounts.domain') + %th= t('admin.accounts.confirmed') %th= fa_icon 'paper-plane-o' %th %tbody @@ -34,6 +35,12 @@ %td - unless account.local? = link_to account.domain, admin_accounts_path(by_domain: account.domain) + %td + - if account.local? + - if account.user.present? && account.user.confirmed? + %i.fa.fa-check + - else + %i.fa.fa-times %td - if account.local? = t('admin.accounts.location.local') diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index 75b69b337196264eab4ca03bb8a56e9dd0f040e2..5dc3067cd37dde22a26da291c066505033a9b704 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -77,6 +77,9 @@ - else = link_to t('admin.accounts.silence'), admin_account_silence_path(@account.id), method: :post, class: 'button' + - unless @account.user.confirmed? + = link_to t('admin.accounts.confirm'), admin_account_confirmation_path(@account.id), method: :post, class: 'button' + - if @account.suspended? = link_to t('admin.accounts.undo_suspension'), admin_account_suspension_path(@account.id), method: :delete, class: 'button' - else diff --git a/config/locales/en.yml b/config/locales/en.yml index cf492e117ca131f309e8a13a34ae88b6adca83ac..b8463673e486a2e7af8e05a90619806c27ded2dd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -43,6 +43,8 @@ en: admin: accounts: are_you_sure: Are you sure? + confirm: Confirm + confirmed: Confirmed display_name: Display name domain: Domain edit: Edit diff --git a/config/routes.rb b/config/routes.rb index abc77535ab39cdcc099f181afa7e26a999c9828e..2c8ac1cff42c8a722c8e60edea3c53b820d78358 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -86,6 +86,7 @@ Rails.application.routes.draw do resource :reset, only: [:create] resource :silence, only: [:create, :destroy] resource :suspension, only: [:create, :destroy] + resource :confirmation, only: [:create] end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 846a206ec190f4d8d29e05b27dde0e1811b04e19..3dd50a701483384efb025f929d5ef9af786f1c9e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -98,6 +98,18 @@ RSpec.describe User, type: :model do end end + describe '#confirmed?' do + it 'returns true when a confirmed_at is set' do + user = Fabricate.build(:user, confirmed_at: Time.now.utc) + expect(user.confirmed?).to be true + end + + it 'returns false if a confirmed_at is nil' do + user = Fabricate.build(:user, confirmed_at: nil) + expect(user.confirmed?).to be false + end + end + describe 'whitelist' do around(:each) do |example| old_whitelist = Rails.configuration.x.email_whitelist