schleuder 3.4.1 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/Rakefile +2 -2
- data/db/migrate/20180723173900_add_deliver_selfsent_to_list.rb +11 -0
- data/db/migrate/20190906194820_add_autocrypt_header_to_list.rb +11 -0
- data/db/schema.rb +3 -1
- data/etc/list-defaults.yml +8 -0
- data/lib/schleuder.rb +10 -0
- data/lib/schleuder/cli.rb +1 -0
- data/lib/schleuder/gpgme/key.rb +4 -0
- data/lib/schleuder/list.rb +23 -4
- data/lib/schleuder/logger_notifications.rb +2 -0
- data/lib/schleuder/mail/message.rb +29 -20
- data/lib/schleuder/plugins/attach_listkey.rb +6 -10
- data/lib/schleuder/plugins/resend.rb +14 -11
- data/lib/schleuder/runner.rb +30 -2
- data/lib/schleuder/version.rb +1 -1
- data/locales/de.yml +4 -1
- data/locales/en.yml +4 -1
- metadata +25 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49f682bc409302cde8907906dbbbab0238d4e404748874b5c3b263806b70abbe
|
4
|
+
data.tar.gz: c47b37fc7c1dede5b95bd396ceef0642cf5061af574a589b84497e01d1f7dcf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42706627c3b2ea15d6e735cc28fcaa34a4bcd4cf58bb6789edd5ce83ba8033e10259a16cd61e06d5d2a25f01aa55a25f9a03073a5a03683cab2dc093a04e1103
|
7
|
+
data.tar.gz: b5b784eafd81435118bac61ce089d36e45e0932c46816aa46ae3da199fa96f9cd9c4e31c9dea58eba93d37de707d121a3ee69949388096c8b4330b7498b9a4ad
|
data/README.md
CHANGED
@@ -47,15 +47,15 @@ Additionally these **rubygems** are required (will be installed automatically un
|
|
47
47
|
Installing Schleuder
|
48
48
|
------------
|
49
49
|
|
50
|
-
1. Download [the gem](https://schleuder.org/download/schleuder-3.
|
50
|
+
1. Download [the gem](https://schleuder.org/download/schleuder-3.5.0.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-3.5.0.gem.sig) and verify:
|
51
51
|
```
|
52
52
|
gpg --recv-key 0xB3D190D5235C74E1907EACFE898F2C91E2E6E1F3
|
53
|
-
gpg --verify schleuder-3.
|
53
|
+
gpg --verify schleuder-3.5.0.gem.sig
|
54
54
|
```
|
55
55
|
|
56
56
|
2. If all went well install the gem:
|
57
57
|
```
|
58
|
-
gem install schleuder-3.
|
58
|
+
gem install schleuder-3.5.0.gem
|
59
59
|
```
|
60
60
|
|
61
61
|
3. Set up schleuder:
|
@@ -65,7 +65,7 @@ Installing Schleuder
|
|
65
65
|
This creates necessary directories, copies example configs, etc. If you see errors about missing write permissions please follow the advice given.
|
66
66
|
|
67
67
|
|
68
|
-
For further information on setup and configuration please read <https://schleuder.org/docs
|
68
|
+
For further information on setup and configuration please read <https://schleuder.org/schleuder/docs/server-admins.html>.
|
69
69
|
|
70
70
|
|
71
71
|
Command line usage
|
@@ -145,4 +145,4 @@ GNU GPL 3.0. Please see [LICENSE.txt](LICENSE.txt).
|
|
145
145
|
Alternative Download
|
146
146
|
--------------------
|
147
147
|
|
148
|
-
Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-3.
|
148
|
+
Alternatively to the gem-files you can download the latest release as [a tarball](https://schleuder.org/download/schleuder-3.5.0.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-3.5.0.tar.gz.sig).
|
data/Rakefile
CHANGED
@@ -110,7 +110,7 @@ end
|
|
110
110
|
desc 'Publish gem-file to rubygems.org'
|
111
111
|
task :publish_gem do
|
112
112
|
puts "Really push #{@filename_gem} to rubygems.org? [yN]"
|
113
|
-
if gets.match(/^y/i)
|
113
|
+
if $stdin.gets.match(/^y/i)
|
114
114
|
puts "Pushing..."
|
115
115
|
`gem push #{@filename_gem}`
|
116
116
|
else
|
@@ -132,7 +132,7 @@ desc 'Check if version-tag already exists'
|
|
132
132
|
task :check_version do
|
133
133
|
# Check if Schleuder::VERSION has been updated since last release
|
134
134
|
if `git tag`.match?(/^#{@tagname}$/)
|
135
|
-
$stderr.puts "Warning: Tag '#{@tagname}' already exists. Did you forget to update
|
135
|
+
$stderr.puts "Warning: Tag '#{@tagname}' already exists. Did you forget to update lib/#{project}/version.rb?"
|
136
136
|
$stderr.print "Delete tag to continue? [yN] "
|
137
137
|
if $stdin.gets.match(/^y/i)
|
138
138
|
`git tag -d #{@tagname}`
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class AddDeliverSelfsentToList < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
if ! column_exists?(:lists, :deliver_selfsent)
|
4
|
+
add_column :lists, :deliver_selfsent, :boolean, default: true
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def down
|
9
|
+
remove_column(:lists, :deliver_selfsent)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class AddAutocryptHeaderToList < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
if ! column_exists?(:lists, :include_autocrypt_header)
|
4
|
+
add_column :lists, :include_autocrypt_header, :boolean, default: true
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def down
|
9
|
+
remove_column(:lists, :include_autocrypt_header)
|
10
|
+
end
|
11
|
+
end
|
data/db/schema.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20190906194820) do
|
15
15
|
|
16
16
|
create_table "lists", force: :cascade do |t|
|
17
17
|
t.datetime "created_at"
|
@@ -37,6 +37,7 @@ ActiveRecord::Schema.define(version: 20180110203100) do
|
|
37
37
|
t.boolean "keep_msgid", default: true
|
38
38
|
t.boolean "bounces_drop_all", default: false
|
39
39
|
t.boolean "bounces_notify_admins", default: true
|
40
|
+
t.boolean "deliver_selfsent", default: true
|
40
41
|
t.boolean "include_list_headers", default: true
|
41
42
|
t.boolean "include_openpgp_header", default: true
|
42
43
|
t.integer "max_message_size_kb", default: 10240
|
@@ -44,6 +45,7 @@ ActiveRecord::Schema.define(version: 20180110203100) do
|
|
44
45
|
t.boolean "forward_all_incoming_to_admins", default: false
|
45
46
|
t.integer "logfiles_to_keep", default: 2
|
46
47
|
t.text "internal_footer", default: ""
|
48
|
+
t.boolean "include_autocrypt_header", default: true
|
47
49
|
end
|
48
50
|
|
49
51
|
create_table "subscriptions", force: :cascade do |t|
|
data/etc/list-defaults.yml
CHANGED
@@ -93,6 +93,9 @@ bounces_drop_on_headers:
|
|
93
93
|
# Send a notice to the list-admins whenever an email is bounced or dropped?
|
94
94
|
bounces_notify_admins: true
|
95
95
|
|
96
|
+
# Include Autocrypt header into emails?
|
97
|
+
include_autocrypt_header: true
|
98
|
+
|
96
99
|
# Include RFC-compliant List-* Headers into emails?
|
97
100
|
include_list_headers: true
|
98
101
|
|
@@ -123,3 +126,8 @@ language: en
|
|
123
126
|
# Forward a raw copy of all incoming emails to the list-admins?
|
124
127
|
# Mainly useful for debugging.
|
125
128
|
forward_all_incoming_to_admins: false
|
129
|
+
|
130
|
+
# Should e-mails be delivered to the original subscribed sender?
|
131
|
+
# Disabling this only works for signed e-mails; any e-mail that is unsigned
|
132
|
+
# sent to the list is treated as coming from an unknown source
|
133
|
+
deliver_selfsent: true
|
data/lib/schleuder.rb
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# default to ASCII-8BIT encoding as early as possible for external
|
2
|
+
# data.
|
3
|
+
#
|
4
|
+
# this should ensure we are able to parse most incoming
|
5
|
+
# plain text mails in different charsets.
|
6
|
+
Encoding.default_external = Encoding::UTF_8
|
7
|
+
|
1
8
|
# Stdlib
|
2
9
|
require 'fileutils'
|
3
10
|
require 'singleton'
|
@@ -61,6 +68,9 @@ ENV["SCHLEUDER_CONFIG"] ||= '/etc/schleuder/schleuder.yml'
|
|
61
68
|
ENV["SCHLEUDER_LIST_DEFAULTS"] ||= '/etc/schleuder/list-defaults.yml'
|
62
69
|
ENV["SCHLEUDER_ENV"] ||= 'production'
|
63
70
|
ENV["SCHLEUDER_ROOT"] = rootdir.to_s
|
71
|
+
# Ensure that gnupg never-ever tries to ask for a passphrase.
|
72
|
+
ENV["GPG_TTY"] = "/nonexistant-#{rand}"
|
73
|
+
ENV["DISPLAY"] = nil
|
64
74
|
|
65
75
|
GPGME::Ctx.set_gpg_path_from_env
|
66
76
|
GPGME::Ctx.check_gpg_version
|
data/lib/schleuder/cli.rb
CHANGED
data/lib/schleuder/gpgme/key.rb
CHANGED
@@ -57,6 +57,10 @@ module GPGME
|
|
57
57
|
"#{self.to_s}\n\n#{export(armor: true).read}"
|
58
58
|
end
|
59
59
|
|
60
|
+
def minimal
|
61
|
+
export(minimal: true).to_s
|
62
|
+
end
|
63
|
+
|
60
64
|
# Force encoding, some databases save "ASCII-8BIT" as binary data.
|
61
65
|
alias_method :orig_fingerprint, :fingerprint
|
62
66
|
def fingerprint
|
data/lib/schleuder/list.rb
CHANGED
@@ -19,6 +19,7 @@ module Schleuder
|
|
19
19
|
:receive_admin_only,
|
20
20
|
:keep_msgid,
|
21
21
|
:bounces_drop_all,
|
22
|
+
:deliver_selfsent,
|
22
23
|
:bounces_notify_admins,
|
23
24
|
:include_list_headers,
|
24
25
|
:include_openpgp_header,
|
@@ -146,6 +147,16 @@ module Schleuder
|
|
146
147
|
key.armored
|
147
148
|
end
|
148
149
|
|
150
|
+
def key_minimal_base64_encoded(fingerprint=self.fingerprint)
|
151
|
+
key = keys(fingerprint).first
|
152
|
+
|
153
|
+
if key.blank?
|
154
|
+
return false
|
155
|
+
end
|
156
|
+
|
157
|
+
Base64.strict_encode64(key.minimal)
|
158
|
+
end
|
159
|
+
|
149
160
|
def check_keys
|
150
161
|
now = Time.now
|
151
162
|
checkdate = now + (60 * 60 * 24 * 14) # two weeks
|
@@ -340,16 +351,24 @@ module Schleuder
|
|
340
351
|
true
|
341
352
|
end
|
342
353
|
|
343
|
-
def send_to_subscriptions(mail)
|
354
|
+
def send_to_subscriptions(mail, incoming_mail=nil)
|
344
355
|
logger.debug "Sending to subscriptions."
|
345
356
|
mail.add_internal_footer!
|
346
357
|
self.subscriptions.each do |subscription|
|
347
358
|
begin
|
348
|
-
|
349
|
-
|
350
|
-
else
|
359
|
+
|
360
|
+
if ! subscription.delivery_enabled
|
351
361
|
logger.info "Not sending to #{subscription.email}: delivery is disabled."
|
362
|
+
next
|
363
|
+
end
|
364
|
+
|
365
|
+
if ! self.deliver_selfsent && incoming_mail.was_validly_signed? && ( subscription == incoming_mail.signer )
|
366
|
+
logger.info "Not sending to #{subscription.email}: delivery of self sent is disabled."
|
367
|
+
next
|
352
368
|
end
|
369
|
+
|
370
|
+
subscription.send_mail(mail)
|
371
|
+
|
353
372
|
rescue => exc
|
354
373
|
msg = I18n.t('errors.delivery_error',
|
355
374
|
{ email: subscription.email, error: exc.to_s })
|
@@ -17,6 +17,7 @@ module Mail
|
|
17
17
|
attr_accessor :original_message
|
18
18
|
attr_accessor :list
|
19
19
|
attr_accessor :protected_headers_subject
|
20
|
+
attr_writer :dynamic_pseudoheaders
|
20
21
|
|
21
22
|
# TODO: This should be in initialize(), but I couldn't understand the
|
22
23
|
# strange errors about wrong number of arguments when overriding
|
@@ -44,9 +45,7 @@ module Mail
|
|
44
45
|
# might be gone (e.g. request-keywords that delete subscriptions or
|
45
46
|
# keys).
|
46
47
|
new.signer
|
47
|
-
self.dynamic_pseudoheaders.
|
48
|
-
new.add_pseudoheader(str)
|
49
|
-
end
|
48
|
+
new.dynamic_pseudoheaders = self.dynamic_pseudoheaders.dup
|
50
49
|
|
51
50
|
# Store previously protected subject for later access.
|
52
51
|
# mail-gpg pulls headers from the decrypted mime parts "up" into the main
|
@@ -206,11 +205,15 @@ module Mail
|
|
206
205
|
@recipient.match(/-bounce@/).present? ||
|
207
206
|
# Empty Return-Path
|
208
207
|
self.return_path.to_s == '<>' ||
|
209
|
-
# Auto-Submitted exists and does not equal 'no' and
|
210
|
-
#
|
208
|
+
# Auto-Submitted exists and does not equal 'no' and:
|
209
|
+
# - no cron header is present
|
210
|
+
# - no Jenkins job notification header is present
|
211
|
+
# as these emails have the auto-submitted header.
|
211
212
|
( self['Auto-Submitted'].present? && \
|
212
213
|
self['Auto-Submitted'].to_s.downcase != 'no' && \
|
213
|
-
!self['X-Cron-Env'].present?
|
214
|
+
!self['X-Cron-Env'].present? && \
|
215
|
+
!self['X-Jenkins-Job'].present? && \
|
216
|
+
self.subject.to_s !~ /\A\*\*\* SECURITY information.*\*\*\*\Z/)
|
214
217
|
end
|
215
218
|
|
216
219
|
def keywords
|
@@ -244,11 +247,11 @@ module Mail
|
|
244
247
|
# decide itself how to encode, it works. If we don't, some
|
245
248
|
# character-sequences are not properly re-encoded.
|
246
249
|
part.content_transfer_encoding = nil
|
247
|
-
|
248
|
-
#
|
249
|
-
|
250
|
-
|
251
|
-
part.body =
|
250
|
+
|
251
|
+
# Set the right charset on the now parsed body
|
252
|
+
new_body = lines.compact.join
|
253
|
+
part.charset = new_body.encoding.to_s
|
254
|
+
part.body = new_body
|
252
255
|
|
253
256
|
@keywords
|
254
257
|
end
|
@@ -266,20 +269,17 @@ module Mail
|
|
266
269
|
end
|
267
270
|
|
268
271
|
def add_pseudoheader(string_or_key, value=nil)
|
269
|
-
|
270
|
-
if value.present?
|
271
|
-
@dynamic_pseudoheaders << make_pseudoheader(string_or_key, value)
|
272
|
-
else
|
273
|
-
@dynamic_pseudoheaders << string_or_key.to_s
|
274
|
-
end
|
272
|
+
dynamic_pseudoheaders << make_pseudoheader(string_or_key, value)
|
275
273
|
end
|
276
274
|
|
277
275
|
def make_pseudoheader(key, value)
|
278
|
-
"#{key.to_s.camelize}: #{value.to_s}"
|
276
|
+
output = "#{key.to_s.camelize}: #{value.to_s}"
|
277
|
+
# wrap lines after 76 with 2 indents
|
278
|
+
output.gsub(/(.{1,76})( +|$)\n?/, " \\1\n").chomp.lstrip
|
279
279
|
end
|
280
280
|
|
281
281
|
def dynamic_pseudoheaders
|
282
|
-
@dynamic_pseudoheaders
|
282
|
+
@dynamic_pseudoheaders ||= []
|
283
283
|
end
|
284
284
|
|
285
285
|
def signature_state
|
@@ -330,7 +330,8 @@ module Mail
|
|
330
330
|
end
|
331
331
|
|
332
332
|
def pseudoheaders(list)
|
333
|
-
|
333
|
+
separator = '------------------------------------------------------------------------------'
|
334
|
+
(standard_pseudoheaders(list) + dynamic_pseudoheaders).flatten.join("\n") + "\n" + separator + "\n"
|
334
335
|
end
|
335
336
|
|
336
337
|
def add_msgids(list, orig)
|
@@ -345,6 +346,14 @@ module Mail
|
|
345
346
|
end
|
346
347
|
|
347
348
|
def add_list_headers(list)
|
349
|
+
if list.include_autocrypt_header
|
350
|
+
# Inject whitespaces, to let Mail break the string at these points
|
351
|
+
# leading to correct wrapping.
|
352
|
+
keydata = list.key_minimal_base64_encoded.gsub(/(.{78})/, '\1 ')
|
353
|
+
|
354
|
+
self['Autocrypt'] = "addr=#{list.email}; prefer-encrypt=mutual; keydata=#{keydata}"
|
355
|
+
end
|
356
|
+
|
348
357
|
if list.include_list_headers
|
349
358
|
self['List-Id'] = "<#{list.email.gsub('@', '.')}>"
|
350
359
|
self['List-Owner'] = "<mailto:#{list.owner_address}> (Use list's public key)"
|
@@ -1,16 +1,12 @@
|
|
1
1
|
module Schleuder
|
2
2
|
module ListPlugins
|
3
3
|
def self.attach_listkey(arguments, list, mail)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
})
|
11
|
-
mail.attachments[filename].content_type = 'application/pgp-keys'
|
12
|
-
mail.attachments[filename].content_description = "OpenPGP public key of #{list.email}"
|
13
|
-
mail.attachments[filename].content_disposition = "attachment; filename=#{filename}"
|
4
|
+
new_part = Mail::Part.new
|
5
|
+
new_part.body = list.export_key
|
6
|
+
new_part.content_type = 'application/pgp-keys'
|
7
|
+
new_part.content_description = "OpenPGP public key of #{list.email}"
|
8
|
+
new_part.content_disposition = "attachment; filename=#{list.fingerprint}.pgpkey"
|
9
|
+
mail.add_part new_part
|
14
10
|
nil
|
15
11
|
end
|
16
12
|
end
|
@@ -56,6 +56,9 @@ module Schleuder
|
|
56
56
|
|
57
57
|
# Only continue if all recipients are still here.
|
58
58
|
if recip_map.size < arguments.size
|
59
|
+
recip_map.keys.each do |aborted_sender|
|
60
|
+
mail.add_pseudoheader(:error, I18n.t("plugins.resend.aborted", email: aborted_sender))
|
61
|
+
end
|
59
62
|
return
|
60
63
|
end
|
61
64
|
|
@@ -117,22 +120,22 @@ module Schleuder
|
|
117
120
|
Array(recipients).inject({}) do |hash, email|
|
118
121
|
keys = mail.list.keys(email)
|
119
122
|
# Exclude unusable keys.
|
120
|
-
keys.select
|
121
|
-
case
|
123
|
+
usable_keys = keys.select { |key| key.usable_for?(:encrypt) }
|
124
|
+
case usable_keys.size
|
122
125
|
when 1
|
123
|
-
hash[email] =
|
126
|
+
hash[email] = usable_keys.first
|
124
127
|
when 0
|
125
128
|
if encrypted_only
|
126
129
|
# Don't add the email to the result to exclude it from the
|
127
130
|
# recipients.
|
128
|
-
|
131
|
+
add_resend_msg(mail, email, :error, 'not_resent_no_keys', usable_keys.size, keys.size)
|
129
132
|
else
|
130
133
|
hash[email] = ''
|
131
134
|
end
|
132
135
|
else
|
133
136
|
# Always report this situation, regardless of sending or not. It's
|
134
137
|
# bad and should be fixed.
|
135
|
-
|
138
|
+
add_resend_msg(mail, email, :notice, 'not_resent_encrypted_no_keys', usable_keys.size, keys.size)
|
136
139
|
if ! encrypted_only
|
137
140
|
hash[email] = ''
|
138
141
|
end
|
@@ -152,8 +155,8 @@ module Schleuder
|
|
152
155
|
gpg_opts
|
153
156
|
end
|
154
157
|
|
155
|
-
def self.
|
156
|
-
mail.add_pseudoheader(
|
158
|
+
def self.add_resend_msg(mail, email, severity, msg, usable_keys_size, all_keys_size)
|
159
|
+
mail.add_pseudoheader(severity, I18n.t("plugins.resend.#{msg}", email: email, usable_keys: usable_keys_size, all_keys: all_keys_size))
|
157
160
|
end
|
158
161
|
|
159
162
|
def self.add_error_header(mail, recipients_map)
|
@@ -163,15 +166,15 @@ module Schleuder
|
|
163
166
|
def self.add_resent_headers(mail, recipients_map, to_or_cc, sent_encrypted)
|
164
167
|
if sent_encrypted
|
165
168
|
prefix = I18n.t('plugins.resend.encrypted_to')
|
166
|
-
str = recipients_map.map do |email, key|
|
169
|
+
str = "\n" + recipients_map.map do |email, key|
|
167
170
|
"#{email} (#{key.fingerprint})"
|
168
|
-
end.join(
|
171
|
+
end.join(",\n")
|
169
172
|
else
|
170
173
|
prefix = I18n.t('plugins.resend.unencrypted_to')
|
171
|
-
str = recipients_map.keys.join(
|
174
|
+
str = ' ' + recipients_map.keys.join(", ")
|
172
175
|
end
|
173
176
|
headername = resent_header_name(to_or_cc)
|
174
|
-
mail.add_pseudoheader(headername, "#{prefix}
|
177
|
+
mail.add_pseudoheader(headername, "#{prefix}#{str}")
|
175
178
|
end
|
176
179
|
|
177
180
|
def self.resent_header_name(to_or_cc)
|
data/lib/schleuder/runner.rb
CHANGED
@@ -5,15 +5,43 @@ module Schleuder
|
|
5
5
|
return error if error
|
6
6
|
|
7
7
|
logger.info "Parsing incoming email."
|
8
|
+
|
9
|
+
# is it valid utf-8?
|
10
|
+
msg_scrubbed = false
|
11
|
+
unless msg.valid_encoding?
|
12
|
+
logger.warn "Converting message due to invalid characters"
|
13
|
+
detection = CharlockHolmes::EncodingDetector.detect(msg)
|
14
|
+
begin
|
15
|
+
msg = CharlockHolmes::Converter.convert(msg, detection[:encoding], 'UTF-8')
|
16
|
+
rescue ArgumentError
|
17
|
+
# it looks like even icu wasn't able to convert
|
18
|
+
# so we scrub the invalid characters to be able to
|
19
|
+
# at least parse the message somehow. Though this might
|
20
|
+
# result in data loss.
|
21
|
+
logger.warn "Scrubbing message due to invalid characters"
|
22
|
+
msg = msg.scrub
|
23
|
+
msg_scrubbed = true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
8
27
|
@mail = Mail.create_message_to_list(msg, recipient, list)
|
9
28
|
|
29
|
+
if msg_scrubbed
|
30
|
+
@mail.add_pseudoheader(:note, I18n.t("pseudoheaders.scrubbed_message"))
|
31
|
+
end
|
32
|
+
|
10
33
|
error = run_filters('pre')
|
11
34
|
return error if error
|
12
35
|
|
13
36
|
begin
|
14
37
|
# This decrypts, verifies, etc.
|
15
38
|
@mail = @mail.setup
|
16
|
-
|
39
|
+
|
40
|
+
rescue GPGME::Error::BadPassphrase,
|
41
|
+
GPGME::Error::DecryptFailed,
|
42
|
+
GPGME::Error::NoData,
|
43
|
+
GPGME::Error::NoSecretKey
|
44
|
+
|
17
45
|
logger.warn "Decryption of incoming message failed."
|
18
46
|
return Errors::DecryptionFailed.new(list)
|
19
47
|
end
|
@@ -46,7 +74,7 @@ module Schleuder
|
|
46
74
|
# Subscriptions
|
47
75
|
logger.debug "Creating clean copy of message"
|
48
76
|
copy = @mail.clean_copy(list.headers_to_meta.any?)
|
49
|
-
list.send_to_subscriptions(copy)
|
77
|
+
list.send_to_subscriptions(copy, @mail)
|
50
78
|
nil
|
51
79
|
end
|
52
80
|
|
data/lib/schleuder/version.rb
CHANGED
data/locales/de.yml
CHANGED
@@ -121,7 +121,9 @@ de:
|
|
121
121
|
Oder, um einen Schlüssel per HTTP von einem Server zu laden:
|
122
122
|
X-FETCH-KEY: https://example.org/keys/mykey.asc
|
123
123
|
resend:
|
124
|
-
not_resent_no_keys: Resending an <%{email}> fehlgeschlagen (%{
|
124
|
+
not_resent_no_keys: Resending an <%{email}> fehlgeschlagen (%{all_keys} Schlüssel gefunden, davon %{usable_keys} nutzbar. Unverschlüsseltes Senden verboten).
|
125
|
+
not_resent_encrypted_no_keys: Verschlüsseltes Resending an <%{email}> fehlgeschlagen (%{all_keys} Schlüssel gefunden, davon %{usable_keys} nutzbar).
|
126
|
+
aborted: Resending an <%{email}> abgebrochen aufgrund anderer Probleme.
|
125
127
|
encrypted_to: Verschlüsselt an
|
126
128
|
unencrypted_to: Unverschlüsselt an
|
127
129
|
invalid_recipient: "Ungültige Emailadresse für resend: %{address}"
|
@@ -250,6 +252,7 @@ de:
|
|
250
252
|
fetch_key:
|
251
253
|
invalid_input: "Ungültige Angabe. Gültig sind: URLs, OpenPGP-Fingerabdrücke, oder Emailadressen."
|
252
254
|
pseudoheaders:
|
255
|
+
scrubbed_message: Diese Email enthielt ungültige Zeichen, die aus Verarbeitungsgründen möglicherweise entfernt wurden.
|
253
256
|
stripped_html_from_multialt: Diese Email enthielt einen alternativen HTML-Teil, der PGP-Daten beinhaltete. Der HTML-Teil wurde entfernt, um die Email sauberer analysieren zu können.
|
254
257
|
stripped_html_from_multialt_with_keywords: Diese Email enthielt Schlüsselwörter und einen alternativen HTML-Teil. Der HTML-Teil wurde entfernt, um zu verhindern dass diese Schlüsselwörter Aussenstehenden bekannt werden.
|
255
258
|
signature_states:
|
data/locales/en.yml
CHANGED
@@ -125,7 +125,9 @@ en:
|
|
125
125
|
Or, to fetch a key keys by URL:
|
126
126
|
X-FETCH-KEY: https://example.org/keys/mykey.asc
|
127
127
|
resend:
|
128
|
-
not_resent_no_keys: Resending to <%{email}> failed (%{
|
128
|
+
not_resent_no_keys: Resending to <%{email}> failed (%{all_keys} keys found, of which %{usable_keys} can be used. Unencrypted sending not allowed).
|
129
|
+
not_resent_encrypted_no_keys: Resending as encrypted email to <%{email}> failed (%{all_keys} keys found, of which %{usable_keys} can be used).
|
130
|
+
aborted: Resending to <%{email}> aborted due to other errors.
|
129
131
|
encrypted_to: Encrypted to
|
130
132
|
unencrypted_to: Unencrypted to
|
131
133
|
invalid_recipient: "Invalid email-address for resending: %{address}"
|
@@ -254,6 +256,7 @@ en:
|
|
254
256
|
fetch_key:
|
255
257
|
invalid_input: "Invalid input. Allowed are: URLs, OpenPGP-fingerprints, or email-addresses."
|
256
258
|
pseudoheaders:
|
259
|
+
scrubbed_message: This message included invalid characters, which might have been removed to be able to process the message properly.
|
257
260
|
stripped_html_from_multialt: This message included an alternating HTML-part that contained PGP-data. The HTML-part was removed to enable parsing the message more properly.
|
258
261
|
stripped_html_from_multialt_with_keywords: This message included keywords and an alternating HTML-part. The HTML-part was removed to prevent the disclosure of these keywords to third parties.
|
259
262
|
signature_states:
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schleuder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- schleuder dev team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gpgme
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '2.0'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 2.0.
|
22
|
+
version: 2.0.19
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '2.0'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 2.0.
|
32
|
+
version: 2.0.19
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: mail
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -51,9 +51,9 @@ dependencies:
|
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0.3'
|
54
|
-
- - "
|
54
|
+
- - "<"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 0.
|
56
|
+
version: 0.4.3
|
57
57
|
type: :runtime
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -61,9 +61,9 @@ dependencies:
|
|
61
61
|
- - "~>"
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: '0.3'
|
64
|
-
- - "
|
64
|
+
- - "<"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: 0.
|
66
|
+
version: 0.4.3
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
68
|
name: activerecord
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -176,6 +176,20 @@ dependencies:
|
|
176
176
|
- - "~>"
|
177
177
|
- !ruby/object:Gem::Version
|
178
178
|
version: '1'
|
179
|
+
- !ruby/object:Gem::Dependency
|
180
|
+
name: charlock_holmes
|
181
|
+
requirement: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - "~>"
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: 0.7.6
|
186
|
+
type: :runtime
|
187
|
+
prerelease: false
|
188
|
+
version_requirements: !ruby/object:Gem::Requirement
|
189
|
+
requirements:
|
190
|
+
- - "~>"
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: 0.7.6
|
179
193
|
- !ruby/object:Gem::Dependency
|
180
194
|
name: rspec
|
181
195
|
requirement: !ruby/object:Gem::Requirement
|
@@ -275,6 +289,8 @@ files:
|
|
275
289
|
- db/migrate/20160501172700_fix_headers_to_meta_defaults.rb
|
276
290
|
- db/migrate/20170713215059_add_internal_footer_to_list.rb
|
277
291
|
- db/migrate/20180110203100_add_sig_enc_to_headers_to_meta_defaults.rb
|
292
|
+
- db/migrate/20180723173900_add_deliver_selfsent_to_list.rb
|
293
|
+
- db/migrate/20190906194820_add_autocrypt_header_to_list.rb
|
278
294
|
- db/schema.rb
|
279
295
|
- etc/init.d/schleuder-api-daemon
|
280
296
|
- etc/list-defaults.yml
|
@@ -391,7 +407,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
391
407
|
- !ruby/object:Gem::Version
|
392
408
|
version: '0'
|
393
409
|
requirements: []
|
394
|
-
rubyforge_project:
|
410
|
+
rubyforge_project:
|
395
411
|
rubygems_version: 2.7.6.2
|
396
412
|
signing_key:
|
397
413
|
specification_version: 4
|