logstash-input-imap 3.2.1 → 3.2.2

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: 3f39d56e92b214ea882711074b5bc1e18494cae59593bc6ae3f0c148d31f92d6
4
- data.tar.gz: f4ee0a61e683ed91dc12939b0e908614be4f86c0889b2ec77313f23edca0e106
3
+ metadata.gz: 9aa1c16fcc248a5258d5fc8e8b7b726dfde45c5ad57b4b627e8d6b4028f60b93
4
+ data.tar.gz: 3985ebfce8743fcd664a80e92854f7c02a6a5767735b494f8e239590e925e49c
5
5
  SHA512:
6
- metadata.gz: b779ca617b2cdf49546cf935c6fec06ed874e6668938db53c10833fc9158138e6adbd12d0fdde76f4775d8584c92e7257a1723366f3a0bb8414849404bb5dba1
7
- data.tar.gz: 8b2e4f3ff554a873fe2fc514f6ea06005267ab789af4ebeac672a320cccb8d7847015ef5e5170db8b5801a13627efd9ee76a93bef49cf0b709ad0e5a9b629b84
6
+ metadata.gz: c7d50142174b288474dd2d0c36d1ac1884369f2588bd485814cc749fd534de34bc2bbd4d37a187d53f309f73aa280d7f332e7f513282193948a16663aa75025d
7
+ data.tar.gz: 5c745ef7f8836481e35c7fdf8f424530a082bf22e3a50b2de06fa667031976d91abf460b2fead7526c0414e2d196951feb09e475d92fef61fcd1be8c13916031
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 3.2.2
2
+ - Require `mail` dependency 2.9 or greater [#65](https://github.com/logstash-plugins/logstash-input-imap/pull/65)
3
+ - Fix attachment data encoding regressed by mail upgrade
4
+
1
5
  ## 3.2.1
2
6
  - Upgrade `email` dependency so that supports Ruby 3.1. This also fixes the `net-smtp` load regression [#60](https://github.com/logstash-plugins/logstash-input-imap/pull/60)
3
7
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Logstash Plugin
2
2
 
3
- [![Travis Build Status](https://travis-ci.com/logstash-plugins/logstash-input-imap.svg)](https://travis-ci.com/logstash-plugins/logstash-input-imap)
3
+ [![Unit Tests](https://github.com/logstash-plugins/logstash-input-imap/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/logstash-plugins/logstash-input-imap/actions/workflows/unit-tests.yml)
4
4
 
5
5
  This is a plugin for [Logstash](https://github.com/elastic/logstash).
6
6
 
@@ -197,7 +197,7 @@ class LogStash::Inputs::IMAP < LogStash::Inputs::Base
197
197
  attachments = []
198
198
  mail.attachments.each do |attachment|
199
199
  if @save_attachments
200
- attachments << { "filename" => attachment.filename, "data" => attachment.body.encoded }
200
+ attachments << { "filename" => attachment.filename, "data" => encode_attachment_data(attachment) }
201
201
  else
202
202
  attachments << { "filename" => attachment.filename}
203
203
  end
@@ -205,6 +205,22 @@ class LogStash::Inputs::IMAP < LogStash::Inputs::Base
205
205
  return attachments
206
206
  end
207
207
 
208
+ # Re-applies the attachment's transfer encoding ourselves (via Mail::Encodings,
209
+ # the same encoders `mail` uses internally) instead of relying on Mail::Body#encoded,
210
+ # whose return value (encoded vs. already-decoded) has varied across `mail` gem versions.
211
+ # Note: 'binary' is the in-memory default the `mail` gem assigns to non-text
212
+ # attachments before they've been serialized/re-parsed, so it's treated like 'base64'.
213
+ def encode_attachment_data(attachment)
214
+ case attachment.content_transfer_encoding.to_s.downcase
215
+ when 'base64', 'binary'
216
+ Mail::Encodings::Base64.encode(attachment.body.decoded)
217
+ when 'quoted-printable'
218
+ Mail::Encodings::QuotedPrintable.encode(attachment.body.decoded)
219
+ else
220
+ attachment.body.decoded
221
+ end
222
+ end
223
+
208
224
  def parse_mail(mail)
209
225
  # Add a debug message so we can track what message might cause an error later
210
226
  @logger.debug? && @logger.debug("Processing mail", message_id: mail.message_id)
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-imap'
4
- s.version = '3.2.1'
4
+ s.version = ::File.read('version').split("\n").first
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads mail from an IMAP server"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.require_paths = ["lib"]
12
12
 
13
13
  # Files
14
- s.files = Dir["lib/**/*","spec/**/*","*.gemspec","*.md","CONTRIBUTORS","Gemfile","LICENSE","NOTICE.TXT", "vendor/jar-dependencies/**/*.jar", "vendor/jar-dependencies/**/*.rb", "VERSION", "docs/**/*"]
14
+ s.files = Dir["lib/**/*","spec/**/*","*.gemspec","*.md","CONTRIBUTORS","Gemfile","LICENSE","NOTICE.TXT", "vendor/jar-dependencies/**/*.jar", "vendor/jar-dependencies/**/*.rb", "VERSION", "version", "docs/**/*"]
15
15
 
16
16
  # Tests
17
17
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~> 1.3'
25
25
  s.add_runtime_dependency 'logstash-mixin-validator_support', '~> 1.0'
26
26
  s.add_runtime_dependency 'logstash-codec-plain'
27
- s.add_runtime_dependency 'mail', '~> 2.8'
27
+ s.add_runtime_dependency 'mail', '~> 2.9'
28
28
  s.add_runtime_dependency 'stud', '~> 0.0.22'
29
29
 
30
30
  s.add_development_dependency 'logstash-devutils'
@@ -260,6 +260,33 @@ describe LogStash::Inputs::IMAP, :ecs_compatibility_support do
260
260
  {"data"=> msg_unencoded, "filename"=>"unencoded.data"}
261
261
  ]
262
262
  end
263
+
264
+ context "with a quoted-printable attachment" do
265
+ let(:msg_qp) { "café résumé naïve" }
266
+
267
+ # round-trip through raw source, same as `check_mail` does via `Mail.read_from_string`,
268
+ # so the attachment's `content_transfer_encoding` reflects what a real server would send
269
+ let(:mail) do
270
+ qp_content = msg_qp
271
+ raw_mail = Mail.new do
272
+ from "me@example.com"
273
+ to "you@example.com"
274
+ subject "logstash imap input test"
275
+ date msg_time
276
+ body msg_text
277
+ add_file :filename => "note.txt", :content => qp_content, :content_transfer_encoding => "quoted-printable"
278
+ end
279
+ Mail.read_from_string(raw_mail.encoded)
280
+ end
281
+
282
+ it "should extract the quoted-printable-decoded content re-encoded as quoted-printable" do
283
+ event = input.parse_mail(mail)
284
+ target = ecs_compatibility? ? '[@metadata][input][imap][attachments]' : 'attachments'
285
+ expect( event.get(target) ).to eql [
286
+ {"data"=> Mail::Encodings::QuotedPrintable.encode(msg_qp), "filename"=>"note.txt"}
287
+ ]
288
+ end
289
+ end
263
290
  end
264
291
 
265
292
  end
data/version ADDED
@@ -0,0 +1 @@
1
+ 3.2.2
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-imap
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.1
4
+ version: 3.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-10-03 00:00:00.000000000 Z
10
+ date: 2026-08-27 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
13
+ name: logstash-core-plugin-api
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
@@ -19,9 +19,8 @@ dependencies:
19
19
  - - "<="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2.99'
22
- name: logstash-core-plugin-api
23
- prerelease: false
24
22
  type: :runtime
23
+ prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - ">="
@@ -31,84 +30,84 @@ dependencies:
31
30
  - !ruby/object:Gem::Version
32
31
  version: '2.99'
33
32
  - !ruby/object:Gem::Dependency
33
+ name: logstash-mixin-ecs_compatibility_support
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
36
  - - "~>"
37
37
  - !ruby/object:Gem::Version
38
38
  version: '1.3'
39
- name: logstash-mixin-ecs_compatibility_support
40
- prerelease: false
41
39
  type: :runtime
40
+ prerelease: false
42
41
  version_requirements: !ruby/object:Gem::Requirement
43
42
  requirements:
44
43
  - - "~>"
45
44
  - !ruby/object:Gem::Version
46
45
  version: '1.3'
47
46
  - !ruby/object:Gem::Dependency
47
+ name: logstash-mixin-validator_support
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
50
  - - "~>"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '1.0'
53
- name: logstash-mixin-validator_support
54
- prerelease: false
55
53
  type: :runtime
54
+ prerelease: false
56
55
  version_requirements: !ruby/object:Gem::Requirement
57
56
  requirements:
58
57
  - - "~>"
59
58
  - !ruby/object:Gem::Version
60
59
  version: '1.0'
61
60
  - !ruby/object:Gem::Dependency
61
+ name: logstash-codec-plain
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - ">="
65
65
  - !ruby/object:Gem::Version
66
66
  version: '0'
67
- name: logstash-codec-plain
68
- prerelease: false
69
67
  type: :runtime
68
+ prerelease: false
70
69
  version_requirements: !ruby/object:Gem::Requirement
71
70
  requirements:
72
71
  - - ">="
73
72
  - !ruby/object:Gem::Version
74
73
  version: '0'
75
74
  - !ruby/object:Gem::Dependency
75
+ name: mail
76
76
  requirement: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '2.8'
81
- name: mail
82
- prerelease: false
80
+ version: '2.9'
83
81
  type: :runtime
82
+ prerelease: false
84
83
  version_requirements: !ruby/object:Gem::Requirement
85
84
  requirements:
86
85
  - - "~>"
87
86
  - !ruby/object:Gem::Version
88
- version: '2.8'
87
+ version: '2.9'
89
88
  - !ruby/object:Gem::Dependency
89
+ name: stud
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
94
  version: 0.0.22
95
- name: stud
96
- prerelease: false
97
95
  type: :runtime
96
+ prerelease: false
98
97
  version_requirements: !ruby/object:Gem::Requirement
99
98
  requirements:
100
99
  - - "~>"
101
100
  - !ruby/object:Gem::Version
102
101
  version: 0.0.22
103
102
  - !ruby/object:Gem::Dependency
103
+ name: logstash-devutils
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
108
  version: '0'
109
- name: logstash-devutils
110
- prerelease: false
111
109
  type: :development
110
+ prerelease: false
112
111
  version_requirements: !ruby/object:Gem::Requirement
113
112
  requirements:
114
113
  - - ">="
@@ -132,13 +131,13 @@ files:
132
131
  - lib/logstash/inputs/imap.rb
133
132
  - logstash-input-imap.gemspec
134
133
  - spec/inputs/imap_spec.rb
134
+ - version
135
135
  homepage: https://www.elastic.co/logstash
136
136
  licenses:
137
137
  - Apache License (2.0)
138
138
  metadata:
139
139
  logstash_plugin: 'true'
140
140
  logstash_group: input
141
- post_install_message:
142
141
  rdoc_options: []
143
142
  require_paths:
144
143
  - lib
@@ -153,8 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
152
  - !ruby/object:Gem::Version
154
153
  version: '0'
155
154
  requirements: []
156
- rubygems_version: 3.2.33
157
- signing_key:
155
+ rubygems_version: 3.6.3
158
156
  specification_version: 4
159
157
  summary: Reads mail from an IMAP server
160
158
  test_files: