mail-jenc 1.0.7 → 1.0.10

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27837d259b2d789de6b636238d36725d356b26baaf16aed91bb25ac4de0984e3
4
- data.tar.gz: 270c15b093bfc39bfcf8f518290d26c916ab1ca1bf40361a616fc0be6b73e7d7
3
+ metadata.gz: ce87dd8df9f740e8fa733161962382dd20924534f720769c4efe0b0bc91a22db
4
+ data.tar.gz: 1755e999ed838155ed411e3703250ad61634176f0a8299796040ff19f2fe859b
5
5
  SHA512:
6
- metadata.gz: '0852f0358a7c2c35156a4097892ac5c340c09aaf08e47feebd3a11bdf8020e8d7df4b05c54a66bab8fb159701e417db38e1adee4e435b06a60afbd9d98266b63'
7
- data.tar.gz: 1f2380ab17bccf3d84363c4d4d3a940a5aa4970ff7c6485271e2855ff5e6c2a413778e34169dd6ab2c3f398bcf1a15859c4b4fd8d88aef8d253e66d4c401ddb4
6
+ metadata.gz: 55b29a387293f1af1b37066621967d1a6fc3143649866b438560f386e909500fa1f2a602f37f536477fc84189fbe8dbf5dc06a6d86f332cc0c6e15d1ae3f20d4
7
+ data.tar.gz: 172ee348a7e0611d9fb0416f5a87b0cce1c3e461ded1cf628b72c8127e8ea7234b3af2404f901ebe5ca5dc16da78a8e73029689239ff415b5a0cf51232a0b811
@@ -2,17 +2,19 @@ module Mail
2
2
  module Jenc
3
3
  module AttachmentsListPatch
4
4
  def []=(name, value)
5
- if Jenc.enabled?
6
- if name && !name.ascii_only? && name.encoding == Encoding::UTF_8 && value.is_a?(Hash) && (charset = value.delete(:header_charset))
5
+ if Jenc.enabled? && value.is_a?(Hash)
6
+ charset = value.delete(:header_charset)
7
+ rfc2231 = value.key?(:rfc2231) ? value.delete(:rfc2231) : Jenc.rfc2231
8
+
9
+ if name && name.encoding == Encoding::UTF_8 && charset
7
10
  mime_type = set_mime_type(name)
8
- transcoded = Mail::Encodings.transcode_charset(name, name.encoding, charset)
9
- if (value.key?(:rfc2231) ? value.delete(:rfc2231) : Jenc.rfc2231)
10
- encoded = RFC2231Encoder.encode(transcoded, charset: charset)
11
+ if rfc2231
12
+ encoded = RFC2231Encoder.encode(name, charset)
11
13
  value[:content_disposition] ||= %Q|#{@content_disposition_type}; #{encoded}|
12
- encoded = Mail::Encodings.b_value_encode(transcoded)
14
+ encoded = BEncoder.encode(name, charset)
13
15
  value[:content_type] ||= %Q|#{mime_type}; name="#{encoded}"|
14
16
  else
15
- encoded = Mail::Encodings.b_value_encode(transcoded)
17
+ encoded = BEncoder.encode(name, charset)
16
18
  value[:content_disposition] ||= %Q|#{@content_disposition_type}; filename="#{encoded}"|
17
19
  value[:content_type] ||= %Q|#{mime_type}; name="#{encoded}"|
18
20
  end
@@ -0,0 +1,35 @@
1
+ module Mail
2
+ module Jenc
3
+ class BEncoder
4
+ class << self
5
+ def encode(str, charset)
6
+ if Jenc.escape_sequence_charsets.include?(charset.to_s.downcase)
7
+ split(str).map { |s| transcode_and_encode(s, charset) }.join(' ')
8
+ else
9
+ transcode_and_encode(str, charset)
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def transcode_and_encode(str, charset)
16
+ Mail::Encodings.b_value_encode(Mail::Encodings.transcode_charset(str, str.encoding, charset))
17
+ end
18
+
19
+ def split(str, max: 40)
20
+ results = []
21
+ work = ''
22
+ str.chars.each do |char|
23
+ if work.bytesize + char.bytesize >= max
24
+ results << work
25
+ work = ''
26
+ end
27
+ work += char
28
+ end
29
+ results << work unless work.empty?
30
+ results
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -7,9 +7,7 @@ module Mail
7
7
  list = Mail::AddressList.new(value)
8
8
  list.addresses.each do |addr|
9
9
  if addr.display_name && !addr.display_name.ascii_only?
10
- addr.display_name = Mail::Encodings.b_value_encode(
11
- Mail::Encodings.transcode_charset(addr.display_name, addr.display_name.encoding, charset)
12
- )
10
+ addr.display_name = BEncoder.encode(addr.display_name, charset)
13
11
  end
14
12
  end
15
13
  value = list.addresses.map(&:encoded).join(', ')
@@ -0,0 +1,19 @@
1
+ module Mail
2
+ module Jenc
3
+ module ContentTypeFieldPatch
4
+ def parameters
5
+ if Jenc.enabled?
6
+ super.tap do |parameters|
7
+ parameters.delete('charset') if parameters.key?('boundary') || parameters.key?('name')
8
+ end
9
+ else
10
+ super
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ unless Mail::ContentTypeField.included_modules.include?(Mail::Jenc::ContentTypeFieldPatch)
18
+ Mail::ContentTypeField.prepend Mail::Jenc::ContentTypeFieldPatch
19
+ end
@@ -5,9 +5,7 @@ module Mail
5
5
  if Jenc.enabled?
6
6
  if value.is_a?(String) && value.encoding == Encoding::UTF_8 && charset && charset.downcase != 'utf-8'
7
7
  if !value.ascii_only?
8
- value = Mail::Encodings.b_value_encode(
9
- Mail::Encodings.transcode_charset(value, value.encoding, charset)
10
- )
8
+ value = BEncoder.encode(value, charset)
11
9
  elsif value !~ Mail::Encodings::ENCODED_VALUE
12
10
  charset = 'us-ascii'
13
11
  end
@@ -14,8 +14,8 @@ module Mail
14
14
 
15
15
  def add_file(values)
16
16
  if Jenc.enabled?
17
- if values.is_a?(Hash) && charset
18
- values[:header_charset] = charset
17
+ if values.is_a?(Hash) && header.charset
18
+ values[:header_charset] = header.charset
19
19
  end
20
20
  end
21
21
  super
@@ -0,0 +1,15 @@
1
+ module Mail
2
+ module Jenc
3
+ class PercentEncoder
4
+ class << self
5
+ def encode(str)
6
+ encode_to_array(str).join
7
+ end
8
+
9
+ def encode_to_array(str)
10
+ str.unpack('H*').first.scan(/.{2}/).map { |hex| "%#{hex.upcase}" }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,25 +1,15 @@
1
1
  module Mail
2
2
  module Jenc
3
- module PercentEncoder
3
+ class RFC2231Encoder
4
4
  class << self
5
- def encode(str)
6
- encode_to_array(str).join
5
+ def encode(name, charset, **options)
6
+ encode_to_hash(name, charset, **options).map { |k, v| "#{k}=#{v}" }.join(";\r\n\s")
7
7
  end
8
8
 
9
- def encode_to_array(str)
10
- str.unpack('H*').first.scan(/.{2}/).map { |hex| "%#{hex.upcase}" }
11
- end
12
- end
13
- end
14
-
15
- module RFC2231Encoder
16
- class << self
17
- def encode(name, options = {})
18
- encode_to_hash(name, **options).map { |k, v| "#{k}=#{v}" }.join(";\r\n\s")
19
- end
20
-
21
- def encode_to_hash(name, key: 'filename', charset: 'utf-8')
22
- hexes = name.unpack('H*')[0].scan(/.{2}/).map { |hex| "%#{hex.upcase}" }
9
+ def encode_to_hash(name, charset, key: 'filename')
10
+ hexes = PercentEncoder.encode_to_array(
11
+ Mail::Encodings.transcode_charset(name, name.encoding, charset)
12
+ )
23
13
 
24
14
  first_hex_num = hex_num(charset.size + key.size + 3)
25
15
  if hexes.size <= first_hex_num
@@ -1,5 +1,5 @@
1
1
  module Mail
2
2
  module Jenc
3
- VERSION = '1.0.7'
3
+ VERSION = '1.0.10'
4
4
  end
5
5
  end
data/lib/mail/jenc.rb CHANGED
@@ -9,6 +9,7 @@ module Mail
9
9
  class << self
10
10
  attr_reader :enabled
11
11
  attr_accessor :rfc2231
12
+ attr_accessor :escape_sequence_charsets
12
13
  attr_accessor :preferred_charsets
13
14
 
14
15
  def enabled?
@@ -26,6 +27,7 @@ module Mail
26
27
 
27
28
  self.enable
28
29
  self.rfc2231 = false
30
+ self.escape_sequence_charsets = ['iso-2022-jp']
29
31
  self.preferred_charsets = {
30
32
  'iso-2022-jp' => 'cp50221',
31
33
  'shift_jis' => 'cp932'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail-jenc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshikazu Kaneta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-24 00:00:00.000000000 Z
11
+ date: 2022-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.7.1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 2.8.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: 2.7.1
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 2.8.0
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -77,10 +83,13 @@ files:
77
83
  - Rakefile
78
84
  - lib/mail/jenc.rb
79
85
  - lib/mail/jenc/attachments_list_patch.rb
80
- - lib/mail/jenc/encoder.rb
86
+ - lib/mail/jenc/b_encoder.rb
81
87
  - lib/mail/jenc/fields/address_field_patch.rb
88
+ - lib/mail/jenc/fields/content_type_field_patch.rb
82
89
  - lib/mail/jenc/fields/unstructured_field_patch.rb
83
90
  - lib/mail/jenc/message_patch.rb
91
+ - lib/mail/jenc/percent_encoder.rb
92
+ - lib/mail/jenc/rfc2231_encoder.rb
84
93
  - lib/mail/jenc/ruby_1_9_patch.rb
85
94
  - lib/mail/jenc/version.rb
86
95
  homepage: https://github.com/kanety/mail-jenc
@@ -102,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
111
  - !ruby/object:Gem::Version
103
112
  version: '0'
104
113
  requirements: []
105
- rubygems_version: 3.1.2
114
+ rubygems_version: 3.3.3
106
115
  signing_key:
107
116
  specification_version: 4
108
117
  summary: A mail patch for encoding conventional mail