mail 2.6.5 → 2.6.6.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4283c0737ab7bc528ff6a60317c46e1a2ff0f92
4
- data.tar.gz: 8f98051e95f99f1622283e76919404d08027b7ff
3
+ metadata.gz: ff722f1c50918ad8e99f86995d08b803d32f745e
4
+ data.tar.gz: f552360cabc519f3fc959e6c193ef1d37d55670e
5
5
  SHA512:
6
- metadata.gz: 63514c34ddad591e76cb6704122775906f4d603aad4e90024ec88f17d7f19a78129dfe15d561b2f9e3807bdb074e6269dbdcb09d95656da2399b143e58681cd2
7
- data.tar.gz: a05cbc7af1c553e062d405b024390c17b03649f280c1c171b278b373401c1843657dc25e316f5041a44fdd3aba19f2a7a44b9d33d0ca9074bab06ed6c86b068d
6
+ metadata.gz: 73ff2add4d33b0e7ee9b8fc7b4473fcaf8cb7b581d6dbda1a3e6e6a46ed19d1f25c1a614e6ad142eb05982d47078eee4828f27aa76e48101822fba7ebbc78175
7
+ data.tar.gz: 48904e5d7a407ed85c7ef7be12dd1bd2e70042db1d99d9b1ff66a9af693862f3697498bbb2784a29900926d68e1a22d8bfad8e7b538a3bc26733a72660e35387
@@ -1,3 +1,8 @@
1
+ == Version 2.6.6 - unreleased
2
+
3
+ Security:
4
+ * #1097 – SMTP security: prevent command injection via To/From addresses. (jeremy)
5
+
1
6
  == Version 2.6.5 - 2017-04-26 Jeremy Daer <jeremydaer@gmail.com>
2
7
 
3
8
  Features:
@@ -1,21 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
  module Mail
3
- module CheckDeliveryParams
4
- def check_delivery_params(mail)
5
- if Utilities.blank?(mail.smtp_envelope_from)
6
- raise ArgumentError.new('An SMTP From address is required to send a message. Set the message smtp_envelope_from, return_path, sender, or from address.')
3
+ module CheckDeliveryParams #:nodoc:
4
+ class << self
5
+ def check(mail)
6
+ [ check_from(mail.smtp_envelope_from),
7
+ check_to(mail.smtp_envelope_to),
8
+ check_message(mail) ]
7
9
  end
8
10
 
9
- if Utilities.blank?(mail.smtp_envelope_to)
10
- raise ArgumentError.new('An SMTP To address is required to send a message. Set the message smtp_envelope_to, to, cc, or bcc address.')
11
+ def check_from(addr)
12
+ if Utilities.blank?(addr)
13
+ raise ArgumentError, "SMTP From address may not be blank: #{addr.inspect}"
14
+ end
15
+
16
+ check_addr 'From', addr
17
+ end
18
+
19
+ def check_to(addrs)
20
+ if Utilities.blank?(addrs)
21
+ raise ArgumentError, "SMTP To address may not be blank: #{addrs.inspect}"
22
+ end
23
+
24
+ Array(addrs).map do |addr|
25
+ check_addr 'To', addr
26
+ end
11
27
  end
12
28
 
13
- message = mail.encoded if mail.respond_to?(:encoded)
14
- if Utilities.blank?(message)
15
- raise ArgumentError.new('An encoded message is required to send an email')
29
+ def check_addr(addr_name, addr)
30
+ validate_smtp_addr addr do |error_message|
31
+ raise ArgumentError, "SMTP #{addr_name} address #{error_message}: #{addr.inspect}"
32
+ end
16
33
  end
17
34
 
18
- [mail.smtp_envelope_from, mail.smtp_envelope_to, message]
35
+ def validate_smtp_addr(addr)
36
+ if addr.bytesize > 2048
37
+ yield 'may not exceed 2kB'
38
+ end
39
+
40
+ if /[\r\n]/ =~ addr
41
+ yield 'may not contain CR or LF line breaks'
42
+ end
43
+
44
+ addr
45
+ end
46
+
47
+ def check_message(message)
48
+ message = message.encoded if message.respond_to?(:encoded)
49
+
50
+ if Utilities.blank?(message)
51
+ raise ArgumentError, 'An encoded message is required to send an email'
52
+ end
53
+
54
+ message
55
+ end
19
56
  end
20
57
  end
21
58
  end
@@ -2,7 +2,6 @@
2
2
  require 'mail/check_delivery_params'
3
3
 
4
4
  module Mail
5
-
6
5
  # FileDelivery class delivers emails into multiple files based on the destination
7
6
  # address. Each file is appended to if it already exists.
8
7
  #
@@ -14,22 +13,20 @@ module Mail
14
13
  # Make sure the path you specify with :location is writable by the Ruby process
15
14
  # running Mail.
16
15
  class FileDelivery
17
- include Mail::CheckDeliveryParams
18
-
19
16
  if RUBY_VERSION >= '1.9.1'
20
17
  require 'fileutils'
21
18
  else
22
19
  require 'ftools'
23
20
  end
24
21
 
22
+ attr_accessor :settings
23
+
25
24
  def initialize(values)
26
25
  self.settings = { :location => './mails' }.merge!(values)
27
26
  end
28
-
29
- attr_accessor :settings
30
-
27
+
31
28
  def deliver!(mail)
32
- check_delivery_params(mail)
29
+ Mail::CheckDeliveryParams.check(mail)
33
30
 
34
31
  if ::File.respond_to?(:makedirs)
35
32
  ::File.makedirs settings[:location]
@@ -41,6 +38,5 @@ module Mail
41
38
  ::File.open(::File.join(settings[:location], File.basename(to.to_s)), 'a') { |f| "#{f.write(mail.encoded)}\r\n\r\n" }
42
39
  end
43
40
  end
44
-
45
41
  end
46
42
  end
@@ -38,17 +38,15 @@ module Mail
38
38
  #
39
39
  # mail.deliver!
40
40
  class Sendmail
41
- include Mail::CheckDeliveryParams
41
+ attr_accessor :settings
42
42
 
43
43
  def initialize(values)
44
44
  self.settings = { :location => '/usr/sbin/sendmail',
45
45
  :arguments => '-i' }.merge(values)
46
46
  end
47
47
 
48
- attr_accessor :settings
49
-
50
48
  def deliver!(mail)
51
- smtp_from, smtp_to, message = check_delivery_params(mail)
49
+ smtp_from, smtp_to, message = Mail::CheckDeliveryParams.check(mail)
52
50
 
53
51
  from = "-f #{self.class.shellquote(smtp_from)}"
54
52
  to = smtp_to.map { |_to| self.class.shellquote(_to) }.join(' ')
@@ -75,7 +75,7 @@ module Mail
75
75
  #
76
76
  # mail.deliver!
77
77
  class SMTP
78
- include Mail::CheckDeliveryParams
78
+ attr_accessor :settings
79
79
 
80
80
  def initialize(values)
81
81
  self.settings = { :address => "localhost",
@@ -91,12 +91,10 @@ module Mail
91
91
  }.merge!(values)
92
92
  end
93
93
 
94
- attr_accessor :settings
95
-
96
94
  # Send the message via SMTP.
97
95
  # The from and to attributes are optional. If not set, they are retrieve from the Message.
98
96
  def deliver!(mail)
99
- smtp_from, smtp_to, message = check_delivery_params(mail)
97
+ smtp_from, smtp_to, message = Mail::CheckDeliveryParams.check(mail)
100
98
 
101
99
  smtp = Net::SMTP.new(settings[:address], settings[:port])
102
100
  if settings[:tls] || settings[:ssl]
@@ -120,7 +118,6 @@ module Mail
120
118
  self
121
119
  end
122
120
  end
123
-
124
121
 
125
122
  private
126
123
 
@@ -38,7 +38,7 @@ module Mail
38
38
  #
39
39
  # mail.deliver!
40
40
  class SMTPConnection
41
- include Mail::CheckDeliveryParams
41
+ attr_accessor :smtp, :settings
42
42
 
43
43
  def initialize(values)
44
44
  raise ArgumentError.new('A Net::SMTP object is required for this delivery method') if values[:connection].nil?
@@ -46,17 +46,13 @@ module Mail
46
46
  self.settings = values
47
47
  end
48
48
 
49
- attr_accessor :smtp
50
- attr_accessor :settings
51
-
52
49
  # Send the message via SMTP.
53
50
  # The from and to attributes are optional. If not set, they are retrieve from the Message.
54
51
  def deliver!(mail)
55
- smtp_from, smtp_to, message = check_delivery_params(mail)
52
+ smtp_from, smtp_to, message = Mail::CheckDeliveryParams.check(mail)
56
53
  response = smtp.sendmail(message, smtp_from, smtp_to)
57
54
 
58
55
  settings[:return_response] ? response : self
59
56
  end
60
-
61
57
  end
62
58
  end
@@ -8,10 +8,8 @@ module Mail
8
8
  # It also provides a template of the minimum methods you require to implement
9
9
  # if you want to make a custom mailer for Mail
10
10
  class TestMailer
11
- include Mail::CheckDeliveryParams
12
-
13
11
  # Provides a store of all the emails sent with the TestMailer so you can check them.
14
- def TestMailer.deliveries
12
+ def self.deliveries
15
13
  @@deliveries ||= []
16
14
  end
17
15
 
@@ -26,20 +24,19 @@ module Mail
26
24
  # * length
27
25
  # * size
28
26
  # * and other common Array methods
29
- def TestMailer.deliveries=(val)
27
+ def self.deliveries=(val)
30
28
  @@deliveries = val
31
29
  end
32
30
 
31
+ attr_accessor :settings
32
+
33
33
  def initialize(values)
34
34
  @settings = values.dup
35
35
  end
36
-
37
- attr_accessor :settings
38
36
 
39
37
  def deliver!(mail)
40
- check_delivery_params(mail)
38
+ Mail::CheckDeliveryParams.check(mail)
41
39
  Mail::TestMailer.deliveries << mail
42
40
  end
43
-
44
41
  end
45
42
  end
@@ -4,8 +4,8 @@ module Mail
4
4
 
5
5
  MAJOR = 2
6
6
  MINOR = 6
7
- PATCH = 5
8
- BUILD = nil
7
+ PATCH = 6
8
+ BUILD = 'rc1'
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
11
11
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.5
4
+ version: 2.6.6.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikel Lindsaar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-27 00:00:00.000000000 Z
11
+ date: 2017-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mime-types
@@ -264,12 +264,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
264
264
  version: '0'
265
265
  required_rubygems_version: !ruby/object:Gem::Requirement
266
266
  requirements:
267
- - - ">="
267
+ - - ">"
268
268
  - !ruby/object:Gem::Version
269
- version: '0'
269
+ version: 1.3.1
270
270
  requirements: []
271
271
  rubyforge_project:
272
- rubygems_version: 2.6.10
272
+ rubygems_version: 2.6.12
273
273
  signing_key:
274
274
  specification_version: 4
275
275
  summary: Mail provides a nice Ruby DSL for making, sending and reading emails.