mirror of
https://github.com/chatwoot/chatwoot.git
synced 2026-06-04 21:02:35 +08:00
# Pull Request Template ## Description This PR adds IMAP authentication mechanism selection to Chatwoot's email inbox configuration. Users can now choose between 'plain', 'login', and 'cram-md5' authentication methods when configuring IMAP settings, providing flexibility for different email providers that require specific authentication types. https://github.com/chatwoot/chatwoot/issues/8867 The implementation includes: - Frontend dropdown with numeric keys (1, 2, 3) matching SMTP auth style - Backend API validation for allowed authentication mechanisms - Consistent 'cram-md5' format throughout the codebase - Updated IMAP service to handle different auth types properly This feature maintains consistency with existing SMTP authentication options and follows the established UI/UX patterns in the application. ## Type of change Please delete options that are not relevant. - [x] New feature (non-breaking change which adds functionality) - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [ ] This change requires a documentation update ## How Has This Been Tested? ### Manual Testing: - Tested in Docker environment - Verified IMAP auth dropdown appears in inbox settings - Confirmed all three auth mechanisms (plain, login, cram-md5) can be selected and saved - Tested API validation by attempting to save invalid auth mechanisms ### Automated Testing: - Updated existing IMAP service tests to use consistent lowercase values - Updated API controller tests for authentication parameter handling - All tests pass locally with the new changes ### Test Configuration: - Tested with both new and existing inbox configurations ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [x] 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 - [x] Any dependent changes have been merged and published in downstream modules ## Additional Notes - This feature is backward compatible and doesn't break existing IMAP configurations - The 'cram-md5' format is used consistently throughout (UI, API, storage, services) - Net::IMAP compatibility is maintained by converting to 'CRAM-MD5' internally - Follows the same pattern established by SMTP authentication configuration --------- Co-authored-by: João Santos <joao.santos@madigital.eu> Co-authored-by: Sony Mathew <sony@chatwoot.com>
32 lines
972 B
Ruby
32 lines
972 B
Ruby
module Imap::Authentication
|
|
DEFAULT_MECHANISM = 'plain'.freeze
|
|
USER_CONFIGURABLE_MECHANISMS = %w[plain login cram-md5].freeze
|
|
|
|
module_function
|
|
|
|
def normalize(mechanism)
|
|
mechanism.presence || DEFAULT_MECHANISM
|
|
end
|
|
|
|
def validate_user_configurable!(mechanism)
|
|
normalized_mechanism = normalize(mechanism).to_s.downcase
|
|
return normalized_mechanism if USER_CONFIGURABLE_MECHANISMS.include?(normalized_mechanism)
|
|
|
|
allowed_values = USER_CONFIGURABLE_MECHANISMS.join(', ')
|
|
raise StandardError, "Invalid IMAP authentication mechanism. Allowed values: #{allowed_values}"
|
|
end
|
|
|
|
def authenticate!(imap, mechanism, username, password)
|
|
normalized_mechanism = normalize(mechanism).to_s.downcase
|
|
|
|
case normalized_mechanism
|
|
when 'cram-md5'
|
|
imap.authenticate('CRAM-MD5', username, password)
|
|
when 'login'
|
|
imap.login(username, password)
|
|
else
|
|
imap.authenticate(normalize(mechanism), username, password)
|
|
end
|
|
end
|
|
end
|