forked from cybrespace/mastodon
		
	* Bump rubocop from 0.86.0 to 0.88.0 Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 0.86.0 to 0.88.0. - [Release notes](https://github.com/rubocop-hq/rubocop/releases) - [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop/compare/v0.86.0...v0.88.0) Signed-off-by: dependabot[bot] <support@github.com> * Fix for latest RuboCop Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Yamagishi Kazutoshi <ykzts@desire.sh>
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# 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
 | 
						|
      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
 |