# Pull Request Template ## Description This keeps the public inbox contact update response on the public contact inbox serializer shape after applying the contact identify update. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] This change requires a documentation update ## How Has This Been Tested? - `bundle exec rspec spec/controllers/public/api/v1/inbox/contacts_controller_spec.rb` ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Fixes [https://linear.app/chatwoot/issue/CW-6937](https://linear.app/chatwoot/issue/CW-6937) Fixes [https://linear.app/chatwoot/issue/CW-7464](https://linear.app/chatwoot/issue/CW-7464) Fixes [https://linear.app/chatwoot/issue/CW-7457](https://linear.app/chatwoot/issue/CW-7457)
54 lines
1.6 KiB
Ruby
54 lines
1.6 KiB
Ruby
class Public::Api::V1::Inboxes::ContactsController < Public::Api::V1::InboxesController
|
|
before_action :contact_inbox, except: [:create]
|
|
before_action :process_hmac
|
|
|
|
def show; end
|
|
|
|
def create
|
|
source_id = params[:source_id] || SecureRandom.uuid
|
|
@contact_inbox = ::ContactInboxWithContactBuilder.new(
|
|
source_id: source_id,
|
|
inbox: @inbox_channel.inbox,
|
|
contact_attributes: permitted_params.except(:identifier_hash)
|
|
).perform
|
|
end
|
|
|
|
def update
|
|
contact_identify_action = ContactIdentifyAction.new(
|
|
contact: @contact_inbox.contact,
|
|
params: permitted_params.to_h.deep_symbolize_keys.except(:identifier)
|
|
)
|
|
contact_identify_action.perform
|
|
@contact_inbox.reload
|
|
end
|
|
|
|
private
|
|
|
|
def contact_inbox
|
|
@contact_inbox = @inbox_channel.inbox.contact_inboxes.find_by!(source_id: params[:id])
|
|
end
|
|
|
|
def process_hmac
|
|
return if params[:identifier_hash].blank? && !@inbox_channel.hmac_mandatory
|
|
raise StandardError, 'HMAC failed: Invalid Identifier Hash Provided' unless valid_hmac?
|
|
|
|
@contact_inbox.update(hmac_verified: true) if @contact_inbox.present?
|
|
end
|
|
|
|
def valid_hmac?
|
|
expected_hash = OpenSSL::HMAC.hexdigest(
|
|
'sha256',
|
|
@inbox_channel.hmac_token,
|
|
params[:identifier].to_s
|
|
)
|
|
identifier_hash = params[:identifier_hash].to_s
|
|
return false unless identifier_hash.bytesize == expected_hash.bytesize
|
|
|
|
ActiveSupport::SecurityUtils.secure_compare(identifier_hash, expected_hash)
|
|
end
|
|
|
|
def permitted_params
|
|
params.permit(:identifier, :identifier_hash, :email, :name, :avatar_url, :phone_number, custom_attributes: {})
|
|
end
|
|
end
|