## Notion document https://www.notion.so/chatwoot/Email-IMAP-Issue-30aa5f274c928062aa6bddc2e5877a63?showMoveTo=true&saveParent=true ## Description PLAIN IMAP channels (non-OAuth) were silently retrying failed authentication every minute, forever. When credentials are wrong/expired, Net::IMAP::NoResponseError was caught and logged but channel.authorization_error! was never called — so the Redis error counter never incremented, reauthorization_required? was never set, and admins were never notified. OAuth channels already had this handled correctly via the Reauthorizable concern. Additionally, Net::IMAP::ResponseParseError (raised by non-RFC-compliant IMAP servers) was falling through to the StandardError catch-all, flooding Estimated impact before fix: ~70–75 broken IMAP inboxes generating ~700k–750k wasted Sidekiq jobs/week. ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
52 lines
1.4 KiB
Ruby
52 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
require Rails.root.join 'spec/models/concerns/reauthorizable_shared.rb'
|
|
require Rails.root.join 'spec/models/concerns/backoffable_shared.rb'
|
|
|
|
RSpec.describe Channel::Email do
|
|
let(:channel) { create(:channel_email) }
|
|
|
|
describe 'concerns' do
|
|
it_behaves_like 'reauthorizable'
|
|
it_behaves_like 'backoffable'
|
|
|
|
context 'when prompt_reauthorization!' do
|
|
it 'calls channel notifier mail for email' do
|
|
admin_mailer = double
|
|
mailer_double = double
|
|
expect(AdministratorNotifications::ChannelNotificationsMailer).to receive(:with).and_return(admin_mailer)
|
|
expect(admin_mailer).to receive(:email_disconnect).with(channel.inbox).and_return(mailer_double)
|
|
expect(mailer_double).to receive(:deliver_later)
|
|
channel.prompt_reauthorization!
|
|
end
|
|
end
|
|
end
|
|
|
|
it 'has a valid name' do
|
|
expect(channel.name).to eq('Email')
|
|
end
|
|
|
|
context 'when microsoft?' do
|
|
it 'returns false' do
|
|
expect(channel.microsoft?).to be(false)
|
|
end
|
|
|
|
it 'returns true' do
|
|
channel.provider = 'microsoft'
|
|
expect(channel.microsoft?).to be(true)
|
|
end
|
|
end
|
|
|
|
context 'when google?' do
|
|
it 'returns false' do
|
|
expect(channel.google?).to be(false)
|
|
end
|
|
|
|
it 'returns true' do
|
|
channel.provider = 'google'
|
|
expect(channel.google?).to be(true)
|
|
end
|
|
end
|
|
end
|