class UserAuthenticator def initialize(user, session, authenticator_finder = Users::OmniauthCallbacksController) @user = user @session = session[:authentication] @authenticator_finder = authenticator_finder end def start if authenticated? @user.active = true else @user.password_required! end @user.skip_email_validation = true if @session && @session[:skip_email_validation].present? end def has_authenticator? !!authenticator end def finish authenticator.after_create_account(@user, @session) if authenticator @session = nil end private def authenticated? @session && @session[:email] == @user.email && @session[:email_valid] end def authenticator if authenticator_name @authenticator ||= @authenticator_finder.find_authenticator(authenticator_name) end end def authenticator_name @session && @session[:authenticator_name] end end