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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3127723694c9320dbc25abc2bd7d5de2a0ca22d587c794bb36be5ae09fdf63f0
4
- data.tar.gz: dfdcd502ca1498883cd931004034c7c4f8874271c06499bc39591cba407130a8
3
+ metadata.gz: 49f682bc409302cde8907906dbbbab0238d4e404748874b5c3b263806b70abbe
4
+ data.tar.gz: c47b37fc7c1dede5b95bd396ceef0642cf5061af574a589b84497e01d1f7dcf8
5
5
  SHA512:
6
- metadata.gz: 31e3a5ed4c50043c7f0324f60595023cfc51766eca36aae32d326cffdcb81f09a3ad4798d4a96e43e99d67b768ab620dfe5b686ce95aeb5132f02e674cbc483a
7
- data.tar.gz: bf93269f6737cfa57ce71474e15275e2379ea9c45cfc680698912d68674d0bd39a0d855ebbf09b59bdc00165948c81bc037b109012fd1b6b4a86f1664a9fcbb7
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.4.1.gem) and [the OpenPGP-signature](https://schleuder.org/download/schleuder-3.4.1.gem.sig) and verify:
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.4.1.gem.sig
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.4.1.gem
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/#setup>.
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.4.1.tar.gz) and [its OpenPGP-signature](https://schleuder.org/download/schleuder-3.4.1.tar.gz.sig).
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 #{project}/version.rb?"
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
@@ -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: 20180110203100) do
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|
@@ -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
@@ -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
@@ -1,6 +1,7 @@
1
1
  require 'thor'
2
2
  require 'yaml'
3
3
  require 'gpgme'
4
+ require 'charlock_holmes'
4
5
 
5
6
  require_relative '../schleuder'
6
7
  require 'schleuder/cli/subcommand_fix'
@@ -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
@@ -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
- if subscription.delivery_enabled
349
- subscription.send_mail(mail)
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 })
@@ -42,6 +42,8 @@ module Schleuder
42
42
  gpg_opts.merge!(encrypt: true, keys: { address => key.fingerprint })
43
43
  end
44
44
  mail.gpg gpg_opts
45
+
46
+ mail.header['List-Id'] = "<#{@list.email.gsub('@', '.')}>"
45
47
  end
46
48
  mail.deliver
47
49
  end
@@ -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.each do |str|
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 no cron header
210
- # present, as cron emails have the auto-submitted header.
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
- # Make the converted strings (now UTF-8) match what mime-part's headers say,
248
- # fall back to US-ASCII if none is set.
249
- # https://tools.ietf.org/html/rfc2046#section-4.1.2
250
- # -> Default charset is US-ASCII
251
- part.body = lines.compact.join.encode(part.charset||'US-ASCII')
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
- @dynamic_pseudoheaders ||= []
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
- (standard_pseudoheaders(list) + dynamic_pseudoheaders).flatten.join("\n") + "\n"
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
- filename = "#{list.fingerprint}.pgpkey"
5
- # "Mail" only really converts to multipart if the content-type is blank.
6
- mail.content_type = nil
7
- mail.add_file({
8
- filename: filename,
9
- content: list.export_key
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! { |key| key.usable_for?(:encrypt) }
121
- case keys.size
123
+ usable_keys = keys.select { |key| key.usable_for?(:encrypt) }
124
+ case usable_keys.size
122
125
  when 1
123
- hash[email] = keys.first
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
- add_keys_error(mail, email, keys.size)
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
- add_keys_error(mail, email, keys.size)
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.add_keys_error(mail, email, keys_size)
156
- mail.add_pseudoheader(:error, I18n.t("plugins.resend.not_resent_no_keys", email: email, num_keys: keys_size))
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} #{str}")
177
+ mail.add_pseudoheader(headername, "#{prefix}#{str}")
175
178
  end
176
179
 
177
180
  def self.resent_header_name(to_or_cc)
@@ -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
- rescue GPGME::Error::DecryptFailed
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
 
@@ -1,3 +1,3 @@
1
1
  module Schleuder
2
- VERSION = '3.4.1'
2
+ VERSION = '3.5.0'
3
3
  end
@@ -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 (%{num_keys} Schlüssel gefunden und unverschlüsseltes Senden verboten).
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:
@@ -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 (%{num_keys} keys found and unencrypted sending disallowed).
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.1
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: 2019-09-16 00:00:00.000000000 Z
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.13
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.13
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.3.3
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.3.3
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: "[none]"
410
+ rubyforge_project:
395
411
  rubygems_version: 2.7.6.2
396
412
  signing_key:
397
413
  specification_version: 4