mail-jenc 1.0.7 → 1.0.8

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
  SHA256:
3
- metadata.gz: 27837d259b2d789de6b636238d36725d356b26baaf16aed91bb25ac4de0984e3
4
- data.tar.gz: 270c15b093bfc39bfcf8f518290d26c916ab1ca1bf40361a616fc0be6b73e7d7
3
+ metadata.gz: dfee35d6df629f80ba43bf19452f290442843ca98012c672d60077efd6e21834
4
+ data.tar.gz: 39712976e5b7dcf560fe7c969176243a540f8080cb3b17e0cd82878bba312aa5
5
5
  SHA512:
6
- metadata.gz: '0852f0358a7c2c35156a4097892ac5c340c09aaf08e47feebd3a11bdf8020e8d7df4b05c54a66bab8fb159701e417db38e1adee4e435b06a60afbd9d98266b63'
7
- data.tar.gz: 1f2380ab17bccf3d84363c4d4d3a940a5aa4970ff7c6485271e2855ff5e6c2a413778e34169dd6ab2c3f398bcf1a15859c4b4fd8d88aef8d253e66d4c401ddb4
6
+ metadata.gz: 00c777f94d40b33f15f1effe417674639002db244af18f1e19f08577d1b4e1b80dc036241acc96bc1c396fc7984c40e9cb0ad936a7afe767c4030724875e6aa4
7
+ data.tar.gz: fc6e89e2d1fe3293d3f82631eaa15e1f4093feceb0a677b413e7af447d71ee0c31cacf3f999d6860c8a813c1c1e4ea1c8f5fbf30894defb6c1b1f1740ae5efaf
@@ -5,14 +5,13 @@ module Mail
5
5
  if Jenc.enabled?
6
6
  if name && !name.ascii_only? && name.encoding == Encoding::UTF_8 && value.is_a?(Hash) && (charset = value.delete(:header_charset))
7
7
  mime_type = set_mime_type(name)
8
- transcoded = Mail::Encodings.transcode_charset(name, name.encoding, charset)
9
8
  if (value.key?(:rfc2231) ? value.delete(:rfc2231) : Jenc.rfc2231)
10
- encoded = RFC2231Encoder.encode(transcoded, charset: charset)
9
+ encoded = RFC2231Encoder.encode(name, charset)
11
10
  value[:content_disposition] ||= %Q|#{@content_disposition_type}; #{encoded}|
12
- encoded = Mail::Encodings.b_value_encode(transcoded)
11
+ encoded = BEncoder.encode(name, charset)
13
12
  value[:content_type] ||= %Q|#{mime_type}; name="#{encoded}"|
14
13
  else
15
- encoded = Mail::Encodings.b_value_encode(transcoded)
14
+ encoded = BEncoder.encode(name, charset)
16
15
  value[:content_disposition] ||= %Q|#{@content_disposition_type}; filename="#{encoded}"|
17
16
  value[:content_type] ||= %Q|#{mime_type}; name="#{encoded}"|
18
17
  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(', ')
@@ -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
@@ -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.8'
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.8
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: 2021-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -77,10 +77,12 @@ files:
77
77
  - Rakefile
78
78
  - lib/mail/jenc.rb
79
79
  - lib/mail/jenc/attachments_list_patch.rb
80
- - lib/mail/jenc/encoder.rb
80
+ - lib/mail/jenc/b_encoder.rb
81
81
  - lib/mail/jenc/fields/address_field_patch.rb
82
82
  - lib/mail/jenc/fields/unstructured_field_patch.rb
83
83
  - lib/mail/jenc/message_patch.rb
84
+ - lib/mail/jenc/percent_encoder.rb
85
+ - lib/mail/jenc/rfc2231_encoder.rb
84
86
  - lib/mail/jenc/ruby_1_9_patch.rb
85
87
  - lib/mail/jenc/version.rb
86
88
  homepage: https://github.com/kanety/mail-jenc
@@ -102,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
104
  - !ruby/object:Gem::Version
103
105
  version: '0'
104
106
  requirements: []
105
- rubygems_version: 3.1.2
107
+ rubygems_version: 3.0.3
106
108
  signing_key:
107
109
  specification_version: 4
108
110
  summary: A mail patch for encoding conventional mail