forked from mastodon/mastodon
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add password challenge to 2FA settings, e-mail notifications (mastodo…
…n#11878) Fix mastodon#3961
- Loading branch information
1 parent
ef0bf7d
commit 16ba81a
Showing
32 changed files
with
567 additions
and
50 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# frozen_string_literal: true | ||
|
||
class Auth::ChallengesController < ApplicationController | ||
include ChallengableConcern | ||
|
||
layout 'auth' | ||
|
||
before_action :authenticate_user! | ||
|
||
skip_before_action :require_functional! | ||
|
||
def create | ||
if challenge_passed? | ||
session[:challenge_passed_at] = Time.now.utc | ||
redirect_to challenge_params[:return_to] | ||
else | ||
@challenge = Form::Challenge.new(return_to: challenge_params[:return_to]) | ||
flash.now[:alert] = I18n.t('challenge.invalid_password') | ||
render_challenge | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
# frozen_string_literal: true | ||
|
||
# This concern is inspired by "sudo mode" on GitHub. It | ||
# is a way to re-authenticate a user before allowing them | ||
# to see or perform an action. | ||
# | ||
# Add `before_action :require_challenge!` to actions you | ||
# want to protect. | ||
# | ||
# The user will be shown a page to enter the challenge (which | ||
# is either the password, or just the username when no | ||
# password exists). Upon passing, there is a grace period | ||
# during which no challenge will be asked from the user. | ||
# | ||
# Accessing challenge-protected resources during the grace | ||
# period will refresh the grace period. | ||
module ChallengableConcern | ||
extend ActiveSupport::Concern | ||
|
||
CHALLENGE_TIMEOUT = 1.hour.freeze | ||
|
||
def require_challenge! | ||
return if skip_challenge? | ||
|
||
if challenge_passed_recently? | ||
session[:challenge_passed_at] = Time.now.utc | ||
return | ||
end | ||
|
||
@challenge = Form::Challenge.new(return_to: request.url) | ||
|
||
if params.key?(:form_challenge) | ||
if challenge_passed? | ||
session[:challenge_passed_at] = Time.now.utc | ||
return | ||
else | ||
flash.now[:alert] = I18n.t('challenge.invalid_password') | ||
render_challenge | ||
end | ||
else | ||
render_challenge | ||
end | ||
end | ||
|
||
def render_challenge | ||
@body_classes = 'lighter' | ||
render template: 'auth/challenges/new', layout: 'auth' | ||
end | ||
|
||
def challenge_passed? | ||
current_user.valid_password?(challenge_params[:current_password]) | ||
end | ||
|
||
def skip_challenge? | ||
current_user.encrypted_password.blank? | ||
end | ||
|
||
def challenge_passed_recently? | ||
session[:challenge_passed_at].present? && session[:challenge_passed_at] >= CHALLENGE_TIMEOUT.ago | ||
end | ||
|
||
def challenge_params | ||
params.require(:form_challenge).permit(:current_password, :return_to) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -254,6 +254,10 @@ code { | |
&-6 { | ||
max-width: 50%; | ||
} | ||
|
||
.actions { | ||
margin-top: 27px; | ||
} | ||
} | ||
|
||
.fields-group:last-child, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# frozen_string_literal: true | ||
|
||
class Form::Challenge | ||
include ActiveModel::Model | ||
|
||
attr_accessor :current_password, :current_username, | ||
:return_to | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
- content_for :page_title do | ||
= t('challenge.prompt') | ||
|
||
= simple_form_for @challenge, url: request.get? ? auth_challenge_path : '' do |f| | ||
= f.input :return_to, as: :hidden | ||
|
||
.field-group | ||
= f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'off', :autofocus => true }, label: t('challenge.prompt'), required: true | ||
|
||
.actions | ||
= f.button :button, t('challenge.confirm'), type: :submit | ||
|
||
%p.hint.subtle-hint= t('challenge.hint_html') | ||
|
||
.form-footer= render 'auth/shared/links' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.