Implement STARTTLS for IMAP (#1963)

Fixes #769 - Imap + STARTTLS.
This commit is contained in:
Martin Koppehel 2018-04-20 13:46:09 +02:00 committed by Martin Edenhofer
parent 7a1acbe101
commit e4c233a710
3 changed files with 23 additions and 15 deletions

View file

@ -578,7 +578,7 @@ class App.ChannelEmailAccountWizard extends App.WizardModal
{ name: 'options::host', display: 'Host', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false }, { name: 'options::host', display: 'Host', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false },
{ name: 'options::user', display: 'User', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autocomplete: 'off' }, { name: 'options::user', display: 'User', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autocomplete: 'off' },
{ name: 'options::password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'new-password', single: true }, { name: 'options::password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'new-password', single: true },
{ name: 'options::ssl', display: 'SSL', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, default: true, translate: true, item_class: 'formGroup--halfSize' }, { name: 'options::ssl', display: 'SSL/STARTTLS', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, default: true, translate: true, item_class: 'formGroup--halfSize' },
{ name: 'options::port', display: 'Port', tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false, default: '993', item_class: 'formGroup--halfSize' }, { name: 'options::port', display: 'Port', tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false, default: '993', item_class: 'formGroup--halfSize' },
{ name: 'options::folder', display: 'Folder', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, item_class: 'formGroup--halfSize' }, { name: 'options::folder', display: 'Folder', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, item_class: 'formGroup--halfSize' },
{ name: 'options::keep_on_server', display: 'Keep messages on server', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false, item_class: 'formGroup--halfSize' }, { name: 'options::keep_on_server', display: 'Keep messages on server', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false, item_class: 'formGroup--halfSize' },
@ -598,7 +598,7 @@ class App.ChannelEmailAccountWizard extends App.WizardModal
return if !params.options return if !params.options
currentPort = @$('[name="options::port"]').val() currentPort = @$('[name="options::port"]').val()
if params.options.ssl is true if params.options.ssl is true
if !currentPort || currentPort is '143' if !currentPort
@$('[name="options::port"]').val('993') @$('[name="options::port"]').val('993')
return return
if params.options.ssl is false if params.options.ssl is false

View file

@ -673,7 +673,7 @@ class ChannelEmail extends App.WizardFullScreen
{ name: 'options::host', display: 'Host', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false }, { name: 'options::host', display: 'Host', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false },
{ name: 'options::user', display: 'User', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autocomplete: 'off', }, { name: 'options::user', display: 'User', tag: 'input', type: 'text', limit: 120, null: false, autocapitalize: false, autocomplete: 'off', },
{ name: 'options::password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'off', single: true }, { name: 'options::password', display: 'Password', tag: 'input', type: 'password', limit: 120, null: false, autocapitalize: false, autocomplete: 'off', single: true },
{ name: 'options::ssl', display: 'SSL', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, default: true, translate: true, item_class: 'formGroup--halfSize' }, { name: 'options::ssl', display: 'SSL/STARTTLS', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, default: true, translate: true, item_class: 'formGroup--halfSize' },
{ name: 'options::port', display: 'Port', tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false, default: '993', item_class: 'formGroup--halfSize' }, { name: 'options::port', display: 'Port', tag: 'input', type: 'text', limit: 6, null: true, autocapitalize: false, default: '993', item_class: 'formGroup--halfSize' },
{ name: 'options::folder', display: 'Folder', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, item_class: 'formGroup--halfSize' }, { name: 'options::folder', display: 'Folder', tag: 'input', type: 'text', limit: 120, null: true, autocapitalize: false, item_class: 'formGroup--halfSize' },
{ name: 'options::keep_on_server', display: 'Keep messages on server', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false, item_class: 'formGroup--halfSize' }, { name: 'options::keep_on_server', display: 'Keep messages on server', tag: 'boolean', null: true, options: { true: 'yes', false: 'no' }, translate: true, default: false, item_class: 'formGroup--halfSize' },
@ -693,7 +693,7 @@ class ChannelEmail extends App.WizardFullScreen
return if !params.options return if !params.options
currentPort = @$('.base-inbound-settings [name="options::port"]').val() currentPort = @$('.base-inbound-settings [name="options::port"]').val()
if params.options.ssl is true if params.options.ssl is true
if !currentPort || currentPort is '143' if !currentPort
@$('.base-inbound-settings [name="options::port"]').val('993') @$('.base-inbound-settings [name="options::port"]').val('993')
return return
if params.options.ssl is false if params.options.ssl is false

View file

@ -62,29 +62,34 @@ example
def fetch(options, channel, check_type = '', verify_string = '') def fetch(options, channel, check_type = '', verify_string = '')
ssl = true ssl = true
starttls = false
port = 993 port = 993
keep_on_server = false keep_on_server = false
folder = 'INBOX' folder = 'INBOX'
if options[:keep_on_server] == true || options[:keep_on_server] == 'true' if options[:keep_on_server] == true || options[:keep_on_server] == 'true'
keep_on_server = true keep_on_server = true
end end
if options.key?(:ssl) && options[:ssl] == false
ssl = false
port = 143
end
if options.key?(:port) && options[:port].present?
port = options[:port]
# disable ssl for non ssl ports ssl = options.key?(:ssl) && options[:ssl] == true
if port == 143 && !options.key?(:ssl)
port = if options.key?(:port) && options[:port].present?
options[:port]
elsif ssl == true
993
else
143
end
if ssl == true && port != 993
ssl = false ssl = false
starttls = true
end end
end
if options[:folder].present? if options[:folder].present?
folder = options[:folder] folder = options[:folder]
end end
Rails.logger.info "fetching imap (#{options[:host]}/#{options[:user]} port=#{port},ssl=#{ssl},folder=#{folder},keep_on_server=#{keep_on_server})" Rails.logger.info "fetching imap (#{options[:host]}/#{options[:user]} port=#{port},ssl=#{ssl},starttls=#{starttls},folder=#{folder},keep_on_server=#{keep_on_server})"
# on check, reduce open_timeout to have faster probing # on check, reduce open_timeout to have faster probing
timeout = 45 timeout = 45
@ -94,6 +99,9 @@ example
Timeout.timeout(timeout) do Timeout.timeout(timeout) do
@imap = Net::IMAP.new(options[:host], port, ssl, nil, false) @imap = Net::IMAP.new(options[:host], port, ssl, nil, false)
if starttls
@imap.starttls()
end
end end
@imap.login(options[:user], options[:password]) @imap.login(options[:user], options[:password])