sanitize_email 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ Version 1.0.8 - AUG.30.2013
2
+ * \[Bug Fix\] Fixes #12 - Streange repeating headers by Peter Boling
3
+ * Lots of refactoring by Peter Boling
4
+ * Properly supports when a to/cc field has multiple recipients sanitized and adds all to mail headers
5
+ * Improved specs by Peter Boling
6
+
1
7
  Version 1.0.7 - AUG.06.2012
2
8
 
3
9
  * \[Bug Fix\] Stripping the message headers before appending new headers.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sanitize_email (1.0.6)
4
+ sanitize_email (1.0.7)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -146,7 +146,7 @@ dependency on this gem using the [Pessimistic Version Constraint][pvc] with two
146
146
 
147
147
  For example:
148
148
 
149
- spec.add_dependency 'sanitize_email', '~> 4.0'
149
+ spec.add_dependency 'sanitize_email', '~> 1.0.8'
150
150
 
151
151
  [semver]: http://semver.org/
152
152
  [pvc]: http://docs.rubygems.org/read/chapter/16#page74
data/REEK CHANGED
@@ -1,16 +1,4 @@
1
- lib/sanitize_email.rb -- 1 warning:
2
- SanitizeEmail#self.sanitary calls SanitizeEmail::Config.config twice (DuplicateMethodCall)
3
- lib/sanitize_email/bleach.rb -- 14 warnings:
4
- SanitizeEmail::Bleach has no descriptive comment (IrresponsibleModule)
5
- SanitizeEmail::Bleach#activate? calls SanitizeEmail.activation_proc twice (DuplicateMethodCall)
6
- SanitizeEmail::Bleach#activate? doesn't depend on instance state (UtilityFunction)
7
- SanitizeEmail::Bleach#delivering_email calls message.to twice (DuplicateMethodCall)
8
- SanitizeEmail::Bleach#inject_user_names contains iterators nested 2 deep (NestedIterators)
9
- SanitizeEmail::Bleach#inject_user_names doesn't depend on instance state (UtilityFunction)
10
- SanitizeEmail::Bleach#inject_user_names refers to real_recipient more than self (FeatureEnvy)
11
- SanitizeEmail::Bleach#override_email has approx 10 statements (TooManyStatements)
12
- SanitizeEmail::Bleach#subject_override doesn't depend on instance state (UtilityFunction)
13
- SanitizeEmail::Bleach#subject_override refers to actual_addresses more than self (FeatureEnvy)
1
+ lib/sanitize_email/bleach.rb -- 2 warnings:
14
2
  SanitizeEmail::Bleach::MissingTo has no descriptive comment (IrresponsibleModule)
15
3
  SanitizeEmail::Bleach::UnknownOverride has no descriptive comment (IrresponsibleModule)
16
4
  lib/sanitize_email/config.rb -- 4 warnings:
@@ -18,12 +6,25 @@ lib/sanitize_email/config.rb -- 4 warnings:
18
6
  SanitizeEmail::Config#self.configure calls @config[:force_sanitize] twice (DuplicateMethodCall)
19
7
  SanitizeEmail::Config#self.configure calls @config[:sanitized_recipients] twice (DuplicateMethodCall)
20
8
  SanitizeEmail::Config#self.configure has approx 7 statements (TooManyStatements)
21
- lib/sanitize_email/deprecation.rb -- 3 warnings:
22
- SanitizeEmail::Deprecation declares the class variable @@deprecate_in_silence (ClassVariable)
9
+ lib/sanitize_email/deprecation.rb -- 2 warnings:
23
10
  SanitizeEmail::Deprecation takes parameters [name, replacement] to 3 methods (DataClump)
24
11
  SanitizeEmail::Deprecation#deprecation is controlled by argument replacement (ControlParameter)
25
12
  lib/sanitize_email/engine.rb -- 1 warning:
26
13
  SanitizeEmail::Engine has no descriptive comment (IrresponsibleModule)
14
+ lib/sanitize_email/mail_header_tools.rb -- 7 warnings:
15
+ SanitizeEmail::MailHeaderTools#self.add_original_addresses_as_headers has the variable name 'k' (UncommunicativeVariableName)
16
+ SanitizeEmail::MailHeaderTools#self.add_original_addresses_as_headers has the variable name 'v' (UncommunicativeVariableName)
17
+ SanitizeEmail::MailHeaderTools#self.prepend_environment_to_subject calls Rails.env twice (DuplicateMethodCall)
18
+ SanitizeEmail::MailHeaderTools#self.update_header has the parameter name 'k' (UncommunicativeParameterName)
19
+ SanitizeEmail::MailHeaderTools#self.update_header has the parameter name 'v' (UncommunicativeParameterName)
20
+ SanitizeEmail::MailHeaderTools#self.update_header has the variable name 'a' (UncommunicativeVariableName)
21
+ SanitizeEmail::MailHeaderTools#self.update_header is controlled by argument v (ControlParameter)
22
+ lib/sanitize_email/overridden_addresses.rb -- 5 warnings:
23
+ SanitizeEmail::OverriddenAddresses has no descriptive comment (IrresponsibleModule)
24
+ SanitizeEmail::OverriddenAddresses#inject_user_names contains iterators nested 2 deep (NestedIterators)
25
+ SanitizeEmail::OverriddenAddresses#inject_user_names doesn't depend on instance state (UtilityFunction)
26
+ SanitizeEmail::OverriddenAddresses#inject_user_names refers to real_recipient more than self (FeatureEnvy)
27
+ SanitizeEmail::OverriddenAddresses#override_email has approx 10 statements (TooManyStatements)
27
28
  lib/sanitize_email/railtie.rb -- 1 warning:
28
29
  SanitizeEmail::Railtie has no descriptive comment (IrresponsibleModule)
29
30
  lib/sanitize_email/rspec_matchers.rb -- 2 warnings:
@@ -5,6 +5,8 @@ module SanitizeEmail
5
5
  require 'sanitize_email/version'
6
6
  require 'sanitize_email/deprecation'
7
7
  require 'sanitize_email/config'
8
+ require 'sanitize_email/mail_header_tools'
9
+ require 'sanitize_email/overridden_addresses'
8
10
  require 'sanitize_email/bleach'
9
11
 
10
12
  class MissingBlockParameter < StandardError; end
@@ -44,6 +46,11 @@ module SanitizeEmail
44
46
  SanitizeEmail[:local_environments]
45
47
  end
46
48
 
49
+ def self.activate?(message)
50
+ proc = SanitizeEmail.activation_proc
51
+ proc.call(message) if proc.respond_to?(:call)
52
+ end
53
+
47
54
  class << self
48
55
  attr_accessor :force_sanitize
49
56
  end
@@ -2,69 +2,32 @@
2
2
  #Released under the MIT license
3
3
 
4
4
  module SanitizeEmail
5
+ # SanitizeEmail::Bleach determines whether to sanitize the headers of an email, and does so when appropriate.
5
6
  class Bleach
6
7
 
7
- class MissingTo < StandardError;
8
- end
9
- class UnknownOverride < StandardError;
10
- end
11
-
12
8
  # Can override global configs at the instance level.
13
9
  attr_accessor :engage, # Turn sanitization on or off just for this instance
14
- :sanitized_to, :sanitized_cc, :sanitized_bcc, # Replace non-white-listed addresses with these sanitized addresses.
15
- :good_list, # White-listed addresses will not be molested as to, cc, or bcc
16
- :bad_list, # Black-listed addresses will be removed from to, cc and bcc when sanitization is engaged
17
- :injected # Track whether or not the subject has been injected with usernames
10
+ :overridden_addresses
18
11
 
19
12
  def initialize(args = {})
20
13
  # Not using extract_options! because non-rails compatibility is a goal
21
- @sanitized_to = args[:sanitized_to] || SanitizeEmail[:sanitized_to]
22
- @sanitized_cc = args[:sanitized_cc] || SanitizeEmail[:sanitized_cc]
23
- @sanitized_bcc = args[:sanitized_bcc] || SanitizeEmail[:sanitized_bcc]
24
- @good_list = args[:good_list] || SanitizeEmail[:good_list] || []
25
- @bad_list = args[:bad_list] || SanitizeEmail[:bad_list] || []
26
14
  @engage = args[:engage] || SanitizeEmail[:engage]
27
- @injected = false
28
15
  end
29
16
 
30
17
  # If all recipient addresses are white-listed the field is left alone.
31
18
  def delivering_email(message)
32
19
  if self.sanitize_engaged?(message)
33
- # Cache the correct addresses. These will get overwritten when the
34
- cache_to = self.to_override(message.to)
35
- cache_cc = self.cc_override(message.cc)
36
- cache_bcc = self.bcc_override(message.bcc)
20
+ SanitizeEmail::MailHeaderTools.add_original_addresses_as_headers(message)
21
+ SanitizeEmail::MailHeaderTools.prepend_custom_subject(message)
37
22
 
38
- add_original_addresses_as_headers(message)
23
+ o = SanitizeEmail::OverriddenAddresses.new(message)
39
24
 
40
- message.subject = self.prepend_email_to_subject(message.subject, message.to) if SanitizeEmail.use_actual_email_prepended_to_subject
41
- message.subject = self.prepend_environment_to_subject(message.subject) if SanitizeEmail.use_actual_environment_prepended_to_subject
42
-
43
- message.to = cache_to
44
- message.cc = cache_cc
45
- message.bcc = cache_bcc
25
+ message.to = o.overridden_to
26
+ message.cc = o.overridden_cc
27
+ message.bcc = o.overridden_bcc
46
28
  end
47
29
  end
48
30
 
49
- def add_original_addresses_as_headers(message)
50
- ## Add headers by string concat. Setting hash values on message.headers does nothing, strangely. http://goo.gl/v46GY
51
- {
52
- 'X-Sanitize-Email-To' => message.to,
53
- 'X-Sanitize-Email-Cc' => message.cc
54
- # Don't write out the BCC, as those addresses should not be visible in message headers for obvious reasons
55
- }.each { |k, v|
56
- # For each type of address line
57
- v.each { |a|
58
- # For each address
59
- message.header = message.header.to_s.strip + "\n#{k}: #{a}"
60
- } if v
61
- }
62
- end
63
-
64
- def activate?(message)
65
- SanitizeEmail.activation_proc.call(message) if SanitizeEmail.activation_proc.respond_to?(:call)
66
- end
67
-
68
31
  # This method will be called by the Hook to determine if an override should occur
69
32
  # There are three ways SanitizeEmail can be turned on; in order of precedence they are:
70
33
  #
@@ -86,127 +49,8 @@ module SanitizeEmail
86
49
  return engaged unless engaged.nil?
87
50
 
88
51
  # Should we sanitize due to the activation_proc?
89
- return self.activate?(message)
90
-
91
- end
92
-
93
- def prepend_email_to_subject(real_subject, actual_addresses)
94
- if !actual_addresses.respond_to?(:join)
95
- real_subject
96
- else
97
- "(#{actual_addresses.join(',').gsub(/@/, ' at ').gsub(/[<>]/, '~')}) #{real_subject}"
98
- end
99
- end
100
-
101
- def prepend_environment_to_subject(real_subject)
102
- if defined?(Rails) && Rails.env.present?
103
- "[#{Rails.env}] #{real_subject}"
104
- end
105
- end
106
-
107
- def to_override(actual_addresses)
108
- to = override_email(:to, actual_addresses)
109
- raise MissingTo, 'after overriding :to there are no addresses to send in To: header.' if to.empty?
110
- to.join(',')
111
- end
112
-
113
- def cc_override(actual_addresses)
114
- override_email(:cc, actual_addresses).join(',')
115
- end
116
-
117
- def bcc_override(actual_addresses)
118
- override_email(:bcc, actual_addresses).join(',')
119
- end
120
-
121
- #######
122
- protected
123
- #######
124
-
125
- def address_list_filter(list_type, address)
126
- # TODO: How does this handle email addresses with user names like "Foo Example <foo@example.org>"
127
- has_address = self.send(list_type).include?(address)
128
- case list_type
129
- when :good_list then
130
- has_address ? address : nil
131
- when :bad_list then
132
- has_address ? nil : address
133
- end
134
- end
135
-
136
- def inject_user_names(real_addresses, sanitized_addresses)
137
- real_addresses.inject([]) do |result, real_recipient|
138
- if real_recipient.nil?
139
- new_recipient = sanitized_addresses
140
- else
141
- new_recipient = sanitized_addresses.map { |sanitized| "#{real_recipient.gsub(/@/, ' at ').gsub(/[<>]/, '~')} <#{sanitized}>" }
142
- end
143
- result << new_recipient
144
- result
145
- end.flatten
146
- end
147
-
148
- def clean_addresses(addresses, list_type)
149
- # Normalize addresses just in case it isn't an array yet
150
- addresses.map { |address|
151
- # If this address is on the good list then let it pass
152
- self.address_list_filter(list_type, address)
153
- }.compact
154
- end
155
-
156
- def sanitize_addresses(type)
157
- case type
158
- when :to then
159
- Array(self.sanitized_to)
160
- when :cc then
161
- Array(self.sanitized_cc)
162
- when :bcc then
163
- Array(self.sanitized_bcc)
164
- else
165
- raise UnknownOverride, "unknown email override"
166
- end
167
- end
168
-
169
- # Allow good listed email addresses, and then remove the bad listed addresses
170
- def good_listize(real_addresses)
171
- good_listed = self.clean_addresses(real_addresses, :good_list)
172
- good_listed = self.clean_addresses(good_listed, :bad_list) unless good_listed.empty?
173
- good_listed
174
- end
175
-
176
- def override_email(type, actual_addresses)
177
- # Normalized to an arrays
178
- #puts "override_email 1: #{type} - #{actual_addresses}"
179
- real_addresses = Array(actual_addresses)
180
-
181
- #puts "override_email 2: #{type} - #{real_addresses}"
182
- # If there were no original recipients, then we DO NOT override the nil with the sanitized recipients
183
- return [] if real_addresses.empty?
184
-
185
- good_listed = good_listize(real_addresses)
186
- #puts "override_email 3: #{type} - #{good_listed}"
187
- # If there are good_list addresses to send to then use them as is, no mods needed
188
- return good_listed unless good_listed.empty?
189
-
190
- # TODO: Allow overriding if an addressed email is on the good list?
191
- # If there are no sanitized addresses we can't override!
192
- sanitized_addresses = sanitize_addresses(type)
193
- #puts "override_email 3: #{type} - #{sanitized_addresses}"
194
- return [] if sanitized_addresses.empty?
195
-
196
- # At this point it is assured that the address list will need to be sanitized
197
- # One more check to ensure none of the configured sanitized email addresses are on the bad_list
198
- sanitized_addresses = self.clean_addresses(sanitized_addresses, :bad_list)
199
- #puts "override_email 4: #{type} - #{sanitized_addresses}"
200
-
201
- # If we don't want to inject the 'email' in the 'user name' section of the sanitized recipients,
202
- # then just return the default sanitized recipients
203
- return sanitized_addresses unless SanitizeEmail.use_actual_email_as_sanitized_user_name
52
+ return SanitizeEmail.activate?(message)
204
53
 
205
- with_user_names = self.inject_user_names(real_addresses, sanitized_addresses)
206
- #puts "real_addresses 2: #{real_addresses}"
207
- #puts "override_email 5: #{type} - #{with_user_names}"
208
- # Otherwise inject the email as the 'user name'
209
- return with_user_names
210
54
  end
211
55
 
212
56
  end # end Class Bleach
@@ -0,0 +1,52 @@
1
+ module SanitizeEmail
2
+ module MailHeaderTools
3
+
4
+ def self.prepend_subject_array(message)
5
+ prepend = []
6
+ prepend << SanitizeEmail::MailHeaderTools.prepend_email_to_subject(message.to) if SanitizeEmail.use_actual_email_prepended_to_subject
7
+ prepend << SanitizeEmail::MailHeaderTools.prepend_environment_to_subject if SanitizeEmail.use_actual_environment_prepended_to_subject
8
+ prepend
9
+ end
10
+
11
+ def self.prepend_environment_to_subject
12
+ "[#{Rails.env}]" if defined?(Rails) && Rails.env.present?
13
+ end
14
+
15
+ def self.prepend_email_to_subject(actual_addresses)
16
+ "(#{actual_addresses.join(',').gsub(/@/, ' at ').gsub(/[<>]/, '~')})" if actual_addresses.respond_to?(:join)
17
+ end
18
+
19
+ def self.add_original_addresses_as_headers(message)
20
+ ## Add headers by string concat. Setting hash values on message.headers does nothing, strangely. http://goo.gl/v46GY
21
+ {
22
+ 'X-Sanitize-Email-To' => message.to, # can be an array
23
+ 'X-Sanitize-Email-Cc' => message.cc # can be an array
24
+ # Don't write out the BCC, as those addresses should not be visible in message headers for obvious reasons
25
+ }.each { |k, v|
26
+ # For each type of address line
27
+ SanitizeEmail::MailHeaderTools.update_header(k, v, message)
28
+ }
29
+ end
30
+
31
+ def self.prepend_custom_subject(message)
32
+ message.subject.insert(0, SanitizeEmail::MailHeaderTools.prepend_subject_array(message).join(' ') + ' ')
33
+ end
34
+
35
+ # Add headers by string concat. Setting hash values on message.headers does nothing, strangely. http://goo.gl/v46GY
36
+ def self.update_header(k, v, message)
37
+ # For each address, as v can be an array of addresses
38
+ Array(v).each_with_index { |a, index|
39
+ num = index + 1
40
+ header_key = num > 1 ?
41
+ "#{k}-#{index+1}" :
42
+ k
43
+ #puts "for #{num}: #{header_key}"
44
+ message.header[header_key] = a.to_s
45
+ # Old way
46
+ #message.header = message.header.to_s.strip + "\n#{k}: #{a}"
47
+ } if v
48
+ #puts "\nafter message.header:\n #{message.header}\n"
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,129 @@
1
+ module SanitizeEmail
2
+ class OverriddenAddresses
3
+
4
+ class MissingTo < StandardError;
5
+ end
6
+ class UnknownOverride < StandardError;
7
+ end
8
+
9
+ attr_accessor :overridden_to, :overridden_cc, :overridden_bcc,
10
+ :good_list, # White-listed addresses will not be molested as to, cc, or bcc
11
+ :bad_list, # Black-listed addresses will be removed from to, cc and bcc when sanitization is engaged
12
+ :sanitized_to, :sanitized_cc, :sanitized_bcc # Replace non-white-listed addresses with these sanitized addresses.
13
+
14
+ def initialize(message, args = {})
15
+ # Not using extract_options! because non-rails compatibility is a goal
16
+ @sanitized_to = args[:sanitized_to] || SanitizeEmail[:sanitized_to]
17
+ @sanitized_cc = args[:sanitized_cc] || SanitizeEmail[:sanitized_cc]
18
+ @sanitized_bcc = args[:sanitized_bcc] || SanitizeEmail[:sanitized_bcc]
19
+ @good_list = args[:good_list] || SanitizeEmail[:good_list] || []
20
+ @bad_list = args[:bad_list] || SanitizeEmail[:bad_list] || []
21
+ @overridden_to = self.to_override(message.to)
22
+ @overridden_cc = self.cc_override(message.cc)
23
+ @overridden_bcc = self.bcc_override(message.bcc)
24
+ end
25
+
26
+ # Allow good listed email addresses, and then remove the bad listed addresses
27
+ def good_listize(real_addresses)
28
+ good_listed = self.clean_addresses(real_addresses, :good_list)
29
+ good_listed = self.clean_addresses(good_listed, :bad_list) unless good_listed.empty?
30
+ good_listed
31
+ end
32
+
33
+ def to_override(actual_addresses)
34
+ to = override_email(:to, actual_addresses)
35
+ raise MissingTo, "after overriding :to (#{actual_addresses}) there are no addresses to send in To: header." if to.empty?
36
+ to.join(',')
37
+ end
38
+
39
+ def cc_override(actual_addresses)
40
+ override_email(:cc, actual_addresses).join(',')
41
+ end
42
+
43
+ def bcc_override(actual_addresses)
44
+ override_email(:bcc, actual_addresses).join(',')
45
+ end
46
+
47
+ def override_email(type, actual_addresses)
48
+ # Normalized to an arrays
49
+ #puts "override_email 1: #{type} - #{actual_addresses}"
50
+ real_addresses = Array(actual_addresses)
51
+
52
+ #puts "override_email 2: #{type} - #{real_addresses}"
53
+ # If there were no original recipients, then we DO NOT override the nil with the sanitized recipients
54
+ return [] if real_addresses.empty?
55
+
56
+ good_listed = good_listize(real_addresses)
57
+ #puts "override_email 3: #{type} - #{good_listed}"
58
+ # If there are good_list addresses to send to then use them as is, no mods needed
59
+ return good_listed unless good_listed.empty?
60
+
61
+ # TODO: Allow overriding if an addressed email is on the good list?
62
+ # If there are no sanitized addresses we can't override!
63
+ sanitized_addresses = sanitize_addresses(type)
64
+ #puts "override_email 4: #{type} - #{sanitized_addresses}"
65
+ return [] if sanitized_addresses.empty?
66
+
67
+ # At this point it is assured that the address list will need to be sanitized
68
+ # One more check to ensure none of the configured sanitized email addresses are on the bad_list
69
+ sanitized_addresses = self.clean_addresses(sanitized_addresses, :bad_list)
70
+ #puts "override_email 5: #{type} - #{sanitized_addresses}"
71
+
72
+ # If we don't want to inject the 'email' in the 'user name' section of the sanitized recipients,
73
+ # then just return the default sanitized recipients
74
+ return sanitized_addresses unless SanitizeEmail.use_actual_email_as_sanitized_user_name
75
+
76
+ with_user_names = self.inject_user_names(real_addresses, sanitized_addresses)
77
+ #puts "real_addresses 2: #{real_addresses}"
78
+ #puts "override_email 6: #{type} - #{with_user_names}"
79
+ # Otherwise inject the email as the 'user name'
80
+ return with_user_names
81
+ end
82
+
83
+ def address_list_filter(list_type, address)
84
+ # TODO: How does this handle email addresses with user names like "Foo Example <foo@example.org>"
85
+ has_address = self.send(list_type).include?(address)
86
+ case list_type
87
+ when :good_list then
88
+ has_address ? address : nil
89
+ when :bad_list then
90
+ has_address ? nil : address
91
+ end
92
+ end
93
+
94
+ def inject_user_names(real_addresses, sanitized_addresses)
95
+ real_addresses.inject([]) do |result, real_recipient|
96
+ if real_recipient.nil?
97
+ new_recipient = sanitized_addresses
98
+ else
99
+ #puts "SANITIZED: #{sanitized_addresses}"
100
+ new_recipient = sanitized_addresses.map { |sanitized| "#{real_recipient.gsub(/@/, ' at ').gsub(/[<>]/, '~')} <#{sanitized}>" }
101
+ end
102
+ result << new_recipient
103
+ result
104
+ end.flatten
105
+ end
106
+
107
+ def clean_addresses(addresses, list_type)
108
+ # Normalize addresses just in case it isn't an array yet
109
+ addresses.map { |address|
110
+ # If this address is on the good list then let it pass
111
+ self.address_list_filter(list_type, address)
112
+ }.compact
113
+ end
114
+
115
+ def sanitize_addresses(type)
116
+ case type
117
+ when :to then
118
+ Array(self.sanitized_to)
119
+ when :cc then
120
+ Array(self.sanitized_cc)
121
+ when :bcc then
122
+ Array(self.sanitized_bcc)
123
+ else
124
+ raise UnknownOverride, "unknown email override"
125
+ end
126
+ end
127
+
128
+ end
129
+ end
@@ -1,5 +1,5 @@
1
1
  #Copyright (c) 2008-12 Peter H. Boling of 9thBit LLC
2
2
  #Released under the MIT license
3
3
  module SanitizeEmail
4
- VERSION = '1.0.7'
4
+ VERSION = '1.0.8'
5
5
  end
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Peter Boling", "John Trupiano", "George Anderson"]
9
9
  s.summary = "Rails/Sinatra/Mail gem: Test email abilities without ever sending a message to actual live addresses"
10
10
  s.description = "In Rails, Sinatra, or simply the mail gem: Aids in development, testing, qa, and production troubleshooting of email issues without worrying that emails will get sent to actual live addresses."
11
- s.email = ["peter.boling@gmail.com", "jtrupiano@gmail.com", "george@benevolentcode.com"]
11
+ s.email = ["peter.boling@gmail.com"]
12
12
  s.extra_rdoc_files = [
13
13
  "CHANGELOG.md",
14
14
  "LICENSE",
@@ -60,6 +60,12 @@ describe SanitizeEmail do
60
60
  end
61
61
  end
62
62
 
63
+ def sanitary_mail_delivery_multiple_recipients(config_options = {})
64
+ SanitizeEmail.sanitary(config_options) do
65
+ mail_delivery_multiple_recipients
66
+ end
67
+ end
68
+
63
69
  def unsanitary_mail_delivery
64
70
  SanitizeEmail.unsanitary do
65
71
  mail_delivery
@@ -77,6 +83,17 @@ describe SanitizeEmail do
77
83
  end
78
84
  end
79
85
 
86
+ def mail_delivery_multiple_recipients
87
+ @email_message = Mail.deliver do
88
+ from 'from@example.org'
89
+ to %w( to1@example.org to2@example.org to3@example.org )
90
+ cc %w( cc1@example.org cc2@example.org cc3@example.org )
91
+ bcc %w( bcc1@example.org bcc2@example.org bcc3@example.org )
92
+ reply_to 'reply_to@example.org'
93
+ subject 'original subject'
94
+ end
95
+ end
96
+
80
97
  context "module methods" do
81
98
  before(:each) do
82
99
  sanitize_spec_dryer
@@ -124,6 +141,8 @@ describe SanitizeEmail do
124
141
  @email_message.should have_to("to@sanitize_email.org")
125
142
  @email_message.should have_cc("cc@sanitize_email.org")
126
143
  @email_message.should have_bcc("bcc@sanitize_email.org")
144
+ end
145
+ it "should set headers" do
127
146
  @email_message.should have_header("X-Sanitize-Email-To", "to@example.org")
128
147
  @email_message.should have_header("X-Sanitize-Email-Cc", "cc@example.org")
129
148
  @email_message.should_not have_header("X-Sanitize-Email-Bcc", "bcc@sanitize_email.org")
@@ -134,6 +153,51 @@ describe SanitizeEmail do
134
153
  end
135
154
  end
136
155
 
156
+ context "sanitary with multiple recipients" do
157
+ before(:each) do
158
+ configure_sanitize_email
159
+ sanitary_mail_delivery_multiple_recipients
160
+ end
161
+ it "should not alter non-sanitized attributes" do
162
+ @email_message.should have_from('from@example.org')
163
+ @email_message.should have_reply_to('reply_to@example.org')
164
+ end
165
+ it "should not prepend overrides" do
166
+ @email_message.should_not have_to_username("to at sanitize_email.org")
167
+ @email_message.should_not have_subject("(to at sanitize_email.org)")
168
+ end
169
+ it "should override" do
170
+ @email_message.should have_to("to@sanitize_email.org")
171
+ @email_message.should have_cc("cc@sanitize_email.org")
172
+ @email_message.should have_bcc("bcc@sanitize_email.org")
173
+ end
174
+ it "should set headers for sanitized :to recipients" do
175
+ @email_message.should have_header("X-Sanitize-Email-To", "to1@example.org")
176
+ @email_message.should_not have_header("X-Sanitize-Email-To-0", "to1@example.org")
177
+ @email_message.should_not have_header("X-Sanitize-Email-To-1", "to1@example.org")
178
+ @email_message.should have_header("X-Sanitize-Email-To-2", "to2@example.org")
179
+ @email_message.should have_header("X-Sanitize-Email-To-3", "to3@example.org")
180
+ end
181
+ it "should set headers for sanitized :cc recipients" do
182
+ @email_message.should have_header("X-Sanitize-Email-Cc", "cc1@example.org")
183
+ @email_message.should_not have_header("X-Sanitize-Email-Cc-0", "cc1@example.org")
184
+ @email_message.should_not have_header("X-Sanitize-Email-Cc-1", "cc1@example.org")
185
+ @email_message.should have_header("X-Sanitize-Email-Cc-2", "cc2@example.org")
186
+ @email_message.should have_header("X-Sanitize-Email-Cc-3", "cc3@example.org")
187
+ end
188
+ it "should not set headers for sanitized :bcc recipients" do
189
+ @email_message.should_not have_header("X-Sanitize-Email-Bcc", "bcc1@sanitize_email.org")
190
+ @email_message.should_not have_header("X-Sanitize-Email-Bcc-0", "bcc1@sanitize_email.org")
191
+ @email_message.should_not have_header("X-Sanitize-Email-Bcc-1", "bcc1@sanitize_email.org")
192
+ @email_message.should_not have_header("X-Sanitize-Email-Bcc-2", "bcc2@sanitize_email.org")
193
+ @email_message.should_not have_header("X-Sanitize-Email-Bcc-3", "bcc3@sanitize_email.org")
194
+ end
195
+ it "should not prepend originals by default" do
196
+ @email_message.should_not have_to_username("to at example.org <to@sanitize_email.org>")
197
+ @email_message.should_not have_subject("(to at example.org) original subject")
198
+ end
199
+ end
200
+
137
201
  context "force_sanitize" do
138
202
  context "true" do
139
203
  before(:each) do
@@ -150,6 +214,8 @@ describe SanitizeEmail do
150
214
  @email_message.should have_to("to@sanitize_email.org")
151
215
  @email_message.should have_cc("cc@sanitize_email.org")
152
216
  @email_message.should have_bcc("bcc@sanitize_email.org")
217
+ end
218
+ it "should set headers" do
153
219
  @email_message.should have_header("X-Sanitize-Email-To", "to@example.org")
154
220
  @email_message.should have_header("X-Sanitize-Email-Cc", "cc@example.org")
155
221
  @email_message.should_not have_header("X-Sanitize-Email-Bcc", "bcc@sanitize_email.org")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sanitize_email
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-08-06 00:00:00.000000000 Z
14
+ date: 2013-08-30 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -216,6 +216,8 @@ files:
216
216
  - lib/sanitize_email/config.rb
217
217
  - lib/sanitize_email/deprecation.rb
218
218
  - lib/sanitize_email/engine.rb
219
+ - lib/sanitize_email/mail_header_tools.rb
220
+ - lib/sanitize_email/overridden_addresses.rb
219
221
  - lib/sanitize_email/railtie.rb
220
222
  - lib/sanitize_email/rspec_matchers.rb
221
223
  - lib/sanitize_email/test_helpers.rb