fix: downcase email before finding (#8921)

* fix: downcase email when finding

* feat: add `from_email` class

* refactor: use `from_email`

* feat: add rule to disallow find_by email directly

* chore:  remove redundant test

Since the previous imlpmentation didn't do a case-insentive search, a new user would be created, and the error would be raised at the DB layer. With the new changes, this test case is redundant

* refactor: use from_email
This commit is contained in:
Shivam Mishra
2024-02-21 18:51:00 +05:30
committed by GitHub
parent ebae547a60
commit c031cb19d2
17 changed files with 46 additions and 18 deletions

View File

@@ -59,7 +59,7 @@ class ContactIdentifyAction
def existing_email_contact
return if params[:email].blank?
@existing_email_contact ||= account.contacts.find_by(email: params[:email])
@existing_email_contact ||= account.contacts.from_email(params[:email])
end
def existing_phone_number_contact

View File

@@ -27,7 +27,7 @@ class AgentBuilder
# Finds a user by email or creates a new one with a temporary password.
# @return [User] the found or created user.
def find_or_create_user
user = User.find_by(email: email)
user = User.from_email(email)
return user if user
temp_password = "1!aA#{SecureRandom.alphanumeric(12)}"

View File

@@ -75,7 +75,7 @@ class ContactInboxWithContactBuilder
def find_contact_by_email(email)
return if email.blank?
account.contacts.find_by(email: email.downcase)
account.contacts.from_email(email)
end
def find_contact_by_phone_number(phone_number)

View File

@@ -5,7 +5,7 @@ class DeviseOverrides::PasswordsController < Devise::PasswordsController
skip_before_action :authenticate_user!, raise: false
def create
@user = User.find_by(email: params[:email])
@user = User.from_email(params[:email])
if @user
@user.send_reset_password_instructions
build_response(I18n.t('messages.reset_password_success'), 200)

View File

@@ -33,7 +33,7 @@ class DeviseOverrides::SessionsController < DeviseTokenAuth::SessionsController
def process_sso_auth_token
return if params[:email].blank?
user = User.find_by(email: params[:email])
user = User.from_email(params[:email])
@resource = user if user&.valid_sso_auth_token?(params[:sso_auth_token])
end
end

View File

@@ -8,7 +8,7 @@ class Platform::Api::V1::UsersController < PlatformController
def show; end
def create
@resource = (User.find_by(email: user_params[:email]) || User.new(user_params))
@resource = (User.from_email(user_params[:email]) || User.new(user_params))
@resource.skip_confirmation!
@resource.save!
@platform_app.platform_app_permissibles.find_or_create_by!(permissible: @resource)

View File

@@ -91,7 +91,7 @@ class Imap::ImapMailbox
end
def find_or_create_contact
@contact = @inbox.contacts.find_by(email: @processed_mail.original_sender)
@contact = @inbox.contacts.from_email(@processed_mail.original_sender)
if @contact.present?
@contact_inbox = ContactInbox.find_by(inbox: @inbox, contact: @contact)
else

View File

@@ -86,7 +86,7 @@ class SupportMailbox < ApplicationMailbox
end
def find_or_create_contact
@contact = @inbox.contacts.find_by(email: original_sender_email)
@contact = @inbox.contacts.from_email(original_sender_email)
if @contact.present?
@contact_inbox = ContactInbox.find_by(inbox: @inbox, contact: @contact)
else

View File

@@ -165,6 +165,12 @@ class Contact < ApplicationRecord
email_format
end
def self.from_email(email)
# rubocop:disable UseFromEmail,Migration/DepartmentName
find_by(email: email.downcase)
# rubocop:enable UseFromEmail,Migration/DepartmentName
end
private
def ip_lookup

View File

@@ -156,6 +156,12 @@ class User < ApplicationRecord
mutations_from_database.changed?('email')
end
def self.from_email(email)
# rubocop:disable UseFromEmail,Migration/DepartmentName
find_by(email: email.downcase)
# rubocop:enable UseFromEmail,Migration/DepartmentName
end
private
def remove_macros

View File

@@ -35,7 +35,7 @@ class DataImport::ContactManager
def find_contact_by_email(params)
return unless params[:email]
@account.contacts.find_by(email: params[:email])
@account.contacts.from_email(params[:email])
end
def find_contact_by_phone_number(params)