fix: Undefined method `encode' for nil for avatar from url job (#10450)

Invalid urls supplied to the job was causing sentry issues. The issue primarily occurs when the download file.original_filename comes out as empty

fixes: https://github.com/chatwoot/chatwoot/issues/10449
This commit is contained in:
Sojan Jose
2024-11-20 06:24:01 +08:00
committed by GitHub
parent 9cc6b1a4ba
commit 7a3303e841
2 changed files with 30 additions and 1 deletions

View File

@@ -8,8 +8,21 @@ class Avatar::AvatarFromUrlJob < ApplicationJob
avatar_url,
max_size: 15 * 1024 * 1024
)
avatarable.avatar.attach(io: avatar_file, filename: avatar_file.original_filename, content_type: avatar_file.content_type)
if valid_image?(avatar_file)
avatarable.avatar.attach(io: avatar_file, filename: avatar_file.original_filename,
content_type: avatar_file.content_type)
end
rescue Down::NotFound, Down::Error => e
Rails.logger.error "Exception: invalid avatar url #{avatar_url} : #{e.message}"
end
private
def valid_image?(file)
return false if file.original_filename.blank?
# TODO: check if the file is an actual image
true
end
end

View File

@@ -17,4 +17,20 @@ RSpec.describe Avatar::AvatarFromUrlJob do
described_class.perform_now(avatarable, avatar_url)
expect(avatarable.avatar).to be_attached
end
# ref: https://github.com/chatwoot/chatwoot/issues/10449
it 'will not throw error if the avatar url is not valid and the file does not have a filename' do
# Create a temporary file with no filename and content type application/xml
temp_file = Tempfile.new(['invalid', '.xml'])
temp_file.write('<invalid>content</invalid>')
temp_file.rewind
expect(Down).to receive(:download).with(avatar_url, max_size: 15 * 1024 * 1024)
.and_return(ActionDispatch::Http::UploadedFile.new(tempfile: temp_file, type: 'application/xml'))
expect { described_class.perform_now(avatarable, avatar_url) }.not_to raise_error
temp_file.close
temp_file.unlink # deletes the temp file
end
end