net-imap 0.3.7 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/pages.yml +46 -0
- data/.github/workflows/test.yml +5 -12
- data/.gitignore +2 -0
- data/Gemfile +3 -0
- data/README.md +15 -4
- data/Rakefile +0 -7
- data/docs/styles.css +0 -12
- data/lib/net/imap/authenticators.rb +26 -57
- data/lib/net/imap/command_data.rb +13 -6
- data/lib/net/imap/data_encoding.rb +14 -2
- data/lib/net/imap/deprecated_client_options.rb +139 -0
- data/lib/net/imap/errors.rb +20 -0
- data/lib/net/imap/fetch_data.rb +518 -0
- data/lib/net/imap/response_data.rb +116 -252
- data/lib/net/imap/response_parser/parser_utils.rb +240 -0
- data/lib/net/imap/response_parser.rb +1535 -1003
- data/lib/net/imap/sasl/anonymous_authenticator.rb +69 -0
- data/lib/net/imap/sasl/authentication_exchange.rb +107 -0
- data/lib/net/imap/sasl/authenticators.rb +118 -0
- data/lib/net/imap/sasl/client_adapter.rb +72 -0
- data/lib/net/imap/{authenticators/cram_md5.rb → sasl/cram_md5_authenticator.rb} +21 -11
- data/lib/net/imap/sasl/digest_md5_authenticator.rb +180 -0
- data/lib/net/imap/sasl/external_authenticator.rb +83 -0
- data/lib/net/imap/sasl/gs2_header.rb +80 -0
- data/lib/net/imap/{authenticators/login.rb → sasl/login_authenticator.rb} +25 -16
- data/lib/net/imap/sasl/oauthbearer_authenticator.rb +199 -0
- data/lib/net/imap/sasl/plain_authenticator.rb +101 -0
- data/lib/net/imap/sasl/protocol_adapters.rb +45 -0
- data/lib/net/imap/sasl/scram_algorithm.rb +58 -0
- data/lib/net/imap/sasl/scram_authenticator.rb +287 -0
- data/lib/net/imap/sasl/stringprep.rb +6 -66
- data/lib/net/imap/sasl/xoauth2_authenticator.rb +106 -0
- data/lib/net/imap/sasl.rb +144 -43
- data/lib/net/imap/sasl_adapter.rb +21 -0
- data/lib/net/imap/sequence_set.rb +67 -0
- data/lib/net/imap/stringprep/nameprep.rb +70 -0
- data/lib/net/imap/stringprep/saslprep.rb +69 -0
- data/lib/net/imap/stringprep/saslprep_tables.rb +96 -0
- data/lib/net/imap/stringprep/tables.rb +146 -0
- data/lib/net/imap/stringprep/trace.rb +85 -0
- data/lib/net/imap/stringprep.rb +159 -0
- data/lib/net/imap.rb +1055 -612
- data/net-imap.gemspec +4 -3
- data/rakelib/benchmarks.rake +91 -0
- data/rakelib/saslprep.rake +4 -4
- data/rakelib/string_prep_tables_generator.rb +82 -60
- metadata +31 -13
- data/benchmarks/stringprep.yml +0 -65
- data/benchmarks/table-regexps.yml +0 -39
- data/lib/net/imap/authenticators/digest_md5.rb +0 -115
- data/lib/net/imap/authenticators/plain.rb +0 -41
- data/lib/net/imap/authenticators/xoauth2.rb +0 -20
- data/lib/net/imap/sasl/saslprep.rb +0 -55
- data/lib/net/imap/sasl/saslprep_tables.rb +0 -98
- data/lib/net/imap/sasl/stringprep_tables.rb +0 -153
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4e6a6afb6888a5be474a97195f41e06a2e1706d9f65a0700f17bce7f6dd82af
|
4
|
+
data.tar.gz: 3dd62a4e251d29e9e72e5538f548623662ed2ff16da46deadf8843585f8db658
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc73faf474cb22965f3ec95bdae48d13514505d4072f0fe3ca47f1dbccc8b04aad404e90ecd2b04afa7dc401dc2f66d087fea316b26e46edf1403945e7e3c305
|
7
|
+
data.tar.gz: 9c10a3b062c88f6145deb1adbbe3e8a2574e9f4dac39c2b7706fbc84643ee031891dae270197f910ceda3e5d0513f0929d574889e506c53a6f5048cb9be36dfa
|
@@ -0,0 +1,46 @@
|
|
1
|
+
name: Deploy RDoc site to Pages
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ 'master' ]
|
6
|
+
workflow_dispatch:
|
7
|
+
|
8
|
+
permissions:
|
9
|
+
contents: read
|
10
|
+
pages: write
|
11
|
+
id-token: write
|
12
|
+
|
13
|
+
concurrency:
|
14
|
+
group: "pages"
|
15
|
+
cancel-in-progress: true
|
16
|
+
|
17
|
+
jobs:
|
18
|
+
build:
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
steps:
|
21
|
+
- name: Checkout
|
22
|
+
uses: actions/checkout@v4
|
23
|
+
- name: Setup Ruby
|
24
|
+
uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0
|
25
|
+
with:
|
26
|
+
ruby-version: '3.2'
|
27
|
+
bundler-cache: true
|
28
|
+
- name: Setup Pages
|
29
|
+
id: pages
|
30
|
+
uses: actions/configure-pages@v3
|
31
|
+
- name: Build with RDoc
|
32
|
+
run: bundle exec rake rdoc
|
33
|
+
- name: Upload artifact
|
34
|
+
uses: actions/upload-pages-artifact@v2
|
35
|
+
with: { path: 'doc' }
|
36
|
+
|
37
|
+
deploy:
|
38
|
+
environment:
|
39
|
+
name: github-pages
|
40
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
41
|
+
runs-on: ubuntu-latest
|
42
|
+
needs: build
|
43
|
+
steps:
|
44
|
+
- name: Deploy to GitHub Pages
|
45
|
+
id: deployment
|
46
|
+
uses: actions/deploy-pages@v2
|
data/.github/workflows/test.yml
CHANGED
@@ -7,7 +7,7 @@ jobs:
|
|
7
7
|
uses: ruby/actions/.github/workflows/ruby_versions.yml@master
|
8
8
|
with:
|
9
9
|
engine: cruby
|
10
|
-
min_version: 2.
|
10
|
+
min_version: 2.7
|
11
11
|
|
12
12
|
build:
|
13
13
|
needs: ruby-versions
|
@@ -17,22 +17,15 @@ jobs:
|
|
17
17
|
ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
|
18
18
|
os: [ ubuntu-latest, macos-latest ]
|
19
19
|
experimental: [false]
|
20
|
-
include:
|
21
|
-
# - ruby: 2.6
|
22
|
-
# os: ubuntu-latest
|
23
|
-
# experimental: true
|
24
|
-
- ruby: 2.6
|
25
|
-
os: macos-latest
|
26
|
-
experimental: false
|
27
20
|
runs-on: ${{ matrix.os }}
|
28
21
|
continue-on-error: ${{ matrix.experimental }}
|
29
22
|
steps:
|
30
|
-
- uses: actions/checkout@
|
23
|
+
- uses: actions/checkout@v4
|
31
24
|
- name: Set up Ruby
|
32
25
|
uses: ruby/setup-ruby@v1
|
33
26
|
with:
|
34
27
|
ruby-version: ${{ matrix.ruby }}
|
35
|
-
|
36
|
-
|
28
|
+
bundler-cache: true
|
29
|
+
rubygems: latest
|
37
30
|
- name: Run test
|
38
|
-
run: rake test
|
31
|
+
run: bundle exec rake test
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -21,11 +21,24 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
24
|
+
### Connect with TLS to port 993
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
imap = Net::IMAP.new('mail.example.com', ssl: true)
|
28
|
+
imap.port => 993
|
29
|
+
imap.tls_verified? => true
|
30
|
+
case imap.greeting.name
|
31
|
+
in /OK/i
|
32
|
+
# The client is connected in the "Not Authenticated" state.
|
33
|
+
imap.authenticate("PLAIN", "joe_user", "joes_password")
|
34
|
+
in /PREAUTH/i
|
35
|
+
# The client is connected in the "Authenticated" state.
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
24
39
|
### List sender and subject of all recent messages in the default mailbox
|
25
40
|
|
26
41
|
```ruby
|
27
|
-
imap = Net::IMAP.new('mail.example.com')
|
28
|
-
imap.authenticate('LOGIN', 'joe_user', 'joes_password')
|
29
42
|
imap.examine('INBOX')
|
30
43
|
imap.search(["RECENT"]).each do |message_id|
|
31
44
|
envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
|
@@ -36,8 +49,6 @@ end
|
|
36
49
|
### Move all messages from April 2003 from "Mail/sent-mail" to "Mail/sent-apr03"
|
37
50
|
|
38
51
|
```ruby
|
39
|
-
imap = Net::IMAP.new('mail.example.com')
|
40
|
-
imap.authenticate('LOGIN', 'joe_user', 'joes_password')
|
41
52
|
imap.select('Mail/sent-mail')
|
42
53
|
if not imap.list('Mail/', 'sent-apr03')
|
43
54
|
imap.create('Mail/sent-apr03')
|
data/Rakefile
CHANGED
@@ -10,11 +10,4 @@ Rake::TestTask.new(:test) do |t|
|
|
10
10
|
t.test_files = FileList["test/**/test_*.rb"]
|
11
11
|
end
|
12
12
|
|
13
|
-
task :sync_tool do
|
14
|
-
require 'fileutils'
|
15
|
-
FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
|
16
|
-
FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
|
17
|
-
FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
|
18
|
-
end
|
19
|
-
|
20
13
|
task :default => :test
|
data/docs/styles.css
CHANGED
@@ -1,68 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
#
|
3
|
+
# Backward compatible delegators from Net::IMAP to Net::IMAP::SASL.
|
4
4
|
module Net::IMAP::Authenticators
|
5
5
|
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
# See PlainAuthenticator, XOauth2Authenticator, and DigestMD5Authenticator for
|
16
|
-
# examples.
|
17
|
-
def add_authenticator(auth_type, authenticator)
|
18
|
-
authenticators[auth_type] = authenticator
|
6
|
+
# Deprecated. Use Net::IMAP::SASL.add_authenticator instead.
|
7
|
+
def add_authenticator(...)
|
8
|
+
warn(
|
9
|
+
"%s.%s is deprecated. Use %s.%s instead." % [
|
10
|
+
Net::IMAP, __method__, Net::IMAP::SASL, __method__
|
11
|
+
],
|
12
|
+
uplevel: 1
|
13
|
+
)
|
14
|
+
Net::IMAP::SASL.add_authenticator(...)
|
19
15
|
end
|
20
16
|
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
# [Note]
|
31
|
-
# This method is intended for internal use by connection protocol code only.
|
32
|
-
# Protocol client users should see refer to their client's documentation,
|
33
|
-
# e.g. Net::IMAP#authenticate for Net::IMAP.
|
34
|
-
#
|
35
|
-
# The call signatures documented for this method are recommendations for
|
36
|
-
# authenticator implementors. All arguments (other than +mechanism+) are
|
37
|
-
# forwarded to the registered authenticator's +#new+ (or +#call+) method, and
|
38
|
-
# each authenticator must document its own arguments.
|
39
|
-
#
|
40
|
-
# The returned object represents a single authentication exchange and <em>must
|
41
|
-
# not</em> be reused for multiple authentication attempts.
|
42
|
-
def authenticator(mechanism, *authargs, **properties, &callback)
|
43
|
-
authenticator = authenticators.fetch(mechanism.upcase) do
|
44
|
-
raise ArgumentError, 'unknown auth type - "%s"' % mechanism
|
45
|
-
end
|
46
|
-
if authenticator.respond_to?(:new)
|
47
|
-
authenticator.new(*authargs, **properties, &callback)
|
48
|
-
else
|
49
|
-
authenticator.call(*authargs, **properties, &callback)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def authenticators
|
56
|
-
@authenticators ||= {}
|
17
|
+
# Deprecated. Use Net::IMAP::SASL.authenticator instead.
|
18
|
+
def authenticator(...)
|
19
|
+
warn(
|
20
|
+
"%s.%s is deprecated. Use %s.%s instead." % [
|
21
|
+
Net::IMAP, __method__, Net::IMAP::SASL, __method__
|
22
|
+
],
|
23
|
+
uplevel: 1
|
24
|
+
)
|
25
|
+
Net::IMAP::SASL.authenticator(...)
|
57
26
|
end
|
58
27
|
|
28
|
+
Net::IMAP.extend self
|
59
29
|
end
|
60
30
|
|
61
|
-
|
31
|
+
class Net::IMAP
|
32
|
+
PlainAuthenticator = SASL::PlainAuthenticator # :nodoc:
|
33
|
+
deprecate_constant :PlainAuthenticator
|
62
34
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
require_relative "authenticators/cram_md5"
|
67
|
-
require_relative "authenticators/digest_md5"
|
68
|
-
require_relative "authenticators/xoauth2"
|
35
|
+
XOauth2Authenticator = SASL::XOAuth2Authenticator # :nodoc:
|
36
|
+
deprecate_constant :XOauth2Authenticator
|
37
|
+
end
|
@@ -52,13 +52,20 @@ module Net
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def send_string_data(str, tag = nil)
|
55
|
-
|
56
|
-
when ""
|
55
|
+
if str.empty?
|
57
56
|
put_string('""')
|
58
|
-
|
59
|
-
# literal
|
57
|
+
elsif str.match?(/[\r\n]/n)
|
58
|
+
# literal, because multiline
|
60
59
|
send_literal(str, tag)
|
61
|
-
|
60
|
+
elsif !str.ascii_only?
|
61
|
+
if @utf8_strings
|
62
|
+
# quoted string
|
63
|
+
send_quoted_string(str)
|
64
|
+
else
|
65
|
+
# literal, because of non-ASCII bytes
|
66
|
+
send_literal(str, tag)
|
67
|
+
end
|
68
|
+
elsif str.match?(/[(){ \x00-\x1f\x7f%*"\\]/n)
|
62
69
|
# quoted string
|
63
70
|
send_quoted_string(str)
|
64
71
|
else
|
@@ -67,7 +74,7 @@ module Net
|
|
67
74
|
end
|
68
75
|
|
69
76
|
def send_quoted_string(str)
|
70
|
-
put_string('"' + str.gsub(/["\\]
|
77
|
+
put_string('"' + str.gsub(/["\\]/, "\\\\\\&") + '"')
|
71
78
|
end
|
72
79
|
|
73
80
|
def send_literal(str, tag = nil)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "date"
|
4
|
+
require "time"
|
4
5
|
|
5
6
|
require_relative "errors"
|
6
7
|
|
@@ -102,8 +103,16 @@ module Net
|
|
102
103
|
#
|
103
104
|
# Decodes +string+ as an IMAP4 formatted "date-time".
|
104
105
|
#
|
105
|
-
#
|
106
|
+
# NOTE: Although double-quotes are not optional in the IMAP grammar,
|
107
|
+
# Net::IMAP currently parses "date-time" values as "quoted" strings and this
|
108
|
+
# removes the quotation marks. To be useful for strings which have already
|
109
|
+
# been parsed as a quoted string, this method makes double-quotes optional.
|
110
|
+
#
|
111
|
+
# See STRFTIME.
|
106
112
|
def self.decode_datetime(string)
|
113
|
+
unless string.start_with?(?") && string.end_with?(?")
|
114
|
+
string = '"%s"' % [string]
|
115
|
+
end
|
107
116
|
DateTime.strptime(string, STRFTIME)
|
108
117
|
end
|
109
118
|
|
@@ -113,7 +122,10 @@ module Net
|
|
113
122
|
#
|
114
123
|
# Same as +decode_datetime+, but returning a Time instead.
|
115
124
|
def self.decode_time(string)
|
116
|
-
|
125
|
+
unless string.start_with?(?") && string.end_with?(?")
|
126
|
+
string = '"%s"' % [string]
|
127
|
+
end
|
128
|
+
Time.strptime(string, STRFTIME)
|
117
129
|
end
|
118
130
|
|
119
131
|
class << self
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Net
|
4
|
+
class IMAP < Protocol
|
5
|
+
|
6
|
+
# This module handles deprecated arguments to various Net::IMAP methods.
|
7
|
+
module DeprecatedClientOptions
|
8
|
+
|
9
|
+
# :call-seq:
|
10
|
+
# Net::IMAP.new(host, **options) # standard keyword options
|
11
|
+
# Net::IMAP.new(host, options) # obsolete hash options
|
12
|
+
# Net::IMAP.new(host, port) # obsolete port argument
|
13
|
+
# Net::IMAP.new(host, port, usessl, certs = nil, verify = true) # deprecated SSL arguments
|
14
|
+
#
|
15
|
+
# Translates Net::IMAP.new arguments for backward compatibility.
|
16
|
+
#
|
17
|
+
# ==== Obsolete arguments
|
18
|
+
#
|
19
|
+
# Using obsolete arguments does not a warning. Obsolete arguments will be
|
20
|
+
# deprecated by a future release.
|
21
|
+
#
|
22
|
+
# If a second positional argument is given and it is a hash (or is
|
23
|
+
# convertable via +#to_hash+), it is converted to keyword arguments.
|
24
|
+
#
|
25
|
+
# # Obsolete:
|
26
|
+
# Net::IMAP.new("imap.example.com", options_hash)
|
27
|
+
# # Use instead:
|
28
|
+
# Net::IMAP.new("imap.example.com", **options_hash)
|
29
|
+
#
|
30
|
+
# If a second positional argument is given and it is not a hash, it is
|
31
|
+
# converted to the +port+ keyword argument.
|
32
|
+
# # Obsolete:
|
33
|
+
# Net::IMAP.new("imap.example.com", 114433)
|
34
|
+
# # Use instead:
|
35
|
+
# Net::IMAP.new("imap.example.com", port: 114433)
|
36
|
+
#
|
37
|
+
# ==== Deprecated arguments
|
38
|
+
#
|
39
|
+
# Using deprecated arguments prints a warning. Convert to keyword
|
40
|
+
# arguments to avoid the warning. Deprecated arguments will be removed in
|
41
|
+
# a future release.
|
42
|
+
#
|
43
|
+
# If +usessl+ is false, +certs+, and +verify+ are ignored. When it true,
|
44
|
+
# all three arguments are converted to the +ssl+ keyword argument.
|
45
|
+
# Without +certs+ or +verify+, it is converted to <tt>ssl: true</tt>.
|
46
|
+
# # DEPRECATED:
|
47
|
+
# Net::IMAP.new("imap.example.com", nil, true) # => prints a warning
|
48
|
+
# # Use instead:
|
49
|
+
# Net::IMAP.new("imap.example.com", ssl: true)
|
50
|
+
#
|
51
|
+
# When +certs+ is a path to a directory, it is converted to <tt>ca_path:
|
52
|
+
# certs</tt>.
|
53
|
+
# # DEPRECATED:
|
54
|
+
# Net::IMAP.new("imap.example.com", nil, true, "/path/to/certs") # => prints a warning
|
55
|
+
# # Use instead:
|
56
|
+
# Net::IMAP.new("imap.example.com", ssl: {ca_path: "/path/to/certs"})
|
57
|
+
#
|
58
|
+
# When +certs+ is a path to a file, it is converted to <tt>ca_file:
|
59
|
+
# certs</tt>.
|
60
|
+
# # DEPRECATED:
|
61
|
+
# Net::IMAP.new("imap.example.com", nil, true, "/path/to/cert.pem") # => prints a warning
|
62
|
+
# # Use instead:
|
63
|
+
# Net::IMAP.new("imap.example.com", ssl: {ca_file: "/path/to/cert.pem"})
|
64
|
+
#
|
65
|
+
# When +verify+ is +false+, it is converted to <tt>verify_mode:
|
66
|
+
# OpenSSL::SSL::VERIFY_NONE</tt>.
|
67
|
+
# # DEPRECATED:
|
68
|
+
# Net::IMAP.new("imap.example.com", nil, true, nil, false) # => prints a warning
|
69
|
+
# # Use instead:
|
70
|
+
# Net::IMAP.new("imap.example.com", ssl: {verify_mode: OpenSSL::SSL::VERIFY_NONE})
|
71
|
+
#
|
72
|
+
def initialize(host, port_or_options = nil, *deprecated, **options)
|
73
|
+
if port_or_options.nil? && deprecated.empty?
|
74
|
+
super host, **options
|
75
|
+
elsif options.any?
|
76
|
+
# Net::IMAP.new(host, *__invalid__, **options)
|
77
|
+
raise ArgumentError, "Do not combine deprecated and keyword arguments"
|
78
|
+
elsif port_or_options.respond_to?(:to_hash) and deprecated.any?
|
79
|
+
# Net::IMAP.new(host, options, *__invalid__)
|
80
|
+
raise ArgumentError, "Do not use deprecated SSL params with options hash"
|
81
|
+
elsif port_or_options.respond_to?(:to_hash)
|
82
|
+
super host, **Hash.try_convert(port_or_options)
|
83
|
+
elsif deprecated.empty?
|
84
|
+
super host, port: port_or_options
|
85
|
+
elsif deprecated.shift
|
86
|
+
warn "DEPRECATED: Call Net::IMAP.new with keyword options", uplevel: 1
|
87
|
+
super host, port: port_or_options, ssl: create_ssl_params(*deprecated)
|
88
|
+
else
|
89
|
+
warn "DEPRECATED: Call Net::IMAP.new with keyword options", uplevel: 1
|
90
|
+
super host, port: port_or_options, ssl: false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# :call-seq:
|
95
|
+
# starttls(**options) # standard
|
96
|
+
# starttls(options = {}) # obsolete
|
97
|
+
# starttls(certs = nil, verify = true) # deprecated
|
98
|
+
#
|
99
|
+
# Translates Net::IMAP#starttls arguments for backward compatibility.
|
100
|
+
#
|
101
|
+
# Support for +certs+ and +verify+ will be dropped in a future release.
|
102
|
+
#
|
103
|
+
# See ::new for interpretation of +certs+ and +verify+.
|
104
|
+
def starttls(*deprecated, **options)
|
105
|
+
if deprecated.empty?
|
106
|
+
super(**options)
|
107
|
+
elsif options.any?
|
108
|
+
# starttls(*__invalid__, **options)
|
109
|
+
raise ArgumentError, "Do not combine deprecated and keyword options"
|
110
|
+
elsif deprecated.first.respond_to?(:to_hash) && deprecated.length > 1
|
111
|
+
# starttls(*__invalid__, **options)
|
112
|
+
raise ArgumentError, "Do not use deprecated verify param with options hash"
|
113
|
+
elsif deprecated.first.respond_to?(:to_hash)
|
114
|
+
super(**Hash.try_convert(deprecated.first))
|
115
|
+
else
|
116
|
+
warn "DEPRECATED: Call Net::IMAP#starttls with keyword options", uplevel: 1
|
117
|
+
super(**create_ssl_params(*deprecated))
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
def create_ssl_params(certs = nil, verify = true)
|
124
|
+
params = {}
|
125
|
+
if certs
|
126
|
+
if File.file?(certs)
|
127
|
+
params[:ca_file] = certs
|
128
|
+
elsif File.directory?(certs)
|
129
|
+
params[:ca_path] = certs
|
130
|
+
end
|
131
|
+
end
|
132
|
+
params[:verify_mode] =
|
133
|
+
verify ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
|
134
|
+
params
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
data/lib/net/imap/errors.rb
CHANGED
@@ -47,7 +47,27 @@ module Net
|
|
47
47
|
class ByeResponseError < ResponseError
|
48
48
|
end
|
49
49
|
|
50
|
+
# Error raised when the server sends an invalid response.
|
51
|
+
#
|
52
|
+
# This is different from UnknownResponseError: the response has been
|
53
|
+
# rejected. Although it may be parsable, the server is forbidden from
|
54
|
+
# sending it in the current context. The client should automatically
|
55
|
+
# disconnect, abruptly (without logout).
|
56
|
+
#
|
57
|
+
# Note that InvalidResponseError does not inherit from ResponseError: it
|
58
|
+
# can be raised before the response is fully parsed. A related
|
59
|
+
# ResponseParseError or ResponseError may be the #cause.
|
60
|
+
class InvalidResponseError < Error
|
61
|
+
end
|
62
|
+
|
50
63
|
# Error raised upon an unknown response from the server.
|
64
|
+
#
|
65
|
+
# This is different from InvalidResponseError: the response may be a
|
66
|
+
# valid extension response and the server may be allowed to send it in
|
67
|
+
# this context, but Net::IMAP either does not know how to parse it or
|
68
|
+
# how to handle it. This could result from enabling unknown or
|
69
|
+
# unhandled extensions. The connection may still be usable,
|
70
|
+
# but—depending on context—it may be prudent to disconnect.
|
51
71
|
class UnknownResponseError < ResponseError
|
52
72
|
end
|
53
73
|
|